我有一张road_vertices桌子:
create table road_vertices
(
road_id number,
vertex_index number,
x number,
y number
);
insert into road_vertices values ('100',1,0,5);
insert into road_vertices values ('100',2,10,10);
insert into road_vertices values ('100',3,30,0);
insert into road_vertices values ('100',4,50,10);
insert into road_vertices values ('100',5,60,10);
select * from road_vertices;
ROAD_ID VERTEX_INDEX X Y
---------- --------------- ---------- ----------
100 1 0 5
100 2 10 10
100 3 30 0
100 4 50 10
100 5 60 10
Run Code Online (Sandbox Code Playgroud)
我需要:
这是最终目标:
ROAD_ID LINESTRING
---------------------------------------------------------------------------- …Run Code Online (Sandbox Code Playgroud) 我正在 mysql 8 上尝试以下插入查询。
Insert Into fence Set
fenceName='aa',
radius=2,
fenceGeometry=ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326)
Run Code Online (Sandbox Code Playgroud)
它在 mysql 5.7 上完美运行,但在 mysql 8 中我得到了这个 error Latitude 102.189331 is out of range in function st_geomfromtext. It must be within [-90.000000, 90.000000].
根据一些建议,我也这样做了。
ALTER TABLE fence MODIFY fenceGeometry geometry NOT NULL SRID 4326;
Run Code Online (Sandbox Code Playgroud)
但是它给了我相同的结果。
对于查找最近邻居之类的事情,我可以理解 R=Tree 可以胜过 B-Tree。R-Tree 可以踢出更明显的假点。
然而,对于矩形中的一个点的简单检查,它是有效的
分钟
如果 x 和 y 由 b 树索引,它们也可以剔除很多假点。
所以我做了一个空间索引的实验
SELECT DISTINCT
TB.ID,
TB.Latitude,
TB.Longitude,
111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
`tablebusiness` AS TB
join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
MBRContains(
GeomFromText ('MULTIPOINT(-6.2317830813328 106.72621691867,-6.1382169186672 106.81978308133)'),
TA.Latlong
)
AND
MATCH (FullTextSearch) AGAINST ('kucing*' IN BOOLEAN MODE)
ORDER BY
Distance
LIMIT
0, 20
Run Code Online (Sandbox Code Playgroud)
这是相当快的。.24 秒
然后我做
SELECT DISTINCT
TB.ID,
TB.Latitude,
TB.Longitude,
111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
`tablebusiness` AS TB
join tableauxiliary as TA
WHERE
-6.2317830813328 < TB.Latitude
AND
TB.Latitude …Run Code Online (Sandbox Code Playgroud) PostgreSQL有没有geohash实现?我找不到任何。
我正在编写一个 PL/pgSQL 函数,它为我需要检查它是否返回某些内容的查询创建一个游标。
我正在做的是这样的:
我发现,检查,如果该查询返回的东西用光标是最好的选择,因为它(加入5个表和大量列)一个很长的查询和SELECT ... INTO不正确的顺心,因为我必须创建一个TYPE自查询具有来自一个表的列和用于距离计算的列。
问题是我目前仅使用游标来检查查询是否在我打开和关闭它的循环中返回了某些内容。一旦查询返回某些内容,我就退出循环并返回查询。我可以马上说,这是我需要的丑陋的解决方法。也许有人可以帮助我解决这个问题。
这是一些显示我目前正在做的事情的代码。
CREATE FUNCTION store_distance(
latitude double precision,
longitude double precision,
radius double precision,
tries integer
)
RETURNS TABLE(
store_id store.id%type,
store_name store.name%type,
distance double precision
)
AS
$$
DECLARE
cur_stores CURSOR FOR
SELECT
store.id,
store.name,
get_distance(latitude, longitude, store.latitude, store.longitude) distance
FROM
store
WHERE
store.latitude BETWEEN (latitude - radius) AND (latitude + radius)
AND store.longitude BETWEEN (longitude - radius) AND (longitude + radius)
ORDER BY …Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2016 并且我有一个 Trajectory 表和一个 TrajectoryPoint 表。一个轨迹由多个轨迹点组成,一个轨迹点只与一个轨迹相关。每个轨迹点都有许多值,例如位置、时间戳、速度、SSR 代码等。
这是当前的轨迹表(简化版):
CREATE TABLE [dbo].[Trajectory](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TypeId] [tinyint] NOT NULL,
[TimeOverFir] [time](7) NULL,
[DistanceOverFir] [float] NULL,
[FlightRules] [nvarchar](1) NULL,
[LinkInfoId] [int] NULL,
[StateId] [int] NOT NULL,
[CO2Emission] [float] NULL,
[FuelConsumption] [float] NULL,
[Flight_Id] [int] NULL,
CONSTRAINT [PK_dbo.Trajectory] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
这是当前的轨迹点表(简化版):
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 跑步mariadb,我得到
错误 1305 (42000):FUNCTION
ST_Distance_Sphere不存在
当我运行一个基本查询时
SELECT ST_Distance_Sphere( POINT(0,0), POINT(0,1) );
Run Code Online (Sandbox Code Playgroud)
但是,我使用的是一个相当新的版本。
Server version: 10.1.25-MariaDB-1 Ubuntu 17.10
Run Code Online (Sandbox Code Playgroud)
这里发生了什么。
我使用以下代码在 SQL Server 2008 R2 中创建空间索引:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE SPATIAL INDEX SPATIAL_COMPANIES_GEO ON dbo.ITEMS(GEO) USING GEOGRAPHY_GRID
WITH(
GRIDS = ( LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH)
, CELLS_PER_OBJECT = 100
, STATISTICS_NORECOMPUTE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON
)
GO
ALTER TABLE dbo.COMPANIES SET (LOCK_ESCALATION …Run Code Online (Sandbox Code Playgroud) 我有一个经常更新影响某些几何图形的事件的表。几何区域是固定的,但可能有一个事件同时影响多个区域,因此两者之间存在多对多的关系。单个区域也可能同时受到多个事件的影响。
例如:
| 事件ID | 区域编号 |
|---|---|
| 1 | 15 |
| 1 | 31 |
| 2 | 46 |
| 3 | 46 |
| 3 | 55 |
| 4 | 15 |
这些区域在我的表中表示为 ID 值。我需要在空间上表示这些值,因此我需要将这些值连接到包含s 和几何图形的event_id and area_id查找表。area_id不幸的是,这些表位于同一 SQL Server 2014 实例上的两个独立数据库中。
问题是这个连接过程非常慢;返回 18k-24k 行需要 90 秒到 3 分钟不等,具体取决于当前有多少事件处于活动状态。几何查找表包含 84k 行。
事件表结构(为了简单起见,删除了一些附加列):
USE Events_DB;
CREATE TABLE [dbo].[Events](
[EVENTS_ID] [bigint] NOT NULL,
[AREA_ID] [bigint] NOT NULL,
[START_DATE_TIME] [smalldatetime] NULL,
[END_DATE_TIME] [smalldatetime] NULL,
CONSTRAINT [PK_Events] PRIMARY KEY CLUSTERED
(
[EVENTS_ID] ASC,
[AREA_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS …Run Code Online (Sandbox Code Playgroud) sql-server execution-plan spatial sql-server-2014 query-performance
spatial ×10
postgresql ×2
sql-server ×2
aggregate ×1
aws ×1
dynamodb ×1
geometry ×1
index ×1
mariadb ×1
mysql ×1
mysql-8.0 ×1
oracle ×1
oracle-12c ×1
performance ×1
plpgsql ×1
postgis ×1
python ×1