当你用矢量数据做空间分析时,shpgeojson这两种格式应该经常用到,其中geojson也已经成为 Web 应用的首选空间数据格式。但是在更大规模的集成和自动化部署工作中,这两种格式都有很多缺点。

Shapefile 的问题

Shapefile是ESRI在20世纪90年代开发的格式,用来存储矢量数据及相关的属性数据。在今时今日缺点也比较明显。

  • 多文件格式,一个Shapefile至少需要.shp.shx.dbf三个文件,当有多个图层时,文件数量会扩展到4-6倍。
  • 列标题只支持10个字符
  • 最大限制为2GB
  • 一个文件中只能存储一种geometry类型
  • 随着数据量和属性列的增加,即便添加了空间索引,性能也会急剧下降。

GeoJSON 的问题

GeoJSON 在一定程度上解决了 shapefile 的多文件问题,但自身也有很多限制。

  • 数据冗余,json 文件结构不可避免的数据冗余,通常 GeoJSON 的文件大小是 shapefile 的两倍
  • 没有空间索引,在处理大数据量时性能很差
  • 文件需要一次性全部读取,加载速度慢,内存消耗大
  • 文件大小也会受限,大概超过10GB就可能出问题

GeoPackage

GeoPackage是由OGC开发的地理信息的开放格式,定义如下:

GeoPackage是一种开放的、基于标准的、与平台无关的、可移植的、自我描述的、紧凑的格式,用于传输地理空间信息。

从本质上讲,GeoPackage是一个有OGC编码标准的SQLite容器,用来存储矢量特征、瓦片矩阵(栅格数据)、非空间属性数据和各类扩展。就是扩展名为.gpkg的 SQLite 文件。

GeoPackage中有什么

和其他关系型数据库一样,GeoPackage中也包含一些表,这些表分成元数据表和自定义数据表两类。其中必须含的数据表是 gpkg_contents 和 gpkg_spatial_ref_sys,其他表则看存储的数据类型。

  • gpkg_content,存储表的元数据,包含表名、数据类型、最近修改时间、空间坐标参考类型等等
  • gpkg_spatial_ref_sys,定义坐标参考系统元数据,包含srs_name、srs_id、organization、organization_coordsys_id、definition

列举个矢量要素的存储:
geopackage-features

vector-metadata

另外 GeoPackage 可以使用自定义的扩展,比如RTree空间索引扩展,它用SQLite R*Tree模块扩展提供的rtree实现,增强对几何列的索引能力。

优点

  • 基于 SQLite 的开源格式
  • 非常轻量级,在不同环境中高度兼容
  • 比 shapefile 小10%-30%,比 GeoJSON 小1倍
  • 自带空间索引
  • 没有文件大小限制
  • 和 shapefile 比列名没有限制
  • 相比 shapefile 运行和算法的输出速度更快
  • 一个 geopackage 中可以包含多个图层,且每个图层可以拥有不同类型的geometry
  • 也可以存储非空间属性表d
  • geopackages也可以将栅格作为瓦片矩阵来处理

需注意

  • GeoPackage 不同于 SpatiaLite,在设计标准时矢量部分受 SpatiaLite 格式影响很大,但在一些微妙的方面又有所区别。SpatiaLite现在支持GeoPackage的4.2.0版本。

  • GeoPackage的 WKB 编码和 PostGIS 不太一样,因为 WKB 的原始 OGC/ISO 标准并不包含想要存储的所有信息,PostGIS和SpatiaLite都各自开发了自己的临时扩展,且没有统一标准。

参考资料