标签: spatial

空间数据建模工具

有没有像 PostGIS 的 MySQL 工作台之类的东西?支持 SQL 输出和几何类型的东西会很好。


澄清:

我正在尝试实施土地管理领域模型,但我得到的只是规格(UML 图)。我需要一个可以创建模型和输出代码来创建表格的工具。它需要支持几何类型,因为 LADM 处理地块。

database-design spatial

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

空间查询结果的可视化工具

这个问题什么是将 sql 08 空间数据放到地图上的最简单方法?(以及许多其他文章)推荐 Craig Dunn 的 Geoquery,但所有下载链接似乎都已失效。

SQL Server Managament Studio 的空间结果选项卡将显示单个数据集,这篇 MSDN 文章SQL Server 2008中的空间数据支持提到了一种UNION ALL用于显示叠加在地图上的点数据的解决方法:

SELECT geog, name FROM Mondial.dbo.city WHERE geog IS NOT NULL 
UNION ALL 
SELECT geog, cntry_name FROM SpatialSamples.dbo.cntry00
Run Code Online (Sandbox Code Playgroud)

每当我尝试类似的事情时,我只会显示一个结果集。

SQL Server 2008 或 2012 中是否有内置的东西来做到这一点?

sql-server-2008 sql-server spatial

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

Postgres 中空间查询的 3d 点数据的良好布局?

就像另一个问题所示,我在 3D 空间中处理了很多(> 10,000,000)个点条目。这些点定义如下:

CREATE TYPE float3d AS (
  x real,
  y real,
  z real);
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,需要 3*8 字节 + 8 字节填充(MAXALIGN是 8)来存储这些点之一。有没有更好的方法来存储这种数据?在前面提到的问题中,有人指出复合类型涉及相当多的开销。

我经常做这样的空间查询:

  SELECT t1.id, t1.parent_id, (t1.location).x, (t1.location).y, (t1.location).z,
         t1.confidence, t1.radius, t1.skeleton_id, t1.user_id,
         t2.id, t2.parent_id, (t2.location).x, (t2.location).y, (t2.location).z,
         t2.confidence, t2.radius, t2.skeleton_id, t2.user_id
  FROM treenode t1
       INNER JOIN treenode t2 ON
         (   (t1.id = t2.parent_id OR t1.parent_id = t2.id)
          OR (t1.parent_id IS NULL AND t1.id = t2.id))
        WHERE (t1.LOCATION).z = 41000.0
          AND (t1.LOCATION).x > 2822.6
          AND (t1.LOCATION).x …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes spatial composite-types

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

Spatialite:使用虚拟空间索引来计算距离

我目前正在学习使用空间访问方法进行查询优化。我正在阅读空间食谱中的示例并被困在这里 http://www.gaia-gis.it/gaia-sins/spatialite-cookbook/html/pp-adjacent.html

根据教程,为了找到距离小于 1 公里的人口对,我们必须执行此查询

    SELECT pp1.name AS "PopulatedPlace #1",
      GeodesicLength(MakeLine(pp1.geometry, pp2.geometry)) AS "Distance (meters)",
      pp2.name AS "PopulatedPlace #2"
    FROM populated_places AS pp1,
    populated_places AS pp2
    WHERE GeodesicLength(
      MakeLine(pp1.geometry, pp2.geometry)) < 1000.0
      AND pp1.id <> pp2.id
    AND pp2.ROWID IN (
      SELECT pkid
      FROM idx_populated_places_geometry
      WHERE pkid MATCH RTreeDistWithin(
       ST_X(pp1.geometry),
       ST_Y(pp1.geometry), 0.02))
    ORDER BY 2;
Run Code Online (Sandbox Code Playgroud)

由于不再使用地理回调函数 RTree*** 而引发错误。我检查了这个更新,这已被虚拟空间索引的使用所取代。我们必须使用表单的子查询

    SELECT ROWID
    FROM SpatialIndex
    WHERE
       f_table_name = <table_name>
       AND search_frame = <some_geometry>
Run Code Online (Sandbox Code Playgroud)

所以我测试了这个

    SELECT pp1.name AS "PopulatedPlace #1",
      GeodesicLength(MakeLine(pp1.geometry, pp2.geometry)) AS "Distance (meters)", …
Run Code Online (Sandbox Code Playgroud)

sqlite subquery spatial

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

一个位置的最小距离;一个点表与一组点 SQL 2012 相比

我试图找到找到一个点到点表的最小距离的最快方法。唯一需要注意的是,我试图找到最小距离的点表是 150K 单点。

或者更好地解释表 A 有 150K 行/点,表 B 1500 点。我想知道表 A 中的每一行与表 B 中列出的所有行的最小距离是多少。

我有一个进行距离计算的函数,作为表 A 的附加列。它只需要很长时间。表 B 有一个空间索引。

这就是我所拥有的:

select a.*, 
       dbo.fxn_distance(geography::STPointFromText('POINT(' + 
       CAST([Long] AS VARCHAR(20)) + ' ' + CAST([Lat] AS 
       VARCHAR(20)) +    ')', 4326)) as DistAway
from Table A a
Run Code Online (Sandbox Code Playgroud)

我的功能:

create function fxn_distance
(@pointTableA geography
)
returns float 
as 
begin

declare @distance float

select top 1 @distance = b.GeoLocation.STDistance(@pointTableA) 
from TableB b  
where geolocation.STDistance(@pointTableA) is not null
order by geolocation.STDistance(@pointTableA)

return @distance
end
Run Code Online (Sandbox Code Playgroud)

对不起,如果我完全是一个新手,我知道解决方案可能很简单,但我无法解决这个问题。所以希望澄清一下:我需要通过表 A …

sql-server t-sql sql-server-2012 spatial

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

优化两个巨大空间表之间的 Intersect 查询

我在尝试改进两个空间表之间的交集时遇到了困难,我想收到有关表设计、查询或 dba 配置的任何提示。

表格:

表现在teste.recorte_grade有 1,655,569 行,但这是为 900 万行表的测试制作的子样本。

CREATE TABLE teste.recorte_grade
(
  id integer NOT NULL DEFAULT nextval('teste."Recorte_grade_id_seq"'::regclass),
  id_gre character varying(21),
  indice_gre character varying(16),
  the_geom geometry(Polygon),
  CONSTRAINT "Recorte_grade_pkey" PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
CREATE INDEX sidx_recorte_grade_geom
  ON teste.recorte_grade
  USING gist
  (the_geom);
Run Code Online (Sandbox Code Playgroud)

teste2.uso_2012有 177,888 行,这是它将永远拥有的所有数据。

CREATE TABLE teste2.uso_2012
(
  id integer NOT NULL,
  gridcode smallint NOT NULL,
  geom geometry(MultiPolygon) NOT NULL,
  CONSTRAINT pk_id_uso_2012 PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);    
CREATE INDEX …
Run Code Online (Sandbox Code Playgroud)

postgresql performance spatial postgis query-performance

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

版本控制:除了空间之外,该技术是否用于 DBMS?

ESRI 的空间数据库管理系统称为地理数据库( more ),使用一种称为版本控制的技术

版本代表整个地理数据库的时间快照,并包含地理数据库中的所有数据集。

版本不是地理数据库的单独副本。相反,版本和其中发生的事务在系统表中进行跟踪。这将用户的工作隔离在多个编辑会话中,允许用户在不锁定生产版本中的功能或立即影响其他用户且无需制作数据副本的情况下进行编辑。

状态树 http://help.arcgis.com/en/geodatabase/10.0/sdk/arcsde/concepts/versioning/basicprinciples/state.htm

将数据集(要素类、要素数据集或表)注册为版本时,会创建两个增量表:A(或添加)表,记录插入和更新,D(或删除)表,存储删除。每次更新或删除数据集中的记录时,都会向其中一个或两个表中添加行。因此,版本化数据集由原始表(称为基本表或业务表)加上增量表中的任何更改组成。当您进行填充增量表的编辑时,地理数据库会跟踪您连接到的版本。当您查询或显示某个版本中的数据集时,ArcGIS 会组合原始表和增量表中的相关行,以提供该版本数据的无缝视图。

在此处输入图片说明

老实说,我发现文档相当模糊;它并没有告诉我该技术的实际工作原理,或者它基于传统数据库理论的哪一部分。

我想不会有很多 DBA SE 社区成员对 ESRI 的版本控制技术有经验。所以我不会问诸如“它是如何工作的?”之类的问题。

相反,我想知道,在非空间数据库世界中是否有与 ESRI 版本控制类似的技术?

spatial data-versioning

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

存储几何和地理或存储一个并计算另一个?

我刚刚开始设计我的第一个 GIS 数据库,使用 PostGIS / PostgreSQL,我有一个关于几何和地理的问题,特别是存储几何是否更有效(因为它支持更多功能)然后在我需要时投影到地理它,或者我是否应该同时存储几何和重新投影的地理?

更详细地说,数据库将填充包含英国国家网格 (EPSG:27700) (OSGR) 和转换后的 WGS84 (EPSG:4326) 值的预先存在的数据,并且该数据将定期更新来自外部资源。这将争论两列,因为我不需要进行计算。

展望未来,我希望允许使用 OSM 或文本输入作为 OSGR 或通过 GPS 坐标通过“指向并单击”基于 Web 的地图应用程序编辑数据。搜索设施也将允许 OSGR 或纬度/经度。有两列意味着我总是必须至少对输入执行一次计算(尽管不是搜索),而只有一列意味着我有时可能需要计算输入,再次可能需要计算搜索。

我想我已经说服自己在我的表中同时需要几何和地理列(可能还需要每个列的投影列,以便我可以在未来的某个时间处理爱尔兰),但这是否明智?

谢谢。

postgresql spatial postgis

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

我应该为地理位置点创建一个单独的表吗?

我正在为在某些方面类似于 Uber 的服务开发后端(只是为您提供一般上下文的简化)。用户将预订乘车,因此用户将定义接送地点。这些位置将是一个城市的地址(未来可能会有多个城市)。我将从前端/应用程序收到的位置将采用纬度、经度和 google-maps-verified 地址的形式。

我想知道我是否应该将这些位置存储为一个单独的表,或者我是否应该将这些位置嵌入到我需要它们的任何表中。例如,bookings桌子将有一个上车地点和一个下车地点。这些应该只是对locations表的引用,还是应该添加更多列来存储位置?我将需要每个位置至少 3 列(纬度、长度、地址字符串),如果我们决定将街道地址分解为更多组件,则可能会有更多列。

我认为这两种方法在内存和时间性能之间进行权衡:

  • 单独的表将节省一些空间,因为我们避免多次复制相同的信息。但我不确定会节省多少空间,因为我们还没有足够的真实数据。我的大致估计是,一个中等规模的城市有数以万计的唯一地址。因此,如果我们进行 100 次乘车预订,则重叠的可能性很小。如果我们有 100,000 个乘车预订,那么肯定会有相当多的重叠。然而,空间并不是我们设计的真正限制因素,即使有数百万的预订。如果我们在数据库中多花 100MB,这并不重要。
  • 单独的表会使处理速度变慢。首先,每次我们收到预订请求时,我们都必须搜索请求中的位置是否已存在于我们的数据库中。如果没有,我们添加它们,否则我们使用现有的引用。由于我们的数据库中可能有数万个地址,这将需要一些时间。与我们其他耗时的任务相比,这额外的时间是否重要?另一个耗时任务的示例是调用 google-maps api 以查找从一个位置到另一个位置的路线并获得旅行时间估计。我相信此操作将花费比在我们的数据库中搜索更长的时间。因此,当我们遇到其他瓶颈时,优化数据库访问可能没有多大意义。其他操作呢?假设我们想在一个边界 [lat, long] 框中查找预订。使用单独的表可能会变得更加耗时,因为我们需要一个完整的表连接。或者做一个繁琐的两步搜索,在我们的表中找到边界框内的位置 ID,然后搜索bookings带有这些 ID 的表。如果我们在边界框中有数百或数千个位置,这可能不是一个好方法。但同样,我不确定尝试优化此操作的效用。我不确定我需要按位置搜索的频率。似乎不是那么频繁,所以我不会以任何方式获得/失去太多。

在我看来,没有基于时空权衡的有力论据。我还应该考虑其他方面吗?例如:设计清晰、易于开发、灵活性和可扩展性。如果模型需要改变,单独的表格方法似乎提供了更多的结构和更大的灵活性的机会。例如,将街道地址分解为多个组成部分(街道、城市、州)可能是有益的。如果我们要在其他表中使用位置列,我们就不太可能这样做(我们需要已经使用至少 3 列,并且将地址分成 3 个组件,使这个数字变为 5)。关于灵活性:在未来,我们可能会有多点骑行。拥有位置表将对此有所帮助。

我倾向于单独的表格,但我没有看到支持或反对它的有力论据。我还缺少其他论点吗?

不确定以下细节是否相关,但我将使用 postgresql 作为 RDBMS,使用 sqlalchemy 作为 ORM 来查询数据库。

postgresql database-design spatial routing

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

MySQL 或 MariaDB 是否支持 GIS KNN 索引查询(k-最近邻)?

例如,您可以在 MySQL 上执行k-最近邻算法 (k-NN)查询,以使用 PostGIS 在 PostgreSQL 中找到最近的点,我可以在空间索引上运行 kNN 查询<->

SELECT ST_AsText(geom), city
FROM person.address
ORDER BY geom <-> 'POINT(-121.626 47.8315)'
FETCH FIRST 7 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

SQL Server 有一个类似的方法

DECLARE @g geography = 'POINT(-121.626 47.8315)';

SELECT TOP(7) SpatialLocation.ToString(), City
FROM Person.Address  
WHERE SpatialLocation.STDistance(@g) IS NOT NULL  
ORDER BY SpatialLocation.STDistance(@g);
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 和 SQL Server 都有 KNN。<->在他们的空间索引上做 KNN的 MySQL 等价物是什么?


如果你不知道 KNN 是什么,你可以在这里看到描述

KNN 系统通过评估 PostGIS R-Tree 索引内边界框之间的距离来工作。

因为索引是使用几何体的边界框构建的,任何不是点的几何体之间的距离都将是不精确的:它们将是几何体的边界框之间的距离。

这里的关键是 KNN …

mysql mariadb index spatial

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