Come posso trasformare le polilinee in punti ogni n metri in PostGIS?


14

Domanda praticamente uguale a questa , ma devo usare PostGIS.

Ho un numero di polilinee e voglio trasformarle in punti ogni n metri lungo queste linee.

modifica: Grazie mille a Stefan. La mia query finale era un po 'diversa, probabilmente a causa della versione precedente di PostGIS (1.5), ma alla fine ho ottenuto ciò che era necessario. I punti sono stati combinati in una mappa di calore della densità delle strade. inserisci qui la descrizione dell'immagine


Risposte:


17

Questa query dovrebbe fare il trucco:

WITH line AS 
    (SELECT
        your_polylinestring_id,
        (ST_Dump(geom)).geom AS geom
    FROM your_polylinestring_table),
linemeasure AS
    (SELECT
        ST_AddMeasure(line.geom, 0, ST_Length(line.geom)) AS linem,
        generate_series(0, ST_Length(line.geom)::int, 10) AS i
    FROM line),
geometries AS (
    SELECT
        i,
        (ST_Dump(ST_GeometryN(ST_LocateAlong(linem, i), 1))).geom AS geom 
    FROM linemeasure)

SELECT
    i,
    ST_SetSRID(ST_MakePoint(ST_X(geom), ST_Y(geom)), 31468) AS geom
FROM geometries
  1. Inizialmente si selezionano le distinzioni di linea distinte dalla colonna polylinestring con ST_Dump

  2. Quindi devi definire gli elementi di misura con ST_AddMeasure, iniziando con 0 (inizio della stringa lineare) e la fine della stringa lineare (uguale alla lunghezza della stringa lineare). Generate_seriescrea una serie su questa misura con il passaggio di 10. Qui è possibile definire "n metres"(in questo esempio 10 metri). Il ivalore inizia di nuovo per ogni stringa lineare.

  3. Con ST_LocateAlonge ST_GeometryNcrei una geometria punto multidimensionale.

  4. Infine, devi estrarre i valori X e Y di questa geometria e creare un punto da essa.

Il risultato potrebbe essere simile al seguente: inserisci qui la descrizione dell'immagine

MODIFICARE

Ad essere sincero, voglio aggiungere queste informazioni: l'idea e la query in questa risposta sono estratte da una query che sto usando per creare linee drappeggiate da DEM in PostGIS. L'eccellente attuazione di questo è spiegato in questo articolo di Mathieu Leplatre.


Puoi chiarire, b / c non ho familiarità con questi costrutti SQL: dove WITH line ASviene utilizzato? Non vedo 'linea' altrove.
culebrón,

2
@ culebrón Il WITH Queryfornisce l'uso di tabelle temporanee per query più grandi. Ecco alcune informazioni: postgresql.org/docs/8.4/static/queries-with.html . lineviene utilizzato nella sottoquery successiva linemeasure. I dati selezionati in questa sottoquery si basano sulle selezioni effettuate nella linesottoquery. Sono costruiti l'uno sull'altro. Spero che abbia aiutato!
Stefan

In PostGIS precedente alla 2.0 la funzione è st_locate_along_measure.
culebrón,
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.