GeoPackage 用单个 SQLite 文件组织空间数据

依据 OGC 标准说明 GeoPackage 如何保存要素、瓦片和属性,以及扩展、完整性与并发使用边界。

GeoPackage 用单个 SQLite 文件组织空间数据

GeoPackage 是 OGC 规定的 SQLite 空间数据容器,可以在一个文件中保存矢量要素、瓦片金字塔和非空间属性。它适合交换、离线使用和移动场景,也可直接查询。它不是任意扩展名为 gpkg 的 SQLite 文件,也不是替代多用户数据库服务器的通用方案。

核心元数据表让内容可发现

GeoPackage 使用规定的 gpkg_ 表描述内容、坐标参考和几何列。gpkg_contents 登记用户数据表及其类型,gpkg_spatial_ref_sys 保存引用的空间参考,矢量表还由 gpkg_geometry_columns 描述几何字段。

应用不应只枚举 SQLite 所有表来猜测空间内容。读取核心表可以区分标准数据、内部索引和应用自有表,并检查每个内容项的 SRS 和范围。

核心表的名称、列和约束属于标准合同。随意修改会使其他软件无法识别,即使本应用仍能读取。

要素表遵循简单要素模型

一个要素表包含整数主键、一个几何列和业务属性。几何以 GeoPackageBinary 编码保存,并关联空间参考标识。核心支持点、线、面及其多部件和集合类型。

同一要素表只有一个标准几何列。需要多个几何表达时,可拆分表或使用标准允许的视图和关联方式,不能假设所有客户端理解私有第二几何列。

几何类型声明应与实际数据一致,Z 和 M 的存在也要按列元数据表达。无效几何不会因为放入 GeoPackage 自动修复。

瓦片按矩阵层级存储

GeoPackage 可以保存多个瓦片金字塔。每个缩放层级有固定矩阵宽高、瓦片尺寸和像元大小,瓦片由层级、行列索引定位。

瓦片通常保存 PNG 或 JPEG 等图像。它们是特定样式和分辨率的表示,不等同于原始分析栅格。透明、压缩和无数据语义取决于编码与扩展。

瓦片层级不必固定采用所有 Web 地图的二倍比例规则,但客户端必须读取矩阵元数据,不能硬编码全球 Web Mercator 假设。

属性表可保存非空间记录

标准允许登记没有几何的属性表,例如观测记录、工单或地址列表。它们可以通过业务键与空间要素关联,但关联规则由数据模型定义。

把普通应用表直接塞入文件而不登记内容类型,会降低互操作性。若必须保存应用状态,应使用扩展机制或明确私有边界。

字段类型建立在 SQLite 类型系统上。日期、布尔和复杂对象在不同软件中的映射需要测试,不能只验证本地程序写入成功。

扩展机制允许能力演进

GeoPackage 通过扩展表声明额外能力。已注册扩展提供共同定义,私有扩展也可以存在,但通用客户端可能只能忽略或拒绝相关内容。

使用扩展时应记录名称、作用表列、定义和读写范围。关键数据若完全依赖少见私有扩展,文件就失去跨软件交换优势。

客户端遇到未知扩展应按标准范围采取保守行为,而不是直接删除未知表。写回文件尤其要避免破坏自己不理解的内容。

单文件便于传输也有一致性要求

一个文件可以携带多层数据与元数据,便于复制和离线使用。但 SQLite 事务可能伴随 WAL 或 journal 文件,数据库正在写入时只复制主文件可能得到不一致快照。

交换前应关闭写入连接或使用 SQLite 支持的备份方式,并执行完整性检查。文件扩展名正确不代表核心表、外键和几何内容有效。

大文件复制成本高,局部更新也需要重新分发。频繁多人编辑、细粒度权限和高并发服务更适合服务器数据库,GeoPackage可作为导出和现场工作包。

空间索引属于可选扩展能力

要素查询可使用 RTree 空间索引扩展提高范围筛选速度。索引表和触发器必须与要素变更保持一致,手工修改底层表可能使索引失效。

没有空间索引的文件仍可符合相应核心内容要求,但大数据查询可能很慢。创建索引前后应验证执行行为和文件体积。

索引不校验几何有效性,也不替代属性索引。查询模式决定需要哪些索引。

互操作需要在多个实现中验证

GDAL 等工具能够读取和写入 GeoPackage,但驱动版本、创建选项和扩展支持不同。生产工作流应记录版本,并在目标桌面、移动和服务软件中抽样打开。

验证包括核心表、SRS、几何类型、范围、字段、空值、瓦片层级、扩展和完整性。只看到地图图形不代表属性和坐标语义正确。

GeoPackage 的价值来自标准化 SQLite 结构:单文件、可事务访问、跨平台并可直接使用。遵守核心表和扩展边界,它是可靠容器;随意加入私有结构,则会退化为只有创建者理解的数据库文件。

资料依据