Wie wandelt man Isoline mit Postgis in Isopolygone um?

9

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:

Geben Sie hier die Bildbeschreibung ein

Ich kenne die räumliche Ausdehnung meiner Daten, sodass ich eine Bbox hinzufügen kann, damit die LineStrings geschlossen werden können.

Geben Sie hier die Bildbeschreibung ein

Ich möchte eine Tabelle mit Isopolygonen myisopolygonsaus einer myisolinesTabelle mit Polygonen erstellen, die sich nicht überlappen, sondern eine durchgehende Oberfläche erstellen und eine Spalte valmit der niedrigsten valIsolinie 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 valsollte das von diesem bestimmten Isolin genommen werden. Optisch sollte es so aussehen:

Geben Sie hier die Bildbeschreibung ein

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.

Mofoyoda
quelle
ST_Split oder ST_BuildArea sind gute Kandidaten für Ihr Problem
Nickves

Antworten:

3

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.

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

Die WITHKlausel 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 ergeben ST_Extent, die eine Box mit einfacher Genauigkeit erzeugt, mit ST_Polygonizeder 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.

dbaston
quelle
0

Ich bin nicht sehr erfahren, aber ich würde versuchen, die Funktion Geometrie ST_MakePolygon (Geometrie Outerlinestring, Geometrie [] Innenlinestrings);

Simona
quelle
Das beantwortet die Frage nicht wirklich vollständig.
John Powell
0

Mit Ihrer bbox und dem Durchlaufen jeder Konturlinie können Sie ST_ConcaveHulljeden Bereich in ein Polygon konvertieren.

Travis Webb
quelle