Como mesclar / reduzir linhas de estradas próximas e paralelas (por exemplo, uma faixa de rodagem dupla) em uma única linha?

23

Eu tenho um shapefile do OSM que contém todas as estradas dentro de uma cidade. As estradas maiores (como faixas de rodagem dupla) parecem ter 2 linhas paralelas. Gostaria de recolher / combinar esses dados em uma linha para que eu possa exportá-los e renderizá-los perfeitamente em um aplicativo 3D externo (duas estradas sobrepostas serão complicadas e parecerão estranhas em 3D).

Como posso conseguir isso com QGIS ou PostGIS? Não estou preocupado com uma leve perda de precisão (a alguns metros) e gostaria que a linha única resultante estivesse entre (idealmente o centro) as linhas paralelas atuais.

Obrigado.

(aqui está um exemplo das linhas duplas que eu quero combinar)

insira a descrição da imagem aqui

Robin Hawkes
fonte

Respostas:

3

A ESRI possui uma faixa de rodagem dupla em colapso para a ferramenta da linha central. Você pode obter uma versão barata para uso com o OSM. Caso contrário, você poderá selecionar os recursos e salvar como uma nova camada. Exclua a camada selecionada usada para exportação. Recurso de buffer dentro do alcance de um lado da faixa de rodagem que inclui a segunda faixa. Mesclar shapefile com o original, conectar qualquer topologia quebrada.

Se você pode codificar e / ou script, pode calcular a média de uma linha central entre as faixas de um nó por seg, correspondendo o nó e produzindo uma linha central programaticamente e, em seguida, excluir programaticamente os recursos selecionados usados ​​para o processo de produção, verifique e corrija a topologia quebrada. feito.

Encontrei um exemplo de código arcpy que estou incluindo, como encontrar o link abaixo nos comentários.

atribuído à ajuda da 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, "")
Lewis
fonte
você poderia vincular ao ESRI collapse to centerline tool? Não consegui encontrar. A única coisa que encontrei foi a seção Edição de faixas duplas desta página .
Fezter
A ajuda do ArcGIS gera links únicos que não fazem referência como link vinculado que eu vejo, então ... vá para resources.arcgis.com/en/help/main/10.1/index.html e pesquise Collapse Dual Lines To Centerline (Coverage) the O link original veio de uma discussão e pode estar errado, pois você precisa do ArcGIS for Desktop Advanced: Requer a Estação de Trabalho ArcInfo instalada
lewis
1
A maioria dos usuários não deve usar a ferramenta "Cobertura" (que requer Estação de Trabalho), a menos que trabalhe explicitamente com os dados de cobertura do Arc7. Em vez disso, use Recolher linhas duplas na linha central (cartografia) na maioria dos casos.
22413 RyanDalton
2

Você pode tentar usar o Skeletron de Mike Migurski . É uma ferramenta de código aberto que ele usa para coisas como o estilo de mapa do terreno.

Sarge
fonte
1

Talvez não seja uma solução muito elegante e seja baseada no método de resposta à pergunta: /gis//a/295348/120129 .

É uma das variantes de solução da sua pergunta, configure um geoinstrumento (para mim é uma estrada com o nome "road_border" com 11 m de largura, tipo - linha (MultiLineString)),

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

e veja o resultado.

Boa sorte a todos :-),

Soluções originais ...

Esse script é chamado - ST_RoadAxisFromDelaunayTriangulation ...

Cyril
fonte