建模指南¶
要求中要求使用GeoPackage编码标准 22 和 30 该矢量要素用户表只能有一个几何图形。这是有利的,原因有两个:
它使数据模型的语义保持简明:一个特性只有一个形状。这与GeoPackage经常与之进行比较的其他矢量数据格式(如shapefile或GeoJSON)是一致的。通过共享此限制,可以更直接地将数据从一种格式转换为另一种格式。这在企业工作流中尤其有益。例如,移动组件使用GeoPackage查看业务数据,而Web客户端使用GeoJSON版本。
允许每个要素表有多个几何图形会损害GeoPackage在GIS应用程序生态系统中的地位。大多数现成的GIS数据查看器以统一的方式处理数据格式。打开文件将在地图上创建一个图层,该图层将显示该文件中包含的要素。通常有一些UI功能可以查看要素的属性或更改要素的样式。如果要素表包含多个几何图形,那么GeoPackage在这样的COTS查看器中的可视化将会复杂得多。地图上应该显示什么几何图形?所有人都是吗?只有第一个吗?编辑工具也会产生类似的问题。
这一限制不应被视为限制。由于GeoPackage是关系数据库,因此用户可以创建丰富的数据模型来描述所需的场景。通常的方法不是将更多几何图形列添加到单个表中,而是将这些几何图形提取到单独的表中,从而在几何图形和要素之间创建一对多关系。
本文档说明了将多个几何图形与单个特征相关联的三种不同用例。对于每一个,它:
描述一个常见用例
提供了数据库架构的相应示例
显示如何在gpkg_*表中适当注册这些表
显示了如何使用视图来增强生成的GeoPackage的实用性和可用性
追踪单个要素的先前几何¶
示例用例¶
您希望存储对管道特征的几何图形进行编辑的历史记录。对于每次编辑,您都希望跟踪修改的时间。
最后一次编辑是要素的当前几何图元。这是默认情况下要向用户显示的干管几何图形。
建议的解决方案:将要素的几何图形存储在与包含管道元数据的表分开的表中。这些都是历史性的。将这些连接到管道表。
使用视图将管道链接到其最新的几何图形。将此视图添加到gpkg_Contents表。
表格设计¶

视图设计¶
CREATE VIEW pipes_current AS
SELECT shape, max(date_created), type
FROM pipe_history as A JOIN pipes as B
ON A.pipe_id=B.pipe_id
GROUP BY B.pipe_id;
表条目¶
|
|
|
|
|
pipe_history |
功能 |
pipe_history |
管道编辑 |
4326 |
pipes_current |
功能 |
pipes_current |
当前管道 |
4326 |
|
|
|
|
|
|
pipe_history |
形状 |
几何体 |
4326 |
2 |
2 |
pipes_current |
形状 |
几何体 |
4326 |
2 |
2 |
由多个组件组成的功能¶
示例用例¶
您需要为具有多个几何图元的特征建模。与这个主要特征相关联的是辅助特征,每个特征都有自己的属性和形状。例如,主要功能是一个带有多边形边界的公园。与这个公园相关联的是入口,这些入口被建模为点。
建议的解决方案¶
将主要素与辅助要素分开存储。这允许您将不同的元数据与每个功能/子功能相关联。
公园-边界+入口-可以通过一个视图连接在一起。这提供了一张“概观”图片,它将公园重建为几何图形的集合。
表格设计¶

视图设计¶
Note: This statement uses the ST_* GPKG SQLite扩展模块中的函数(参见https://bitbucket.org/luciad/libgpkg)
CREATE VIEW park_complete AS
SELECT A.park_id, ST_GeomFromText('GEOMETRYCOLLECTION(' || ST_AsText(A.shape) || ',' || group_concat(ST_AsText(B.shape)) ||')') as shape
FROM park_json as A
JOIN park_entrances_json as B
ON A.park_id = B.park_id
GROUP BY A.park_id;
表条目¶
|
|
|
|
|
公园 |
功能 |
公园 |
公园边界 |
4326 |
park_entrances |
功能 |
park_entrances |
公园入口处 |
4326 |
park_complete |
功能 |
park_complete |
公园边界与入口的联系 |
4326 |
|
|
|
|
|
|
公园 |
形状 |
几何体 |
4326 |
2 |
2 |
park_entrance |
形状 |
几何体 |
4326 |
2 |
2 |
park_complete |
形状 |
几何体 |
4326 |
2 |
2 |
具有多分辨率的要素¶
示例用例¶
出于效率原因,通常希望具有由不同分辨率的不同几何图形表示的相同特征。这通常用于具有大范围的要素,例如道路、河流、市政边界等…。查看器应用程序以较小的比例显示几何图形的较粗糙版本(即缩小),而在较大比例下(即放大)它显示最详细的版本。通常,您会预先定义几个比例调整。
建议的解决方案¶
假设我们对道路数据集中的道路有多个分辨率:
将所有几何图形存储在与道路特性分开的表中。将其应用到的比例折断与每个几何图元相关联。在我们的示例中,我们使用 [最小|最大] scale_denominator列,用于存储刻度转换值。
视图将属性与几何图形连接在一起。此视图实际上将包含许多副本,不应按原样呈现。
此解决方案要求查看器应用程序根据与几何图形相关联的最小-最大比例应用正确的过滤。也就是说,应用程序只渲染适用于每个换算符的几何图形。这是应用程序级别的要求,与GeoPackage格式无关,实现方式取决于您要使用的特定产品。对于支持SLD的产品,这种基于比例的过滤相当简单。在FeatureTypeStyle中,创建多个规则,地图上的每个比例折断对应一个规则。在每条规则中,过滤都会删除与所需比例调整不对应的所有几何图形。
例如,在SLD中,仅显示具有粗略分辨率(缩小)的道路的规则如下所示:
<Rule>
<Name>small scale</Name>
<Description>
<Title>small scaled roads</Title>
<Abstract>shows only the low resolution roads</Abstract>
</Description>
<ogc:Filter>
<ogc:PropertyIsGreaterThan>
<ogc:PropertyName>min_scale_denominator</ogc:PropertyName>
<ogc:Literal>2.0E8</ogc:Literal>
</ogc:PropertyIsGreaterThan>
</ogc:Filter>
<MinScaleDenominator>2.0E8</MinScaleDenominator>
<LineSymbolizer>
<Stroke>
<SvgParameter name="stroke">#0000ff</SvgParameter>
<SvgParameter name="stroke-width">2</SvgParameter>
</Stroke>
</LineSymbolizer>
</Rule>
表格设计¶

视图设计¶
CREATE VIEW roads_all AS
SELECT *
FROM road as A
JOIN road_geometries as B
ON A.road_id = B.road_id
表条目¶
|
|
|
|
|
road_geometries |
功能 |
road_geometries |
道路几何图形的多分辨率 |
4326 |
roads_all |
功能 |
roads_all |
道路几何的多个分辨率,与道路属性相关联 |
4326 |
|
|
|
|
|
|
road_geometries |
形状 |
几何体 |
4326 |
2 |
2 |
roads_all |
形状 |
几何体 |
4326 |
2 |
2 |