Ich habe eine Tabelle, eine Postgis-Tabelle mit Isolinien, die wie folgt definiert ist:
CREATE TABLE myisolines
(
gid serial NOT NULL,
isotime timestamp without timezone,
val numeric(10,4),
geom geometry(LineString,4326)
);
Optisch sehen diese linearen Objekte folgendermaßen aus:
Ich kenne die räumliche Ausdehnung meiner Daten, sodass ich eine Bbox hinzufügen kann, damit die LineStrings geschlossen werden können.
Ich möchte eine Tabelle mit Isopolygonen myisopolygons
aus einer myisolines
Tabelle mit Polygonen erstellen, die sich nicht überlappen, sondern eine durchgehende Oberfläche erstellen und eine Spalte val
mit der niedrigsten val
Isolinie haben, aus der das Polygon gebildet wurde. Ich verstehe, dass es aus selbstgeschlossenem Isolin (Insel) oder mit bbox geschlossenem Isolin gebildet werden kann. In diesem Fall val
sollte das von diesem bestimmten Isolin genommen werden. Optisch sollte es so aussehen:
Ich dachte, ich könnte irgendwie eine Topologie erstellen und dann Gesichter in Polygone umwandeln, aber ich verstehe nicht, wie man das richtig macht. Wie kann das gemacht werden?
Eine andere Möglichkeit wäre, rekursiv eine Differenzfunktion zwischen bbox und jedem erstellten Polygon zu verwenden, aber ich denke, das ist nicht der richtige Weg und definitiv überhaupt nicht schnell.
quelle
Antworten:
Hier ist eine Lösung mit
ST_Polygonize
. Es generiert ein Polygon für jede Grenze und gibt die vom Polygon abgedeckte minimale und maximale Höhe an. Der Algorithmus kann nicht zwischen einem Peak und einer Depression unterscheiden und gibt in diesen Fällen sowohl für min als auch für max die gleiche Höhe zurück.Die
WITH
Klausel der Abfrage "schließt" alle offenen Konturen, indem sie mit dem leicht kontrahierten Umfang der vorhandenen Konturen verbunden werden. (Der Umfang wird vertraglich vereinbart, um Rundungsfehler zu beseitigen, die sich aus der Verwendung von ergebenST_Extent
, die eine Box mit einfacher Genauigkeit erzeugt, mitST_Polygonize
der perfekt geschlossene und geknickte Eingaben in Doulbe-Präzision erforderlich sind.) Wenn Ihre Konturen bereits geschlossen sind (dh Sie arbeiten mit einer Insel), kann dieser Schritt weggelassen werden.quelle
Ich bin nicht sehr erfahren, aber ich würde versuchen, die Funktion Geometrie ST_MakePolygon (Geometrie Outerlinestring, Geometrie [] Innenlinestrings);
quelle
Mit Ihrer bbox und dem Durchlaufen jeder Konturlinie können Sie
ST_ConcaveHull
jeden Bereich in ein Polygon konvertieren.quelle