Comment puis-je fusionner / effondrer des lignes de route à proximité et parallèles (par exemple, une route à deux voies) en une seule ligne?

23

J'ai un fichier de formes de l'OSM qui contient toutes les routes d'une ville. Les routes plus grandes (comme les routes à deux chaussées) semblent avoir 2 lignes parallèles. Je voudrais les réduire / les combiner en 1 ligne afin de pouvoir les exporter et les rendre bien dans une application 3D externe (2 routes qui se chevauchent seront compliquées et auront l'air bizarres en 3D).

Comment puis-je y parvenir avec QGIS ou PostGIS? Je ne m'inquiète pas d'une légère perte de précision (à quelques mètres près) et j'aimerais que la ligne unique résultante soit entre (idéalement le centre) des lignes parallèles actuelles.

Merci.

(voici un exemple de double route que je souhaite combiner)

entrez la description de l'image ici

Robin Hawkes
la source

Réponses:

3

L'ESRI dispose d'un outil de réduction de la chaussée à double axe. Vous pouvez obtenir une version bon marché à utiliser avec OSM. Sinon, vous pouvez sélectionner des entités et enregistrer en tant que nouveau calque. Supprimer la sélection du calque que vous avez utilisé pour l'exportation. Fonction tampon à portée d'un côté de la chaussée qui comprend la deuxième voie. Fusionnez le fichier de formes avec l'original, connectez toute topologie cassée.

Si vous pouvez coder et / ou scripter, vous pouvez faire la moyenne d'une ligne médiane entre les voies d'un nœud par correspondance par nœud et produire une ligne centrale par programmation, puis supprimer par programmation les fonctionnalités sélectionnées utilisées pour le processus de production, vérifier et corriger la topologie cassée, et vous êtes terminé.

J'ai trouvé un exemple de code arcpy que j'inclus, comment trouver le lien ci-dessous dans les commentaires.

attribué à l'aide d'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
la source
pourriez-vous s'il vous plaît lier à l'outil ESRI collapse to centerline? Je ne l'ai pas trouvé. La seule chose que j'ai pu trouver était la section Modification des chaussées doubles de cette page .
Fezter
L'aide d'ArcGIS génère des liens uniques qui ne font aucune référence en tant que lien pated que je vois, alors ... accédez à resources.arcgis.com/en/help/main/10.1/index.html et recherchez Réduire les lignes doubles pour centrer (couverture) le le lien d'origine provient d'une discussion et peut être erroné car vous avez besoin d'ArcGIS for Desktop Advanced: ArcInfo Workstation installé
lewis
1
La plupart des utilisateurs ne doivent pas utiliser l'outil "Couverture" (qui nécessite Workstation), à moins de travailler explicitement avec les données de couverture Arc7. Utilisez plutôt Collapse Dual Lines To Centerline (Cartography) dans la plupart des cas.
RyanDalton
2

Vous pouvez essayer d'utiliser le Skeletron de Mike Migurski . C'est un outil open source qu'il utilise pour des choses telles que son style de carte de terrain.

Sarge
la source
1

Ce n'est peut-être pas une solution très élégante et elle est basée sur la méthode de réponse à la question: /gis//a/295348/120129 .

C'est une des variantes pour résoudre votre question, mettre en place un géoinstrument (pour moi c'est une route avec le nom "road_border" 11 m de large, type-line (MultiLineString)),

exécuter un géoinstrument :-),

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

et voyez le résultat.

Bonne chance à tous :-),

Solutions originales ...

Ce script est appelé - ST_RoadAxisFromDelaunayTriangulation ...

Cyril
la source