部分的な3D情報を含む調査データの機能があります。
最も一般的な例は、道路を表す2D LineStringで、測量された特定のポイントの標高情報が含まれています。その他の例としては、屋根の形状-いくつかのキーポイントに建築計画からの標高が割り当てられているが、すべてではないMultiLineStringが含まれます。
PostGISを使用して、補間された情報を失ったり生成したりすることなく、可能な限りアクセス可能に保つために、この種の情報を格納するためにどのデータモデルを推奨しますか?
部分的な3D情報を含む調査データの機能があります。
最も一般的な例は、道路を表す2D LineStringで、測量された特定のポイントの標高情報が含まれています。その他の例としては、屋根の形状-いくつかのキーポイントに建築計画からの標高が割り当てられているが、すべてではないMultiLineStringが含まれます。
PostGISを使用して、補間された情報を失ったり生成したりすることなく、可能な限りアクセス可能に保つために、この種の情報を格納するためにどのデータモデルを推奨しますか?
回答:
非測定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
3次元のセカンダリジオメトリ列を作成して、3座標(triple)の値を持つ折れ線の頂点を保持します。このスキーマが機能するためには、以下の前提が想定されています。
有効なジオメトリは、ラインストリング内の重複したポイントや自己交差を許可しないのに十分なものでなければなりません。したがって、各座標は、ソースジオメトリの頂点を識別するための基本的なキーのように動作します。
これはリレーショナルモデルからも正しいです。
複数折れ線の場合、複合主キーを持つ追加のテーブルが必要になるため、状況は少し難しくなる可能性があります。
上記の主キーは、特定のジオメトリの重複したジオメトリインデックスの挿入を防ぎます。トリガー/チェックは無効なインデックスを防ぎます。また、ここの行は、外部キーを指定したソースデータからのものである必要があります。以前のすべてのルールが適用されます。
単純化は、追加の列ではなく種類のジオメトリではなく、配列として宣言された同じタイプのZ値の使用です。