Как я могу объединить / свернуть близлежащие и параллельные дорожные линии (например, проезжую часть с двумя проезжими частями) в одну линию?

23

У меня есть шейп-файл из OSM, который содержит все дороги в городе. Большие дороги (например, с двумя проезжими частями), похоже, имеют 2 параллельные линии. Я хотел бы свернуть / объединить их в одну строку, чтобы я мог хорошо их экспортировать и визуализировать во внешнем 3D-приложении (2 пересекающиеся дороги будут сложными и будут выглядеть странно в 3D).

Как я могу добиться этого с помощью QGIS или PostGIS? Меня не беспокоит небольшая потеря точности (в пределах нескольких метров), и я хотел бы, чтобы результирующая единая линия находилась между (в идеале, центром) текущих параллельных линий.

Спасибо.

(вот пример двойных дорожных линий, которые я хочу объединить)

введите описание изображения здесь

Робин Хоукс
источник

Ответы:

3

ESRI имеет двухполосную развалку к осевой линии инструмента. Вы можете получить дешевую версию для использования с OSM. В противном случае вы можете выбрать объекты и сохранить как новый слой. Удалить выбранный из слоя, который вы использовали для экспорта. Функция буфера в пределах досягаемости одной стороны проезжей части, которая включает в себя вторую полосу движения. Объедините шейп-файл с оригинальным, подключите любую сломанную топологию.

Если вы можете кодировать и / или писать сценарий, вы можете усреднить центральную линию между полосами на узле по сегментам путем сопоставления узлов и программно вывести центральную линию, а затем программно удалить выбранные объекты, используемые для производственного процесса, проверить и исправить нарушенную топологию, и вы сделанный.

Я нашел пример кода arcpy, который я включаю, как найти ссылку ниже в комментариях.

приписывается Справке 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, "")
Льюис
источник
Не могли бы вы, пожалуйста, ссылку на инструмент ESRI развал к центральной линии? Я не мог найти это. Единственное, что я смог найти, это раздел «Редактирование двух проезжих частей» на этой странице .
Фезтер
Справка ArcGIS генерирует уникальные ссылки, которые не имеют ссылки в виде ссылки с табличкой, которую я вижу, поэтому ... перейдите на resources.arcgis.com/en/help/main/10.1/index.html и выполните поиск Свернуть двойные линии в осевую линию (покрытие) исходная ссылка была получена в результате обсуждения и может быть неправильной, так как вам нужна ArcGIS for Desktop Advanced: требуется установленная рабочая станция ArcInfo
lewis
1
Большинству пользователей не следует использовать инструмент «Покрытие» (для которого требуется рабочая станция), за исключением случаев, когда вы явно работаете с данными покрытия Arc7. Вместо этого в большинстве случаев используйте функцию «Свернуть двойные линии на осевую линию» (картография) .
RyanDalton
2

Вы можете попробовать использовать Mike Migurski в Skeletron . Это инструмент с открытым исходным кодом, который он использует для таких вещей, как стиль карты местности.

сержант
источник
1

Возможно, это не очень элегантное решение, и оно основано на методе ответа на вопрос: /gis//a/295348/120129 .

Это один из вариантов решения вашего вопроса, настройка геоинструмента (для меня это дорога с названием "road_border" шириной 11 м, type-line (MultiLineString)),

запустить геоинструмент :-),

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);

и увидим результат.

Всем удачи :-),

Оригинальные решения ...

Этот скрипт называется - ST_RoadAxisFromDelaunayTriangulation ...

Сирил
источник