GEOSPATIAL
数据类型的排序。我的意思是该类型本身,而不是函数,例如获取类型的区域或纬度。例如,在BigQuery等某些情况下,它甚至根本不被支持。地理数据可能会按哪些可能的(和有用的)方式进行排序?我想到的唯一有意义的项目是:
- 将字段转化为字符串(也许用于调试,似乎除此之外没有任何有用的情况)。
- 通过经度/纬度排序,多边形转换为质心。例如,也许排序是距赤道/子午线的距离。
GEOSPATIAL
数据类型的排序。我的意思是该类型本身,而不是函数,例如获取类型的区域或纬度。例如,在BigQuery等某些情况下,它甚至根本不被支持。地理数据可能会按哪些可能的(和有用的)方式进行排序?Oracle - https://docs.oracle.com/database/121/SPATL/spatial-concepts.htm#SPATL010
Sql Server - https://learn.microsoft.com/en-us/sql/t-sql/spatial-geometry/ogc-methods-on-geometry-instances?view=sql-server-ver15
PosgGresql - https://postgis.net/
真正的GIS功能已经有很多年了,但是很少有人仅使用数据库,而是依赖第三方软件,如Esri的ArcMap等。这些工具确实有一定作用,但如果有好的数据,通过典型的SQL脚本可以进行很多真正的GIS操作。
祝你好运。
在MS SQL Server中的一个实际示例:
创建一个空间表并添加测试数据。在这一步中,第三方工具大大辅助了这个加载过程,因为在现实中,几何图形不是我们输入的东西,例如国家边界有数千个顶点。(我故意省略了与空间参考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
经度
,纬度
)对进行排序。除非您有具有完全相同经度的点(这是不太可能的,因为这些是浮点数),否则这与仅按经度
排序相同!这很容易解释,但是否合理?也许对于某些应用程序来说是这样,但如果它们具有接近经度值的点,则会将点放置在赤道和极地非常接近,这对其他应用程序不利。对于不同的应用程序,您需要进行不同的排序。例如,BigQuery支持按地理值进行聚类。聚类不是排序,但有些相似。为此,它使用Hilbert Curve,它考虑了(longitude
,latitude
)并提供了比仅按longitude
或(longitude
,latitude
)成对聚类数据更好的方法。Hilbert Curve很有用,但并不是非常直观,并且对于要求排序的其他应用程序没有意义。
如果你将大多数地理数据视为存在于二维平面上,那么在其上覆盖一个统一的网格可以提供一个可索引和分层的线性排序系统。这本质上是一种空间索引,在以下文章中有很好的描述。
SQL Server从B+树结构开始,将数据组织成线性方式。因此,索引必须有一种表示二维空间信息的方法,使其成为线性数据。为此,SQL Server使用称为分层均匀空间分解的过程。创建索引时,数据库引擎将空间分解或重构为沿着四级网格层次结构对齐的轴集合。图1提供了此过程的概述。
空间索引基本上是一个网格,可以通过从高级空间到低级空间和线性顺序进行分解来进行索引。SQL Server使用层次均匀分解空间方法,在读取数据之前,先读取空间索引。这不仅导致更快的性能,还可能实现排序方案。
如果您想要自己的工作的简单实现,则将数据与任何具有按顺序排列的ID值的统一网格进行空间连接即可。有许多算法用于创建统一索引网格,Esri提供了一个生成镶嵌方案的工具。镶嵌可以是三角形、正方形、菱形、六边形或横向六边形。