Quel est un moyen efficace de détecter les carrefours routiers sur une carte?

14

Je peux recevoir des cartes de n'importe quelle source pour mon projet, et pour l'algorithme C ++ que je crée, il est impératif que l'algorithme sache où se trouvent les jonctions routières (nœuds où plus de deux segments de route se rencontrent). En outre, dans la plupart des cartes que je reçois, il y a des dépassements et des dépassements de routes (c'est-à-dire que les routes ne sont pas correctement connectées). Une façon de corriger le problème consiste à «nettoyer» le réseau routier à l'aide d'Autocad. Mes questions sont les suivantes:

  1. Existe-t-il un moyen efficace (n'importe quel logiciel qui peut le faire?) D'obtenir ma carte au format GML, qui contient des informations sur les carrefours routiers sur la carte? (peut-être avoir une balise GML qui dit qu'un nœud particulier est une jonction)
  2. Existe-t-il un autre moyen de «nettoyer» le réseau routier?

Des collègues ont suggéré FME, mais cela implique d'écrire des scripts et nous ne savons pas si le script serait suffisamment flexible pour répondre à toutes les cartes. La seule autre façon de détecter les jonctions est d'utiliser la force brute et de trouver les segments de route qui ont des nœuds communs. ArcGIS serait-il utile? (Je ne l'ai pas utilisé, mais j'en ai entendu parler) Je suis sûr qu'il devrait y avoir un meilleur moyen ...

Nav
la source
2
Doit-il trouver des routes qui se croisent? Comment doit-il gérer les géométries dégénérées (polylignes où tous les sommets coïncident ayant ainsi une longueur nulle). Comment doit-il gérer les lignes coïncidentes où l'intersection est un segment linéaire et pas seulement un point?
Kirk Kuykendall
@Kirk: Je suis un peu choqué par les situations que vous avez mentionnées. Je suis nouveau dans le SIG et je ne savais même pas que de telles possibilités existaient. 1. L'auto-intersection nécessite plusieurs segments. À moins que ce ne soit un survol, je considérerais ces intersections comme des jonctions. 2. Je ne suis même pas en mesure de visualiser ce qu'est la géométrie dégénérée, donc je ne sais pas quoi répondre. Les lignes coïncidentes doivent être traitées comme deux routes distinctes, car c'est ainsi que je suppose qu'elles le seraient aussi dans la vraie vie.
Nav

Réponses:

9

Si vous avez les routes sous une forme spatiale, comme un Shapefile, vous pouvez les charger dans PostGIS et le faire rechercher automatiquement celles qui utilisent une requête SQL. Je l'ai déjà fait - l'instruction SQL est conçue pour trouver pour chaque route celles qui se croisent géographiquement et créer un point nodal pour chaque croisement.

Je vais essayer de nettoyer ça plus tard, mais voici le flux de base que vous pouvez prendre ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Les fonctions ST_ * sont ce qui fait que cela fonctionne dans PostGIS

  • ST_Envelope : saisit la boîte englobante d'une géométrie donnée - elle est utilisée pour accélérer l'algorithme. On peut affiner une recherche géographique avec les boîtes englobantes dans un passage rapide mais moins précis, puis scanner les résultats avec les géométries réelles.
  • ST_Intersects : détermine si deux géométries se croisent
  • ST_Intersection : renvoie l'intersection de deux géométries

Les extraits suivants ne sont que des extraits, car je n'ai pas le temps de terminer, peut-être que quelqu'un peut les modifier avant de revenir ici ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id
dmsnell
la source
Partage: une autre base de données que j'ai rencontrée est celle-ci - < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Apparemment, les requêtes sont très rapides car elles sont disponibles sous forme de bibliothèques pouvant être intégrées dans l'application.
Nav
1
@ dmsnell - Peut-être pourriez-vous fournir un exemple du type de requête SQL utilisé pour accomplir cette tâche?
RyanKDalton
11

Vous pouvez analyser les polylignes de manière incroyable en utilisant des tampons. C'est généralement inefficace - les tampons créent de nombreux sommets supplémentaires - mais (a) c'est une technique disponible dans de nombreux SIG (vectoriels ou raster) et (b) elle peut parfois produire des informations autrement difficiles à obtenir.

Dans ce cas, la mise en mémoire tampon de la route par une petite quantité, puis la mise en mémoire tampon par le négatif de la même quantité laisse de petites "îles" autour de tous les virages et autour de toutes les intersections. C'est facile à prouver géométriquement.

Voici un exemple de tampon polyligne de 10 m (gris) et de son tampon de -10 m (rouge clair) sur une carte de 650 m de large:

Figure 1

Maintenant, coupez la couche de polyligne d'origine avec ces polygones d'îles, fusionnez les segments par identifiant d'îlot et comptez les morceaux:

Figure 2

Les segments jaune clair désignent les pièces à nombre élevé et les segments cyan foncé désignent ceux à faible nombre. De cette façon, nous avons (a) trouvé tous les virages et intersections (y compris les auto-intersections) et les jonctions proches (voir l'extrême gauche, où les deux segments ne se rencontrent pas tout à fait)) et (b) différencié les virages des intersections. Nous pouvons trouver les quasi-jonctions en sélectionnant les îles qui contiennent deux segments connectés ou plus: les virages ne contiennent que des segments connectés.

En raison de la symétrie de la mise en mémoire tampon, les centroïdes des îles d'intersection sont les points d'intersection.

Un bel aspect de ce style d'analyse est qu'il ne se soucie pas de la façon dont la polyligne sous-jacente est représentée: il pourrait s'agir d'une entité unique, il pourrait s'agir d'une entité pour chaque segment de ligne, ou quoi que ce soit entre les deux.

whuber
la source
6

Oui, vous pouvez certainement le faire avec FME. Il existe de nombreux «transformateurs» qui gèrent le nettoyage, les intersections et la topologie; J'essaierais le transformateur TopologyBuilder dans ce cas.

Tout script est fait dans un environnement graphique, c'est donc très simple à faire.

Vous pouvez toujours obtenir une version d'essai sur www.safe.com

(Divulgation: Mark Ireland, alias FME Evangelist, Safe Software Inc.)

Mark Ireland
la source
J'appuie ceci. FME est idéal pour ce problème particulier, à la fois la transformation d'AutoCAD en GML et le nettoyage topologique. Il peut être étonnamment universel dans son application.
blord-castillo
-1

L'analyste réseau Arcgis, que vous pouvez obtenir avec un essai gratuit, le fait en moins de 10 secondes et en quelques clics.

Thad
la source
-1

Le processus peut être effectué dans ArcGIS avec un analyste réseau.

Il existe également un autre moyen dans ArcGIS: vous pouvez suivre les étapes suivantes: "Arctoolbox" → "Outils de gestion des données" → "entités" → "entités sommets vers points" et là, vous pouvez faire ce dont vous avez besoin.

Un lit
la source