Punto campionamento lungo una costa avvolgente con PostGIS


11

Sto lavorando a un'attività che mi richiede di ottenere punti campione ogni 1000 km lungo le coste e di avere un problema con l'Antartide. Da quello che posso dire, sembra essere un problema con l'uso della geometria nelle funzioni, quando in realtà penso che la geografia dovrebbe essere utilizzata per questa operazione.

Utilizzando la funzione da questa domanda molto simile , sono in grado di produrre un risultato che assomiglia a questo: brutto risultato.

Come puoi vedere, ST_AddMeasure()e ST_LocateAlong()non sembra trattare la geometria sferica, il che si traduce in molti punti che si trovano sul Polo Sud. È stato anche aggiunto un punto sulla clip lungo la linea della data (lato sinistro). Per la documentazione di queste due funzioni, è possibile utilizzare solo la geometria .

Il codice utilizzato per generare il poligono e i punti può essere trovato qui , ma questo è l'SQL utilizzato per generare i punti:

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;

Come posso generare punti ogni 1000 km lungo questa costa?


Hai provato ST_Segmentize? Inoltre può funzionare solo su geometrie, ma almeno sembra un modo più rapido per generare i punti. Ad ogni modo, perché non rimuovere semplicemente i punti sul palo? Sembra più un effetto collaterale della proiezione usata che un bug.
Lynxlynxlynx,

5
Dalla tua foto, sembra che tu abbia la tua geometria in EPSG: 4326. L'Antartide è più adatto a una proiezione stereografica polare come EPSG: 3031. Anche allora, sembra che potresti aver bisogno di occuparti di una linea di taglio sul palo e sul retro, lungo la linea della data.
Toby Speight,

Risposte:


3

Come suggerito in uno dei commenti, prima trasformerei la geometria di input in una proiezione stereografica polare.

Inoltre, ti consigliamo di usarlo ST_Buffer(con una quantità di 0) per sbarazzarti della linea di taglio risultante.

Quindi questo otterrebbe il risultato desiderato:

-- 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

Nota che questa query presuppone che ci sia solo una riga nella line_sample_testtabella, quindi modifica quanto necessario per i tuoi dati di input reali.


Non conoscevo il ST_Buffer(geom, 0)trucco per eliminare la linea di demarcazione: è utile!
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.