Punktprobenahme entlang einer polumwickelten Küste mit PostGIS


11

Ich arbeite an einer Aufgabe, bei der ich alle 1000 km entlang der Küsten Probenpunkte sammeln muss, und bin auf ein Problem mit der Antarktis gestoßen. Soweit ich das beurteilen kann, scheint es ein Problem mit der Verwendung von Geometrie in den Funktionen zu sein, wenn ich wirklich denke, dass Geografie für diese Operation verwendet werden sollte.

Mit der Funktion aus dieser sehr ähnlichen Frage kann ich ein Ergebnis erzielen, das folgendermaßen aussieht : schlechtes Ergebnis.

Wie Sie sehen können ST_AddMeasure()und ST_LocateAlong()die Geometrie nicht kugelförmig zu behandeln scheinen, entstehen viele Punkte am Südpol. Auf dem Clip entlang der Datumsgrenze (linke Seite) wurde sogar ein Punkt hinzugefügt. Gemäß der Dokumentation dieser beiden Funktionen kann nur Geometrie verwendet werden.

Der zum Generieren des Polygons und der Punkte verwendete Code befindet sich hier . Dies ist jedoch die SQL, die zum Generieren der Punkte verwendet wird:

CREATE TABLE atest AS WITH line AS 
  (SELECT
      id,
      ST_ExteriorRing((ST_Dump(geom)).geom) AS geom
    FROM line_sample_test),
linemeasure AS
    (SELECT
        ST_AddMeasure(line.geom, 0, (ST_Length(line.geom))::int) AS linem,
    generate_series(0, (ST_Length(line.geom))::int, 10) AS i
FROM line),

geometries AS (
    SELECT
        i,
        ST_LocateAlong(linem, i) AS geom 
    FROM linemeasure)

SELECT
    * from geometries;

Wie kann ich alle 1000 km entlang dieser Küste Punkte generieren?


Haben Sie ST_Segmentize ausprobiert? Es kann auch nur mit Geometrien arbeiten, scheint aber zumindest eine schnellere Möglichkeit zu sein, die Punkte zu generieren. Wie auch immer, warum nicht einfach Punkte an der Stange entfernen? Es sieht eher nach einem Nebeneffekt der verwendeten Projektion als nach einem Fehler aus.
Lynxlynxlynx

5
Auf Ihrem Bild sieht es so aus, als hätten Sie Ihre Geometrie in EPSG: 4326. Die Antarktis eignet sich besser für eine polare stereografische Projektion wie EPSG: 3031. Selbst dann sieht es so aus, als müssten Sie sich möglicherweise mit einer Schnittlinie zur Stange und zurück entlang der Datumsgrenze befassen.
Toby Speight

Antworten:


3

Wie in einem der Kommentare vorgeschlagen, würde ich zuerst die Eingabegeometrie in eine polare stereografische Projektion umwandeln.

Zusätzlich sollten Sie ST_Bufferes (mit einer Menge von 0) verwenden, um die resultierende Schnittlinie zu entfernen .

Dies würde also Ihr gewünschtes Ergebnis erzielen:

-- ST_Transform(geom,3031) reprojects to south polar stereographic,
-- in meters.  ST_Buffer(...) doesn't change the shape, but removes
-- the cut line to the pole (at 180 degrees).
WITH line AS (
    SELECT ST_ExteriorRing(
        ST_Buffer(ST_Transform(geom, 3031), 0)
    ) AS geom
    FROM line_sample_test
),

-- This just generates a table of numbers.  In this case, from 0
-- to the geometry length, counting by 1,000,000 (1000 km).
linemeasure AS (
    SELECT generate_series(0, ST_Length(geom)::int, 1000000) AS i
    FROM line
),

-- Convert those values to a fraction of the overall length (for
-- use as input to ST_LineInterpolatePoint)
linefraction AS (
    SELECT i / ST_Length(geom) AS fraction
    FROM line, linemeasure
),

-- Do the interpolation
geometries AS (
    SELECT ST_LineInterpolatePoint(l.geom, lf.fraction) AS geom
    FROM linefraction lf, line l
),

-- Convert back to EPSG:4326 (i.e. lat/lon coords)
geometries_4326 AS (
    SELECT ST_Transform(geom, 4326) AS geom FROM geometries
)
SELECT * FROM geometries_4326

Beachten Sie, dass diese Abfrage davon ausgeht, dass die line_sample_testTabelle nur eine Zeile enthält. Passen Sie sie daher nach Bedarf für Ihre tatsächlichen Eingabedaten an.


Ich kannte den ST_Buffer(geom, 0)Trick nicht, um die Schnittlinie zu beseitigen - das ist nützlich!
Toby Speight
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.