地理空间数据排序

4
似乎没有默认的方法来处理GEOSPATIAL数据类型的排序。我的意思是该类型本身,而不是函数,例如获取类型的区域或纬度。例如,在BigQuery等某些情况下,它甚至根本不被支持。地理数据可能会按哪些可能的(和有用的)方式进行排序?
我想到的唯一有意义的项目是:
  • 将字段转化为字符串(也许用于调试,似乎除此之外没有任何有用的情况)。
  • 通过经度/纬度排序,多边形转换为质心。例如,也许排序是距赤道/子午线的距离。
地理数据通常按什么方式排序,或者排序在地理数据中非常不常见?

1
这个问题可能更适合 https://gis.stackexchange.com/ 上。 - MrUpsidown
你目前是如何存储数据的?排序顺序会是什么? - Kazi Mohammad Ali Nur Romel
4个回答

3
空间数据是现代大多数关系型数据库管理系统(以及一些非关系型数据库)的重要组成部分。
我假设您熟悉GIS和空间数据的概念。Esri是世界领先的空间数据应用程序之一,他们非常依赖于SQL和Oracle空间数据类型以及底层的空间引擎。
正如大多数GIS人员所理解的那样,存储在数据库中的地理要素通常由单个数据类型表示。这些空间数据类型包括线、点、多边形、圆、开放路径等。我试图表达的观点可能不是很清楚,即每种要素类型(例如道路)都存储/管理在数据库中的单个表中,并具有特定的几何类型。
因此,举个例子,您可以拥有一个表示数据类型为线的道路表,以及表示数据类型为多边形的水坝或财产边界表等。
如果您使用GIS数据,您会发现最简单的级别,空间数据可以是地理的,即具有由纬度/经度坐标表示的坐标,通常在范围x(-180,+180),y(-90,+90)内。或者,数据可以使用某些坐标系统(如UTM,Albers等)进行投影。在这种情况下,地图单位可以用其他单位表示,例如英尺或米。
在SQL Server中,特别是我认为Oracle也是如此,支持两种几何数据类型。
地理类型表示圆形地球坐标系中的数据,例如度、分和秒 几何类型表示欧几里得(平面)坐标系中的数据,并用于表示投影数据,即不是以十进制度数表示的数据。
SQL Server、Oracle和PostgreSQL都为空间数据类型提供了非常丰富的功能,使您可以编写可以操作、排序、选择、清理等许多非常聪明的事情的SQL查询,例如缓冲区、交集等。
只需学习数据库中新数据类型的语法。如果您使用过ArcGIS之类的产品,并假设您的数据已正确存储在RDBMS中,则可以使用类似于SQL脚本的方式执行大多数空间数据查询(特别是对于矢量数据类型)。
另外需要说明的是,虽然数据库使用几何列来存储您所涉及的要素类的空间几何形状,例如道路的线数据类型,但您需要添加任何额外的数据列或属性。大多数RDBMS用户都很清楚这一点。其中的优点是您能够结合包括(非空间)属性数据的空间查询。此外,您的空间数据可以参与与其他表的关系,例如一对多。因此,通过一个实际的例子,如果您有与田地编号/标识符相关联的历史产量数据,那么可以编写查询,显示那些过去三年平均产量最高的田地。属性的选择由数据要求确定。企业GIS系统的真正力量在于能够将某些空间数据与相关信息相结合,并压缩信息以做出更好的决策和更好地理解关系。 (但是,尽管听起来很宏伟,但您可以预期约80-90%的工作涉及与数据质量和保证相关的活动。有趣的部分是最短且最容易的部分。)垃圾进垃圾出...
以下是不同RDBMS中空间数据操作的链接:

真正的GIS功能已经有很多年了,但是很少有人仅使用数据库,而是依赖第三方软件,如Esri的ArcMap等。这些工具确实有一定作用,但如果有好的数据,通过典型的SQL脚本可以进行很多真正的GIS操作。

祝你好运。

在MS SQL Server中的一个实际示例:

  1. 创建一个空间表并添加测试数据。在这一步中,第三方工具大大辅助了这个加载过程,因为在现实中,几何图形不是我们输入的东西,例如国家边界有数千个顶点。(我故意省略了与空间参考ID(SRID)相关的细节,以保持简单。)

    IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL
    DROP TABLE dbo.SpatialTable;
    GO

    CREATE TABLE SpatialTable
    ( id int IDENTITY (1,1),
    [Geometry] geometry,
    [StaText] AS [Geometry].STAsText());
    GO

    INSERT INTO SpatialTable ([Geometry])
    VALUES (geometry::STGeomFromText('POLYGON ((0 0, 0 40, 40 80, 60 20, 0 0))', 0));

    INSERT INTO SpatialTable ([Geometry])
    VALUES (geometry::STGeomFromText('POLYGON ((0 0, 0 -40, 50 -10, 20 -10, 0 0))', 0));
    GO

  2. 选择插入的数据 The geometry data in a select statement

2B) 数据的图像化表示 几何数据的图片

  1. 按几何属性面积排序空间数据。 按面积对空间数据进行排序

1
排序在数据库中的空间数据中是100%常见的。事实上,空间数据类型首次引入数据库的主要原因就是为了能够按位置排序并创建空间索引。(如果不是这样的话,我们仍然会将位置存储在Lat、Lon两列中。)
有许多方法可以对空间数据进行排序。它们都相当复杂。大多数商业数据库使用网格/镶嵌方案的变体。这里是SQL Server中空间索引机制的审查

我明白了,感谢您的回复。人们是否会按其字符串进行排序(即使是为了调试)?还是根本不常见? - samuelbrody1249
字符串(或二进制)比较适用于匹配/不匹配。它无法帮助进行大小比较。 - Michael Diomin

1
我认为没有一种通用的2D数据排序方式适用于不同的情境。
例如,考虑按(经度纬度)对进行排序。除非您有具有完全相同经度的点(这是不太可能的,因为这些是浮点数),否则这与仅按经度排序相同!这很容易解释,但是否合理?也许对于某些应用程序来说是这样,但如果它们具有接近经度值的点,则会将点放置在赤道和极地非常接近,这对其他应用程序不利。
同样,按距离赤道的距离排序在某些情况下可能有用,但并不经常使用。

对于不同的应用程序,您需要进行不同的排序。例如,BigQuery支持按地理值进行聚类。聚类不是排序,但有些相似。为此,它使用Hilbert Curve,它考虑了(longitudelatitude)并提供了比仅按longitude或(longitudelatitude)成对聚类数据更好的方法。Hilbert Curve很有用,但并不是非常直观,并且对于要求排序的其他应用程序没有意义。


谢谢。在GIS中,您是否遇到过按大小写排序字符串值的情况?例如,为了调试目的(例如,如果您想查看10000个随机点并将其放入Excel中...)? - samuelbrody1249

1

如果你将大多数地理数据视为存在于二维平面上,那么在其上覆盖一个统一的网格可以提供一个可索引和分层的线性排序系统。这本质上是一种空间索引,在以下文章中有很好的描述。

SQL Server从B+树结构开始,将数据组织成线性方式。因此,索引必须有一种表示二维空间信息的方法,使其成为线性数据。为此,SQL Server使用称为分层均匀空间分解的过程。创建索引时,数据库引擎将空间分解或重构为沿着四级网格层次结构对齐的轴集合。图1提供了此过程的概述。

enter image description here

空间索引基本上是一个网格,可以通过从高级空间到低级空间和线性顺序进行分解来进行索引。SQL Server使用层次均匀分解空间方法,在读取数据之前,先读取空间索引。这不仅导致更快的性能,还可能实现排序方案。

如果您想要自己的工作的简单实现,则将数据与任何具有按顺序排列的ID值的统一网格进行空间连接即可。有许多算法用于创建统一索引网格,Esri提供了一个生成镶嵌方案的工具。镶嵌可以是三角形、正方形、菱形、六边形或横向六边形。


我在底部添加了一些信息,关于如何叠加网格以进行简单的排序。回答您的其他评论,如果您想要以表格方式自行完成,则需要首先将点空间连接到具有线性索引的统一网格,然后按该列进行排序。这是对空间数据进行排序的最佳方法。您可以使用Esri工具生成统一网格:https://pro.arcgis.com/en/pro-app/latest/tool-reference/data-management/generatetesellation.htm - Andrew T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接