Wie kann ich in PostGIS Polylinien in Punkte alle n Meter umwandeln?


14

Frage in etwa das gleiche wie das , aber ich muss PostGIS verwenden.

Ich habe eine Reihe von Polylinien und möchte sie alle n Meter entlang dieser Linien in Punkte umwandeln.

edit: Vielen Dank an Stefan. Meine letzte Abfrage war etwas anders, wahrscheinlich aufgrund einer älteren Version von PostGIS (1.5), aber am Ende bekam ich, was gebraucht wurde. Die Punkte wurden zu einer Heatmap der Straßendichte kombiniert. Bildbeschreibung hier eingeben


Antworten:


17

Diese Abfrage sollte den Trick machen:

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. Zunächst wählen Sie mit die verschiedenen Linienfolgen aus Ihrer Polylinestring-Spalte aus ST_Dump

  2. Dann müssen Sie die Measure-Elemente mit definieren ST_AddMeasure, beginnend mit 0 (Beginn der Linienfolge) und dem Ende der Linienfolge (genauso wie die Länge der Linienfolge). Generate_seriesErstellt eine Reihe über diese Messung in Schritt 10. Hier können Sie definieren "n metres"(in diesem Beispiel 10 Meter). Der iWert beginnt bei jedem Zeilenumbruch neu.

  3. Mit ST_LocateAlongund ST_GeometryNerstellen Sie eine mehrdimensionale Punktgeometrie.

  4. Zuletzt müssen Sie die X- und Y-Werte dieser Geometrie extrahieren und daraus einen Punkt erstellen.

Das Ergebnis könnte so aussehen: Bildbeschreibung hier eingeben

BEARBEITEN

Um fair zu sein, möchte ich diese Informationen hinzufügen: Die Idee und die Abfrage in dieser Antwort werden aus einer Abfrage extrahiert, mit der ich in PostGIS Drapierlinien aus DEMs erstelle. Die hervorragende Umsetzung wird in diesem Artikel von Mathieu Leplatre erläutert.


Können Sie erklären, b / c ich bin nicht vertraut mit diesen SQL-Konstrukten: wo WITH line ASwird verwendet? Ich sehe anderswo keine Linie.
Culebrón

2
@ culebrón The WITH Querybietet die Verwendung von temporären Tabellen für größere Abfragen. Hier einige Informationen: postgresql.org/docs/8.4/static/queries-with.html . linewird in der nächsten Unterabfrage verwendet linemeasure. Die ausgewählten Daten in dieser Unterabfrage basieren auf den in der lineUnterabfrage getroffenen Auswahlen. Sie bauen aufeinander auf. Hoffe das hat geholfen!
Stefan

In PostGIS älter als 2.0 ist die Funktion st_locate_along_measure.
Culebrón
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.