Hoe een parallel lopende lijn uitlijnen met het dichtstbijliggende lijnsegment in Postgis

Ik heb een wegennetwerk tabel en een dataset die uit meerdere lijnen bestaat in Postgis.

.

De meeste van deze lijnen lopen (grotendeels) parallel aan het wegennetwerk maar de afstand tussen deze lijnen en het wegennetwerk kan een paar meter verschillen. Aangezien de lijnen iets zeggen over de conditie van de wegdelen waar ze parallel aan liggen, wil ik graag een nieuw lijnsegment creëren dat uitgelijnd is met het dichtstbijliggende wegsegment. De blauwe lijnen in het voorbeeld hieronder is wat ik uiteindelijk wil bereiken.

Iemand een idee hoe ik dit vraagstuk het beste zou kunnen aanpakken?

In postgis zelf zou ik niet weten hoe, maar in QGis: snap geometries to layer

(ben benieuwd naar de resultaten, ook om inhoudelijke redenen)

ST_OffsetCurve is your friend:
ST_OffsetCurve

Barend Köbben

Dank voor je suggestie, toch vrees ik dat de ST_OffsetCurve niet het gewenste resultaat oplevert aangezien de afstand tussen de twee lijnensets behoorlijk kan verschillen. Bovendien wil ik niet alleen dat de lijn wordt verplaatst, maar dat deze ook de vorm van het dichtstbijzijnde wegsegment aanneemt, zoals te zien is bij de onderste lijn in het voorbeeld

Dank voor je antwoord. De uitdaging van mijn vraagstuk is echter om het ‘juiste’ dichtstbijliggende wegsegment te vinden, aangezien de zijstraten in sommige gevallen dichterbij de lijnpaden (de rode lijnen in mijn voorbeeld) liggen dan de wegsegmenten die ik uiteindelijk hoop te matchen. Zoals in het voorbeeld hieronder. Snap Geometries to layer is helaas niet geavanceerd genoeg om hier rekening mee te houden

deze ook de vorm van het dichtstbijzijnde wegsegment aanneemt
Tsja, dan moet je de OffsetCurve vanaf die lijn doen, lijkt me…

Maar aangezien de offset dan 0 is is een kopie al voldoende. Volgens mij moet de logica worden:

  • van elke rode lijnh et centrum nemen en kijken welke groene lijn daar het dichste bij ligt.
  • deze groene lijn kopieren in een blauwe lijn en de attributen van de rode lijn kopieren
    Dan ga ik er wel van uit dat die lijnen allemaal keurige “edges” zijn tussen de “nodes” van het netwerk en dus niet weer bestaan uit allerlei kleine stukkies…

En ja, dat kan in SQL maar is best een puzzel om dat draaiende te krijgen…

Interssant vraagstukje. Ik zou zoiets proberen (met hulp van Barend’s idee):

SELECT r.gid, r.andere_eigenschappen, g.geom, ST_Distance(r.geom, g.geom) AS afstand
FROM
(SELECT gid, andere_eigenschappen, ST_Centroid(ST_Envelope(geom)) AS geom FROM rodelijntjes) AS r
JOIN groenelijntjes AS g
ON ST_DWithin(r.geom, g.geom, xxx);

  1. Je maakt een ST_Envelope van de rode lijntjes, en daar pak je dan de centroïde van. Aanname is dat ze wel ongeveer recht zijn, anders krijg je vermoedelijk vreemde resultaten.
  2. Vervolgens join je dat met de groene lijnen. Ik doe hier een ST_DWithin, met xxx als maximale afstand, om het rekenwerk zo snel mogelijk te krijgen.
  3. Vervolgens selecteren wat je nodig hebt en dat koppelen aan de groene lijn.

Je bent er dan nog niet helemaal, want je moet de boel ook nog sorteren op afstand, en dan steeds van elke groene lijn de bijbehorende rode lijn-eigenschappen nemen. Dus een query eromheen met SELECT DISTINCT zou ik zeggen.

Hopelijk biedt dit een richting?

Interessante aanpak, waarvoor dank. Ik vrees echter dat dat niet gaat werken omdat de rode lijntjes lang niet allemaal recht zijn. Ook buigen de uiteinde van de lijntjes in sommige gevallen af wat dit vraagstuk nog wat lastiger maakt. Ik moet denk ik eerst maar eens een manier zien te vinden om voor elk rode lijnstuk, het gehele wegsegment dat daar parallel aan ligt te selecteren

Hmmmm nou wordt het toch wat gecompliceerder, wel leuk :grinning:

Twee richtingen die me dan te binnen schieten:

  1. Iets met ST_Buffer doen vanuit de rode lijnen, en dan kijken hoeveel van elke groene lijn daar binnen valt.
  2. Rode lijnstukjes opknippen en van alle losse stukjes de afstand naar een groene lijn bepalen, kijken welke groene lijn ‘gemiddeld’ de kortste afstand heeft over alle deelstukjes van een rode lijn.

Wellicht een combi van die twee. En natuurlijk kan dat wel in PostGIS.
Maar … niet eenvoudig, niet iets dat ik in de lesstof voor beginners zou verwerken. En het vergt ongetwijfeld het nodige trial & error werk om dat goed te krijgen.

Voor nu zou ik zeggen: succes!