Wie behandeln Sie teilweise 3D-Funktionen in PostGIS?

10

Wir haben Funktionen aus Umfragedaten, die teilweise 3D-Informationen enthalten.

Das häufigste Beispiel wäre ein 2D-LineString, der eine Straße darstellt und an bestimmten Stellen, an denen er vermessen wurde, Höheninformationen enthält. Andere Beispiele sind Dachformen - Ein MultiLineString, bei dem einigen Schlüsselpunkten eine vom Gebäudeplan zugewiesene Höhe zugewiesen wurde, jedoch nicht allen.

Welches Datenmodell würden Sie unter Verwendung von PostGIS empfehlen, um diese Art von Informationen zu speichern, um sie so zugänglich wie möglich zu halten, ohne interpolierte Informationen zu verlieren oder zu generieren?

relet
quelle
2D LineString, der eine Straße darstellt, die eine Höhe enthält - also 3D - verwenden Sie ST_Force_3D für Ihre Daten - postgis.refractions.net/documentation/manual-1.5SVN/…
Mapperz
Eine 0 z-Koordinate ist nicht korrekt und repräsentiert nicht den gleichen Wert wie die Datenquelle. ST_Force_3D funktioniert bei uns nicht. Die Idee ist, eine korrekte bidirektionale Zuordnung zwischen der Datenquelle und unserer Datenbank zu haben.
Relet

Antworten:

2

Sie können die nicht gemessenen Z-Werte als speichern 'nan'::float8. Beispielsweise:

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)

Dies kann jedoch zu Problemen führen, da NaN-Werte nicht immer von Softwareentwicklern getestet oder verarbeitet werden. Beispielsweise kann PostGIS die WKT-Version des oben genannten nicht analysieren

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
Mike T.
quelle
1

Erstellen Sie eine sekundäre Geometriespalte mit drei Dimensionen, um die Scheitelpunkte des Linienstreifens mit den dreifach ordinierten (dreifachen) Werten aufzunehmen. Damit dieses Schema funktioniert, werden die folgenden Annahmen angenommen:

  • Der Linestring ist gültig und enthält keine doppelten Punkte
  • Geometrien sind Linien
  • Es müssen mindestens zwei Scheitelpunkte mit 3D-Koordinaten in einer bestimmten Geometrie vorhanden sein, damit sie in einer sekundären Geometriespalte gespeichert werden kann
  • Ein Trigger füllt die sekundäre Geometriespalte, um sie ACID zu halten.

Die gültige Geometrie sollte ausreichen, um doppelte Punkte in Linestrings und keine Selbstüberschneidung zuzulassen. Jede Koordinate verhält sich also wie ein Primerschlüssel, um den Scheitelpunkt in der Quellgeometrie zu identifizieren.

Dies gilt auch für das relationale Modell:

  • Es erfolgt keine Redudanz. Der Scheitelpunkt ohne Informationen wurde nicht in der sekundären Geometriespalte angezeigt
  • Änderungen an Quelldaten werden vom Trigger an abgeleitete Daten weitergegeben.
  • Nur Informationen, die als wahr angesehen werden, werden in der Datenbank gespeichert, es werden keine künstlichen Daten erstellt.

Für den Multilinestring-Fall kann es etwas schwieriger sein, da jetzt eine zusätzliche Tabelle mit einem zusammengesetzten Primärschlüssel vorhanden sein muss:

  • die Zeilen-ID (gid, eine eindeutige Kennung) der Quellgeometrie
  • die GeometrieN-Position innerhalb der angegebenen MultiGeometrie, die innerhalb des Intervalls [1-N] überprüft werden muss.
  • ein Vorabschlüssel für die zugehörige Tabellenzeile (gid)
  • eine Trigger- / Check-Funktion, um sicherzustellen, dass das Intervall gültig ist

Der obige Primärschlüssel verhindert das Einfügen doppelter Geometrieindizes für eine bestimmte Geometrie. Der Trigger / Check verhindert ungültige Indizes. Auch Zeilen hier müssen aus Quelldaten stammen, wenn der Fremdschlüssel angegeben ist. Es gelten alle bisherigen Regeln.

Eine Vereinfachung wäre die Verwendung einer zusätzlichen Spalte, jedoch nicht der Art Geometrie, sondern des gleichen Typs von Z-Wert, der als Array deklariert ist.

Cavila
quelle