spatial
扩展提供了对 DuckDB 中地理空间数据处理的支持。
有关该扩展的概述,请参阅我们的 博客文章。
Installing and Loading
要安装并加载spatial
扩展,请运行:
INSTALL spatial;
LOAD spatial;
The GEOMETRY
类型
空间扩展的核心是GEOMETRY
类型。如果你不熟悉地理空间数据和GIS工具,这种类型的工作方式可能与你预期的非常不同。
表面上,GEOMETRY
类型是由一组顶点(X 和 Y double
精度浮点数对)组成的“几何”数据的二进制表示。但它的特别之处在于,它实际上用于存储几种不同的几何子类型之一。这些子类型包括 POINT
、LINESTRING
、POLYGON
,以及它们的“集合”等效类型,如 MULTIPOINT
、MULTILINESTRING
和 MULTIPOLYGON
。最后还有 GEOMETRYCOLLECTION
,它可以包含任何其他子类型,以及其他 GEOMETRYCOLLECTION
的递归组合。
起初这可能看起来很奇怪,因为DuckDB已经有像LIST
、STRUCT
和UNION
这样的类型,它们可以以类似的方式使用,但GEOMETRY
类型的设计和行为实际上是基于Simple Features几何模型,这是许多其他数据库和GIS软件使用的标准。
空间扩展还包括一些实验性的非标准显式几何类型,例如基于DuckDB原生嵌套类型(如STRUCT
和LIST
)的POINT_2D
、LINESTRING_2D
、POLYGON_2D
和BOX_2D
。由于这些类型具有固定且可预测的内部内存布局,理论上可以优化许多地理空间算法,使其在这些类型上的操作比在GEOMETRY
类型上更快。然而,到目前为止,只有少数空间扩展中的函数专门针对这些类型进行了优化。所有这些新类型都可以隐式转换为GEOMETRY
,但会有一定的转换成本,因此如果你计划使用许多不同的空间函数,目前仍然推荐使用GEOMETRY
类型。
GEOMETRY
目前无法存储其他几何类型,如曲线几何或三角形网络。此外,GEOMETRY
类型不会在每个值的基础上存储 SRID 信息。这些限制可能会在未来得到解决。