标签: spatial

这个查询可以简化吗?计算线段的累积长度并将坐标折叠成线串

在此处输入图片说明

我有一张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)

我需要:

  1. 计算线段的累积长度(如上图中灰色文本所示)。
  2. 将坐标和累积长度折叠成线串。

这是最终目标:

ROAD_ID     LINESTRING
---------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

oracle aggregate spatial oracle-12c

5
推荐指数
1
解决办法
247
查看次数

Mysql 8 ST_GeomFromText 在函数 st_geomfromtext 中给出错误纬度超出范围。它必须在 [-90.000000, 90.000000] 内

我正在 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)

但是它给了我相同的结果。

spatial geometry mysql-8.0

5
推荐指数
1
解决办法
1518
查看次数

R-Tree 如何在简单检查点是否在矩形内优于 B-Tree

对于查找最近邻居之类的事情,我可以理解 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)

mysql spatial

4
推荐指数
1
解决办法
1058
查看次数

4
推荐指数
1
解决办法
2060
查看次数

仅当查询结果不为 NULL 时如何正确返回查询结果?

我正在编写一个 PL/pgSQL 函数,它为我需要检查它是否返回某些内容的查询创建一个游标。

我正在做的是这样的:

  1. 运行查询
  2. 检查它是否返回一些东西。
  3. 如果没有,请将参数加倍并再次运行查询。
  4. 否则,返回查询中的所有行。

我发现,检查,如果该查询返回的东西用光标是最好的选择,因为它(加入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)

postgresql performance spatial plpgsql query-performance

4
推荐指数
1
解决办法
2998
查看次数

如何存储有关 SQL Server 地理线串每个点的附加信息?

我正在使用 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)

sql-server spatial sql-server-2016

4
推荐指数
1
解决办法
467
查看次数

MariaDB 是否支持 ST_Distance_Sphere?

跑步mariadb,我得到

错误 1305 (42000):FUNCTIONST_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)

这里发生了什么。

mariadb spatial

4
推荐指数
1
解决办法
4794
查看次数

创建空间索引会锁定表数小时

我使用以下代码在 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)

index sql-server-2008-r2 spatial

3
推荐指数
1
解决办法
371
查看次数

将 AWS DynamoDB 地理空间索引与 Python 结合使用

亚马逊的 AWS DynamoDB 具有地理空间索引功能,可促进地理查询:

查询支持:框查询返回落在一对地理点内的项目,这些地理点定义了投影到球体上的矩形。Radius 查询返回距离地理点给定距离内的项目。

问题在于boto,用于访问 AWS 服务的 Python 库,缺少对 geo 对象的任何引用。另一方面,Java 等价物具有这样的支持

有没有办法使用 Python 在 AWS 上使用 DynamoDB 的地理功能?

spatial aws python dynamodb

3
推荐指数
1
解决办法
3702
查看次数

将非空间表与非空间列上的空间表连接时提高查询响应速度

我有一个经常更新影响某些几何图形的事件的表。几何区域是固定的,但可能有一个事件同时影响多个区域,因此两者之间存在多对多的关系。单个区域也可能同时受到多个事件的影响。

例如:

事件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

3
推荐指数
1
解决办法
125
查看次数