当你用矢量数据做空间分析时,shp
和geojson
这两种格式应该经常用到,其中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 可以使用自定义的扩展,比如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都各自开发了自己的临时扩展,且没有统一标准。