[FOSSGIS-Talk] Split Lines at Points
Bernd Marcus
bmarcus at giswana.de
Mi Mai 5 10:14:58 CEST 2021
Hallo in die Runde,
dank Nicol ist die Frage nach dem Splitten von Linien durch einen
Punkt-Layer noch einmal aufgegriffen worden.
Generell kann eine Linie nur dort von einem Punkt geschnitten
werden, wo ein Vertex deckungsgleich mit einem schneidenden Punkt
ist. Da diese Voraussetzung in den meisten Fällen nicht erfüllt ist,
müssen zuvor neue Stützpunkte in die Linie eingearbeitet werden.
Dies ist mit der Schnappfunktion ein recht einfaches Unterfangen, es
gilt jedoch 3 Dinge zu bedenken:
1. Schnappdistanzen, die größer als Liniensegmente sind, bleiben für
diese Linienabschnitte unberücksichtigt, da diese sich sonst in
einem Punkt verdichten würden
2. das Schnappen verändert den Linienverlauf; je weiter die Punkte
von der Linie entfernt sind, desto stärker wird die Linie
deformiert; ist dies nicht erwünscht, müssen im Vorfeld die Punkte
auf die Lage der Linie gebracht werden
3. die Punktgeometrie sollte die Gesamtheit aller Punkte abbilden,
da ansonsten für jeden einzelnen Punkt das Schnappen durchgeführt
wird
Hier ein Anschauungsbeispiel, wie es unter QGIS im SQL-Editor der
DB-Verwaltung aufgerufen werden kann:
with
-- Punkt-Geometrie
pt (geom) as (
select geomFromText('MULTIPOINT((0 5), (0 9), (5 9))')
)
-- Linien-Geometrie
, ln (geom) as (
select makeline(
makepoint(0, 0), makepoint(0, 12)
)
)
-- SpatiaLite Pendant zu PostGIS's st_split für Linien
select st_linesCutAtNodes(
ln.geom, pt.geom
) as geom
from pt, ln
union all
select st_linesCutAtNodes(
-- Schnappen mit Distanz > Länge größtes Liniensegment
st_snap(ln.geom, pt.geom, 5.00000000000001)
, pt.geom
) as geom
from pt, ln
union all
select st_linesCutAtNodes(
-- Schnappen mit Distanz > Länge kürzestes Liniensegment
st_snap(ln.geom, pt.geom, 5)
, pt.geom
) as geom
from pt, ln
union all
select st_linesCutAtNodes(
-- Schnappen mit minimalster Distanz
--- ergo: Distanz < Länge kürzestes Liniensegment
st_snap(ln.geom, pt.geom, 0.00000000000001)
, pt.geom
) as geom
from pt, ln
;
::Ausgabe::
geom
LineString (0 0, 0 12)
MultiLineString ((0 5, 0 9),(0 9, 5 9))
MultiLineString ((0 0, 0 5),(0 5, 0 9))
MultiLineString ((0 0, 0 5),(0 5, 0 9),(0 9, 0 12))
Die mehrteiligen Geometrien können dann anschließend in einzelne
Linien überführt werden.
Euch eine gute Zeit
Bernd Marcus
__________________________________
GISwana - Datentektonik
Am Steneberg 10 | D-37133 Friedland
T: +49 (0)5504 949 844 7
M: +49 (0)176 816 991 64
@: bmarcus at giswana.de
U: https://www.giswana.de/
Am Dienstag, 4. Mai 2021, 12:00:01 CEST schrieb fossgis-talk-liste-
request at fossgis.de:
> Message: 3
> Date: Mon, 03 May 2021 19:38:46 +0200
> From: Nicol Hermann <mapserver at geoworld.de>
> To: Alex Wieschmann <alex at wieschmann.de>, mike at elstermanns.de
> Cc: fossgis-talk-liste at fossgis.de
> Subject: Re: [FOSSGIS-Talk] Split Lines at Points
> Message-ID:
>
> <b9ecde49f854eb09bcb7f4e661e91a96766b3a5d.camel at geoworld.de>
> Content-Type: text/plain; charset="UTF-8"
>
> Hallo Alex,
>
> ich habe ein sehr ähnlich Problem vor ein paar Tagen auf der
> PostGIS Liste geposted
> Siehe:
> https://lists.osgeo.org/pipermail/postgis-users/2021-April/044877.
> html
>
> Ich habe von Martin Antwort bekommen, allerdings ohne die ST_Split
> Funktion die ich eigentlich verwenden wollte.
> Vielleicht hilft Dir das ja weiter.
>
> Gruß Nicol
>
> Am Sonntag, den 15.11.2020, 08:51 +0100 schrieb Alex Wieschmann:
> > Nein, leider nicht. Der Algorithmus scheint nur bei sehr
> > einfachen Linien zu funktionieren. Ich habe ein kleines
> > Netzwerk und da werden lauter neue Querverbindungen
> > eingebaut...
> > Bisher konnte auch keine andere Idee bei
> > https://gis.stackexchange.com weiterhelfen...
> >
> > Viele Grüße
> > Alex
> >
> >
> > -----Ursprüngliche Nachricht-----
> > Von: mike at elstermanns.de [mailto:mike at elstermanns.de]
> > Gesendet: Sonntag, 15. November 2020 05:31
> > An: Alex Wieschmann <alex at wieschmann.de>
> > Cc: fossgis-talk-liste at fossgis.de
> > Betreff: Re: [FOSSGIS-Talk] Split Lines at Points
> >
> > Hilft das weiter?
> >
> > https://gis.stackexchange.com/questions/184191/splitting-a-line-> > layer-using-another-point-layer
> >
> > BG, mikeE., der #geoObserver.
> > http://www.geoobserver.de
> >
> > Gesendet mit der 1&1 Mail App
> >
> > Am 14.11.20 um 22:47 schrieb Alex Wieschmann
> >
> > > Guten Abend zusammen,
> > >
> > >
> > >
> > > ich finde gerade keine Möglichkeit in PostGIS oder QGIS eine
> > > Line
> > > (dabei ist es wichtig, dass es sich tatsächlich um eine
> > > zusammenhängende Linie handelt, also ein Feature) über einen
> > > Punktlayer zu splitten?
> > >
> > > Der St_Split erzeugt auch an jedem Stützpunkt der Linie ein
> > > Teilsegment.
> > >
> > >
> > >
> > > Wenn die Linie bereits über Teilsegmente verfügt, lässt sich
> > > das
> > > einfach wieder über ein Attribut gruppieren und macht somit
> > > keine
> > > Probleme.
> > >
> > >
> > >
> > > Vielen Dank für Anregungen
> > >
> > >
> > >
> > >
> > > Gruß Alex
> > >
> > > --
> > > ..............................................................
> > > ..... .
> > > FOSSGIS Veranstaltungen
> > > https://www.fossgis.de/news/fossgis-events/
> > >
> > > FOSSGIS e.V, der Verein zur Förderung von Freier Software aus
> > > dem
> > > GIS-Bereich und Freier Geodaten!
> > > https://www.fossgis.de/
> > > https://twitter.com/fossgis_eV
> > >
> > > ______________________________________________________________
> > > _____ _
> > > FOSSGIS-Talk-Liste mailing list
> > > FOSSGIS-Talk-Liste at fossgis.de
> > > https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste