Bei einer Tabelle mit Liniengeometrie und einem oder mehreren Punkten, die in einer separaten Tabelle an dieser Linie ausgerichtet sind, möchte ich jede Linie mit einem oder mehreren Schnittpunkten an jeder der Stellen teilen, an denen die Linie einen Punkt schneidet.
Zum Beispiel gibt es eine Linie L mit drei Schnittpunkten A, B und C in der Reihenfolge entlang der Liniengeometrie. Ich möchte L als vier verschiedene Geometrien zurückgeben: vom Anfang von L nach A, von A nach B entlang L, von B nach C entlang L und von C bis zum Ende von L.
In der Vergangenheit habe ich diese Aufgabe formschön verwendet, was ein lineares Referenzierungsproblem darstellt ( http://sgillies.net/blog/1040/shapely-recipes/ ). Dies wäre jedoch in diesem Fall mit vielen Millionen Linien und Punkten nicht praktikabel. Stattdessen suche ich nach einer Lösung mit PostgreSQL / PostGIS.
Beachten Sie, dass Punkte auf einer Linie liegen müssen. Ferner kann sich ein Punkt gültig am Anfang oder Ende einer Linie befinden. In diesem Fall muss die Linie nicht geteilt werden (es sei denn, es gibt andere Punkte, die nicht mit den Start- oder Endpunkten derselben Linie übereinstimmen). Die Teilmengenlinien müssen ihre Richtung und ihre Attribute beibehalten, aber die Attribute der Punktmerkmale spielen keine Rolle.
quelle
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
- ich habe es bearbeitet.ST_Split
unterstützt Multi * Blades inpostgis 2.2
und über postgis.net/docs/ST_Split.htmlUpgrade auf PostGIS 2.2 , wo ST_Split erweitert wurde, um die Aufteilung durch eine mehrzeilige, mehrpunktige oder ( mehr- ) Polygongrenze zu unterstützen.
quelle
Ich habe nicht die ganze Antwort für Sie, aber ST_Line_Locate_Point verwendet eine Linie und einen Punkt als Argumente und gibt eine Zahl zwischen 0 und 1 zurück, die den Abstand entlang der Linie zu der Position darstellt, die dem Punkt am nächsten liegt.
ST_Line_Substring verwendet eine Zeile und zwei Zahlen zwischen 0 und 1 als Argumente. Die Zahlen repräsentieren Positionen auf der Linie als Bruchabstände. Die Funktion gibt das Liniensegment zurück, das zwischen diesen beiden Positionen verläuft.
Wenn Sie mit diesen beiden Funktionen arbeiten, sollten Sie in der Lage sein, das zu erreichen, was Sie tun möchten.
quelle
Ich wurde jetzt zweimal danach gefragt, also entschuldige die Verzögerung. Es ist unwahrscheinlich, dass dies als knappe Lösung angesehen wird. Ich habe es geschrieben, als ich etwas weiter unten in der Lernkurve war als ich es derzeit bin. Alle Tipps sind willkommen, auch stilistische.
quelle
Ich möchte die obigen Antworten aus der Perspektive eines Anfängers erweitern. In diesem Szenario haben Sie eine Reihe von Punkten und beobachten, wie Sie diese als "Klinge" verwenden, um Linien in Segmente zu schneiden. In diesem ganzen Beispiel wird davon ausgegangen, dass Sie Ihre Punkte zuerst an der Linie gefangen haben und dass die Punkte das eindeutige ID-Attribut von ihrer Linie haben. Ich benutze 'column_id ", um die eindeutige ID der Zeile darzustellen.
Zunächst möchten Sie Ihre Punkte in mehrere Punkte gruppieren, wenn mehr als eine Klinge auf eine Linie fällt. Andernfalls verhält sich die Funktion split_line_multipoint wie die Funktion ST_Split, was nicht das gewünschte Ergebnis ist.
Anschließend möchten Sie Ihr Netzwerk basierend auf diesen Multipunkten aufteilen.
Wiederholen Sie die Schritte 1 und 2 mit Ihren Linien, die nur einen Schnittpunkt haben. Dazu sollten Sie den Code von Schritt 1 auf 'HAVING COUNT (*) = 1' aktualisieren. Benennen Sie die Tabellen entsprechend um.
Erstellen Sie als Nächstes eine doppelte Linientabelle und löschen Sie die Einträge mit Punkten darauf.
Zuletzt verbinden Sie Ihre drei Tabellen mit
UNION ALL
:BAM!
quelle