建模指南

要求中要求使用GeoPackage编码标准 2230 该矢量要素用户表只能有一个几何图形。这是有利的,原因有两个:

  • 它使数据模型的语义保持简明:一个特性只有一个形状。这与GeoPackage经常与之进行比较的其他矢量数据格式(如shapefile或GeoJSON)是一致的。通过共享此限制,可以更直接地将数据从一种格式转换为另一种格式。这在企业工作流中尤其有益。例如,移动组件使用GeoPackage查看业务数据,而Web客户端使用GeoJSON版本。

  • 允许每个要素表有多个几何图形会损害GeoPackage在GIS应用程序生态系统中的地位。大多数现成的GIS数据查看器以统一的方式处理数据格式。打开文件将在地图上创建一个图层,该图层将显示该文件中包含的要素。通常有一些UI功能可以查看要素的属性或更改要素的样式。如果要素表包含多个几何图形,那么GeoPackage在这样的COTS查看器中的可视化将会复杂得多。地图上应该显示什么几何图形?所有人都是吗?只有第一个吗?编辑工具也会产生类似的问题。

这一限制不应被视为限制。由于GeoPackage是关系数据库,因此用户可以创建丰富的数据模型来描述所需的场景。通常的方法不是将更多几何图形列添加到单个表中,而是将这些几何图形提取到单独的表中,从而在几何图形和要素之间创建一对多关系。

本文档说明了将多个几何图形与单个特征相关联的三种不同用例。对于每一个,它:

  • 描述一个常见用例

  • 提供了数据库架构的相应示例

  • 显示如何在gpkg_*表中适当注册这些表

  • 显示了如何使用视图来增强生成的GeoPackage的实用性和可用性

追踪单个要素的先前几何

示例用例

您希望存储对管道特征的几何图形进行编辑的历史记录。对于每次编辑,您都希望跟踪修改的时间。

最后一次编辑是要素的当前几何图元。这是默认情况下要向用户显示的干管几何图形。

建议的解决方案:将要素的几何图形存储在与包含管道元数据的表分开的表中。这些都是历史性的。将这些连接到管道表。

使用视图将管道链接到其最新的几何图形。将此视图添加到gpkg_Contents表。

表格设计

../../_images/mgimage001.png

视图设计

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;

表条目

表1: gpkg_contents :宽度:20 15 15 40 10:标题-行:1

table_name

data_type

identifier

description

srs_id

pipe_history

功能

pipe_history

管道编辑

4326

pipes_current

功能

pipes_current

当前管道

4326

表2: gpkg_geometry_columns :宽度:20 20 15 15 15:标题-行:1

table_name

column_name

geometry_type_name

srs_id

z

m

pipe_history

形状

几何体

4326

2

2

pipes_current

形状

几何体

4326

2

2

由多个组件组成的功能

示例用例

您需要为具有多个几何图元的特征建模。与这个主要特征相关联的是辅助特征,每个特征都有自己的属性和形状。例如,主要功能是一个带有多边形边界的公园。与这个公园相关联的是入口,这些入口被建模为点。

建议的解决方案

将主要素与辅助要素分开存储。这允许您将不同的元数据与每个功能/子功能相关联。

公园-边界+入口-可以通过一个视图连接在一起。这提供了一张“概观”图片,它将公园重建为几何图形的集合。

表格设计

../../_images/mgimage002.png

视图设计

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;

表条目

表3: gpkg_contents :宽度:20 15 15 40 10:标题-行:1

table_name

data_type

identifier

description

srs_id

公园

功能

公园

公园边界

4326

park_entrances

功能

park_entrances

公园入口处

4326

park_complete

功能

park_complete

公园边界与入口的联系

4326

表4: gpkg_geometry_columns :宽度:20 20 15 15 15:标题-行:1

table_name

column_name

geometry_type_name

srs_id

z

m

公园

形状

几何体

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>

表格设计

../../_images/mgimage003.png

视图设计

CREATE VIEW  roads_all AS
SELECT  *
FROM road as A
JOIN road_geometries as B
ON A.road_id = B.road_id

表条目

表5: gpkg_contents :宽度:20 15 15 40 10:标题-行:1

table_name

data_type

identifier

description

srs_id

road_geometries

功能

road_geometries

道路几何图形的多分辨率

4326

roads_all

功能

roads_all

道路几何的多个分辨率,与道路属性相关联

4326

表6: gpkg_geometry_columns :宽度:20 20 15 15 15:标题-行:1

table_name

column_name

geometry_type_name

srs_id

z

m

road_geometries

形状

几何体

4326

2

2

roads_all

形状

几何体

4326

2

2