Jak mogę przekształcić polilinie w punkty co n metrów w PostGIS?

14

Pytanie w prawie taki sam, jak ten , ale muszę użyć PostGIS.

Mam wiele polilinii i chcę przekształcić je w punkty co n metrów wzdłuż tych linii.

edycja: Wielkie dzięki dla Stefana. Moje ostatnie zapytanie było nieco inne, prawdopodobnie ze względu na starszą wersję PostGIS (1.5), ale ostatecznie dostałem to, co było potrzebne. Punkty połączono w mapę cieplną gęstości dróg. wprowadź opis zdjęcia tutaj

culebrón
źródło

Odpowiedzi:

17

To zapytanie powinno załatwić sprawę:

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. Najpierw wybierasz wyraźne linie z kolumny polilinestring za pomocą ST_Dump

  2. Następnie musisz zdefiniować elementy miary ST_AddMeasure, zaczynając od 0 (początek oznaczenia linii) i na końcu oznaczenia linii (taka sama jak długość oznaczenia linii). Generate_seriestworzy serię na podstawie tego pomiaru o krok 10. Tutaj możesz zdefiniować "n metres"(w tym przykładzie 10 metrów). iWartość zaczyna się od nowa za każdym LINESTRING.

  3. Za pomocą ST_LocateAlongi ST_GeometryNtworzysz wielowymiarową geometrię punktów.

  4. Na koniec musisz wyodrębnić wartości X i Y tej geometrii i utworzyć z niej punkt.

Wynik może wyglądać następująco: wprowadź opis zdjęcia tutaj

EDYTOWAĆ

Aby być uczciwym, chcę dodać te informacje: Pomysł i zapytanie zawarte w tej odpowiedzi zostały wyodrębnione z zapytania, którego używam do tworzenia linii obłożenia z DEM w PostGIS. Doskonałe wdrożenie tego wyjaśniono w tym artykule Mathieu Leplatre.

Stefan
źródło
Czy możesz wyjaśnić, b / c Nie znam tych konstrukcji SQL: gdzie WITH line ASjest używany? Nigdzie nie widzę „linii”.
culebrón
2
@ culebrón WITH QueryZapewnia stosowanie tabel tymczasowych dla większych zapytań. Oto kilka informacji: postgresql.org/docs/8.4/static/queries-with.html . linejest używany w następnym podzapytaniu linemeasure. Wybrane dane w tym podzapytaniu są oparte na wyborach dokonanych w tym linepodzapytaniu. Są zbudowane na sobie. Mam nadzieję, że to pomogło!
Stefan
W PostGIS starszym niż 2.0 ta funkcja jest st_locate_along_measure.
culebrón