Come posso unire / comprimere le linee stradali vicine e parallele (ad es. Una doppia carreggiata) in un'unica linea?


23

Ho uno shapefile di OSM che contiene tutte le strade all'interno di una città. Le strade più grandi (come le strade a doppia carreggiata) sembrano avere 2 linee parallele. Mi piacerebbe comprimere / combinare quelli in 1 riga in modo da poterli esportare e renderli in modo piacevole in un'applicazione 3D esterna (2 strade sovrapposte saranno complicate e sembreranno strane in 3D).

Come posso ottenere questo risultato con QGIS o PostGIS? Non sono preoccupato per una leggera perdita di precisione (entro pochi metri) e vorrei che la linea singola risultante fosse tra (idealmente il centro di) le linee parallele correnti.

Grazie.

(ecco un esempio delle doppie linee stradali che voglio combinare)

inserisci qui la descrizione dell'immagine

Risposte:


3

ESRI ha un crollo a doppia carreggiata rispetto allo strumento della linea centrale. È possibile ottenere una versione economica da utilizzare con OSM. Altrimenti puoi selezionare le funzionalità e salvarle come nuovo livello. Elimina selezionati dal livello utilizzato per l'esportazione. Funzione buffer nel raggio di un lato della carreggiata che include la seconda corsia. Unisci shapefile con originale, collega qualsiasi topologia non funzionante.

Se è possibile codificare e / o script, è possibile calcolare la media di una linea centrale tra le corsie su un nodo eseguendo la seg per corrispondenza dei nodi ed emettendo una linea centrale programmaticamente e quindi eliminando programmaticamente le funzionalità selezionate utilizzate per il processo di produzione, controllare e correggere la topologia interrotta, e si è fatto.

Ho trovato un esempio di codice arcpy che sto includendo, come trovare il link è sotto nei commenti.

attribuito alla Guida di 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, "")

potresti collegarti al collasso ESRI allo strumento della linea centrale? Non sono riuscito a trovarlo. L'unica cosa che ho trovato è stata la sezione Modifica delle strade a doppia carreggiata di questa pagina .
Fezter

La guida di ArcGIS genera collegamenti univoci che non fanno riferimento come collegamento con pated che vedo, quindi ... vai su resources.arcgis.com/en/help/main/10.1/index.html e cerca Comprimi linee doppie per centrare (copertura) il il collegamento originale proviene da una discussione e potrebbe essere errato in quanto è necessario ArcGIS per desktop avanzato: richiede ArcInfo Workstation installata
Lewis

1
La maggior parte degli utenti non dovrebbe utilizzare lo strumento "Copertura" (che richiede Workstation), a meno che non lavori esplicitamente con i dati di copertura Arc7. Al contrario, nella maggior parte dei casi utilizzare Collapse Dual Lines To Centerline (Cartografia) .
Ryan Dalton,

2

Si potrebbe provare a utilizzare di Mike Migurski Skeletron . È uno strumento open source che usa per cose come il suo stile di mappa del terreno.


1

Forse non è una soluzione molto elegante e si basa sul metodo di risposta alla domanda: /gis//a/295348/120129 .

È una delle varianti per risolvere la tua domanda, impostare uno strumento geografico (per me è una strada con il nome "road_border" 11 m di larghezza, type - line (MultiLineString)),

eseguire uno strumento geografico :-),

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 vedere il risultato.

Buona fortuna a tutti :-),

Soluzioni originali ...

Questo script si chiama - ST_RoadAxisFromDelaunayTriangulation ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.