Jak połączyć / zwinąć pobliskie i równoległe linie drogowe (np. Dwujezdniową) w jedną linię?

23

Mam plik kształtu z OSM, który zawiera wszystkie drogi w mieście. Większe drogi (jak drogi dwujezdniowe) wydają się mieć 2 równoległe linie. Chciałbym zwinąć / połączyć je w 1 linię, aby móc je eksportować i renderować ładnie w zewnętrznej aplikacji 3D (2 nakładające się drogi będą skomplikowane i będą wyglądać dziwnie w 3D).

Jak mogę to osiągnąć za pomocą QGIS lub PostGIS? Nie martwię się o niewielką utratę dokładności (w odległości kilku metrów) i chciałbym, aby wynikowa pojedyncza linia znajdowała się pomiędzy (najlepiej środkiem) obecnych równoległych linii.

Dziękuję Ci.

(oto przykład podwójnych linii drogowych, które chcę połączyć)

wprowadź opis zdjęcia tutaj

Robin Hawkes
źródło

Odpowiedzi:

3

ESRI ma narzędzie do zwijania podwójnej jezdni do linii środkowej. Możesz uzyskać tanią wersję do użytku z OSM. W przeciwnym razie możesz wybrać funkcje i zapisać jako nową warstwę. Usuń wybrane z warstwy użytej do eksportu. Funkcja buforowania w zasięgu jednej strony jezdni, która obejmuje drugi pas. Połącz plik kształtu z oryginalnym, podłącz dowolną zepsutą topologię.

Jeśli potrafisz napisać kod i / lub skrypt, możesz uśrednić linię środkową między liniami w węźle według segregacji przez dopasowanie węzła i wygenerować linię środkową programowo, a następnie programowo usunąć wybrane funkcje używane w procesie produkcyjnym, sprawdzić i naprawić zepsutą topologię, a ty gotowy.

Znalazłem próbkę kodu Arcpy, w tym, jak znaleźć link znajduje się poniżej w komentarzach.

przypisane do Pomocy ESRI ARCGis

# Name: CollapseDualLinesToCenterline_Example.py
# Description: Creates street centerlines from a street casing coverage.
# Requirements: ArcInfo Workstation

# Import system modules
import arcpy
from arcpy import env

# Set environment settings
env.workspace = "C:/data"

# Set local variables
inCover = "streets"
outCover = "C:/output/centerlines"
maximumWidth = 50

# Execute CollapseDualLinesToCenterline
arcpy.CollapseDualLinesToCenterline_arc(inCover, outCover, maximumWidth, "")
chwytak
źródło
czy możesz podać link do zwinięcia ESRI do narzędzia linii środkowej? Nie mogłem tego znaleźć. Jedyne, co mogłem znaleźć, to sekcja Edycja dwujezdniowych dróg na tej stronie .
Fezter
Pomoc ArcGIS generuje unikalne łącza, które nie zawierają odnośników jako odsyłaczy, które widzę, więc ... przejdź do resources.arcgis.com/en/help/main/10.1/index.html i wyszukaj Zwiń podwójne linie do linii środkowej (zasięg) oryginalny link pochodzi z dyskusji i może być niepoprawny, ponieważ potrzebujesz ArcGIS na pulpicie Advanced: Wymaga zainstalowanej aplikacji ArcInfo Workstation
lewis
1
Większość użytkowników nie powinna używać narzędzia „Pokrycie” (które wymaga stacji roboczej), chyba że wyraźnie pracuje z danymi pokrycia Arc7. Zamiast tego w większości przypadków użyj opcji Zwiń podwójne linie do linii środkowej (kartografia) .
RyanDalton
2

Możesz spróbować użyć szkieletu Mike'a Migurskiego . To narzędzie typu open source, którego używa do takich rzeczy, jak styl mapy terenu.

Sarge
źródło
1

Może nie jest to zbyt eleganckie rozwiązanie i opiera się na metodzie odpowiedzi na pytanie: /gis//a/295348/120129 .

Jest to jeden z wariantów rozwiązania twojego pytania, skonfiguruj instrument geograficzny (dla mnie jest to droga o nazwie „road_border” o szerokości 11 m, typ - linia (MultiLineString)),

uruchomić geoinstrument :-),

WITH 
      tbla AS (SELECT id, ((ST_DumpPoints(geom)).geom) geom FROM road_border),
      tblb AS (SELECT (ST_Buffer((ST_Dump(geom)).geom, 0.0001)) geom FROM tbla),
      tblc AS (SELECT ST_Centroid(ST_UnaryUnion(Unnest(ST_ClusterWithin(geom, 0.0001)))) geom FROM tblb),
      tbld AS (SELECT ((ST_Dump(ST_DelaunayTriangles(ST_Collect(geom)))).geom) geom FROM tblc),
      tble AS (SELECT (ST_Boundary(geom)) geom FROM ST_Dump((SELECT ST_Polygonize(geom) geom FROM (SELECT ST_Union(geom) geom FROM
      (SELECT ST_ExteriorRing(geom) geom FROM tbld) AS lines) AS foo))),
      tblf AS (SELECT ST_MakeLine(p1, p2) geom FROM (SELECT ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) p1,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom))) p2 FROM tble) AS geom),
      tblj AS (SELECT ST_Buffer((ST_Dump(ST_Union(ST_Buffer(geom, 0.0005)))).geom, -0.0005) geom FROM road_border)
      SELECT ST_Intersection (a.geom, b.geom) geom FROM tblf a JOIN tblj b ON ST_Within (a.geom, b.geom);

i zobacz wynik.

Powodzenia wszystkim :-),

Oryginalne rozwiązania ...

Ten skrypt nazywa się - ST_RoadAxisFromDelaunayTriangulation ...

Cyryl
źródło