对地理空间数据进行排序

问题描述

似乎没有方法来处理 GEOSPATIAL 数据类型的排序。我的意思是类型本身,而不是函数,例如,获取类型的区域或纬度。例如,在 BigQuery 之类的东西中,它是 not even supported at all。有哪些可能(和有用的方式)可以对 GEO 数据进行排序?

在我的脑海里,我认为唯一对所有地理类型有意义的项目是:

  • 字符串化该字段(可能用于调试,除此之外似乎没有任何有用的情况)。
  • 按经度/纬度排序,多边形转换为质心。例如,排序可能是距赤道/子午线的距离。

通常对 GEO 数据进行排序的最常见方式是什么,或者对地理数据进行排序非常不常见?

解决方法

空间数据是大多数现代 RDBMS 的重要组成部分,因此,我指的是关系数据库管理系统(以及一些非关系数据库)。

我假设您熟悉 GIS 和空间数据的概念。 Esri 是空间数据应用领域的世界领先者之一,他们非常依赖 SQL 和 Oracle 空间数据类型以及底层空间引擎。

正如大多数 GIS 人所理解的,存储在数据库中的地理特征通常由数据库中的单一数据类型表示。这些空间数据类型包括线、点、多边形、圆、开放路径等。我想在这里提出的一点可能不是很清楚是每个要素类型,例如道路在数据库的单个表中存储/管理 - 并具有特定的几何类型。

例如,您可以有一个道路表来表示数据类型为线、水坝或由多边形数据类型等表示的财产边界的道路。

如果您使用 GIS 数据,您会意识到在最简单的层面上,空间数据可以是地理数据,即具有由纬度/经度坐标表示的坐标,通常在 x(-180,+180),y( -90,+90)。或者,可以使用某些坐标系(例如 UTM、Albers 等)来投影数据。在这种情况下,地图单位可以用某些其他单位表示,例如英尺或米。

特别是在 SQL Server 中,我相信 Oracle 也是如此,有两种支持的几何数据类型。

  1. 地理类型表示圆形地球坐标系中的数据,例如度分秒
  2. 几何类型表示欧几里得(平面)坐标系中的数据,用于表示投影数据,即数据,而不是十进制度数。

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') 不为空
    删除表 dbo.SpatialTable;

    创建表空间表
    ( id int IDENTITY (1,1),
    【几何】几何,
    [StaText] AS [几何].STAsText());

    插入空间表([几何])
    VALUES (geometry::STGeomFromText('POLYGON ((0 0,0 40,40 80,60 20,0 0))',0));

    插入空间表([几何])
    VALUES (geometry::STGeomFromText('POLYGON ((0 0,0 -40,50 -10,20 -10,0));

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

2B) 数据的图形表示 The geometry data in a picture

  1. 按几何属性、面积排序。 Sorting the spatial data by Area
,

我认为没有在各种情况下都有意义的二维数据的通用排序。

例如考虑按 (longitude,latitude) 对排序。除非您有经度完全相同的点(不太可能,因为这些是浮点数)这与仅按 longitude 排序是一样的!解释起来很简单,但是有道理吗?也许对于某些应用程序,但如果它们的经度值很接近,它会将赤道和两极的点放置得非常接近,这对其他应用程序不利。

类似地,按距赤道的距离排序在某些情况下可能很有用,但不经常使用。

对于不同的应用,你需要不同的排序。例如。 BigQuery 支持按地理值进行聚类。聚类不是排序,而是有些相似。为此,它使用 Hilbert Curve,它同时考虑 (longitude,latitude) 并提供比单独使用 longitude 或通过 (longitude },latitude) 对,正如我们所见,几乎相同。 Hilbert Curve 很有用,但它不是很直观,并且对于其他要求排序的应用程序没有意义。

,

排序对于数据库中的空间数据是 100% 常见的。实际上,将空间数据类型引入数据库的首要原因是能够按位置排序并创建空间索引。 (如果不是这样,我们仍会将位置存储在两列经纬度中。)

有很多方法可以对空间数据进行排序。所有这些都非常复杂。大多数商业数据库使用网格/细分方案的变体。这是对spatial index mechanics in SQL Server的评论。

,

如果您认为大多数地理数据都存在于二维平面上,那么覆盖在顶部的统一网格可以提供可索引和分层的线性排序系统。这本质上是一个空间索引,描述得很好in the following article

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

enter image description here

空间索引基本上是一个网格,可以通过从高层空间分解到低层的线性顺序来建立索引。 SQL Server uses the hierarchical uniform decomposition 的空间方法在读取数据之前读取空间索引。这不仅可以提高性能,还可以实现排序方案。

如果您想在自己的工作中简单地实现这一点,那么将您的数据空间连接到任何具有按顺序排列的 ID 值的统一网格都可以。创建统一索引网格的algorithms有很多,Esri提供了generating tessellation schemes的工具。镶嵌可以是三角形、正方形、菱形、六边形或横向六边形。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...