您如何看待PostGIS中的部分3d功能?


10

我们具有来自调查数据的功能,其中包含部分3d信息。

最常见的示例是表示道路的2D LineString,其中包含在被调查的某些点的高程信息。其他示例包括屋顶形状-MultiLineString,其中某些关键点具有从建筑平面图中分配的标高,但不是全部。

使用PostGIS,您建议使用哪种数据模型来存储此类信息,以使其尽可能可访问,而不会丢失或生成内插信息?


代表道路的2D LineString包含高程-因此为3D-对数据使用ST_Force_3D-postgis.refractions.net/documentation/manual-1.5SVN/…–
Mapperz

0 z坐标不正确,并且不能表示与数据源相同的值。ST_Force_3D对我们不起作用。这个想法是为了能够在数据源和我们的数据库之间建立正确的双向映射。
2012年

Answers:


2

您可以将未测量的Z值存储为'nan'::float8。例如:

SELECT ST_AsText(g), ST_X(g), ST_Y(g), ST_Z(g), ST_Z(g) <> 'nan'::float8 AS has_z
FROM (
  SELECT ST_MakePoint(1, 2, 'nan'::float8) AS g
  UNION SELECT ST_MakePoint(4, 5, 6) AS g
) AS f;

       st_astext       | st_x | st_y | st_z | has_z
-----------------------+------+------+------+-------
 POINT Z (1 2 1.#QNAN) |    1 |    2 |  NaN | f
 POINT Z (4 5 6)       |    4 |    5 |    6 | t
(2 rows)

但是,这可能会给您带来麻烦,因为NaN值并非始终由软件开发人员测试或处理。例如,PostGIS无法解析上述的WKT版本

SELECT 'POINT Z (1 2 1.#QNAN)'::geometry;

ERROR:  parse error - invalid geometry
LINE 1: SELECT 'POINT Z (1 2 1.#QNAN)'::geometry;
               ^
HINT:  "POINT Z (1 2 1.#Q" <-- parse error at position 17 within geometry

1

创建一个具有三个维度的辅助几何列,以容纳具有三坐标(三重)值的线串的顶点。为了使该架构有效,假定了以下假设:

  • 线串有效,不包含重复的点
  • 几何是线串
  • 给定几何必须至少有两个具有3d坐标的顶点,这样才能清晰地存储到第二个几何列中
  • 触发器将填充辅助几何体列以使其保持ACID。

有效的几何图形应足以不允许线串中有重复的点且不允许自交。因此,每个坐标的行为都将像入门键一样,以标识源几何体中的顶点。

从关系模型也是如此:

  • 不会有多余,没有信息的顶点不会出现在辅助几何体列中
  • 源数据的更改将通过触发器传播到派生数据。
  • 只有被认为是事实的信息才会存储在数据库中,而不会创建任何人工数据。

对于多行字符串情况,事情可能会有些困难,因为现在必须具有一个带有复合主键的附加表:

  • 源几何的rowid(gid,唯一标识符)
  • 给定MultiGeometry内部的geometryN位置,必须检查其在区间[1-N]内
  • 相关表rowid(gid)的前导键
  • 触发/检查功能以确保间隔有效

上面的主键将防止插入给定几何图形的重复几何图形索引。触发/检查将防止无效索引。同样,这里的行必须来自具有外键的源数据。所有先前的规则均适用。

一种简化是在附加列上使用,但不使用几何类型,而是使用相同类型的Z值声明为数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.