J'ai besoin de connecter des arrêts de bus (points) à une couche réseau (données OSM). Ces arrêts de bus ne se trouvent pas directement sur les lignes (voir capture d'écran) et leur emplacement ne doit pas être déplacé. J'utilise PostGIS, pgrouting et QGIS et le réseau est déjà routable avec des colonnes source et cible, etc.
Je veux surtout faire deux choses après:
- Obtenir les distances entre les arrêts de bus en utilisant l'analyse du chemin le plus court.
- Création d'isochrones à distance de marche de l'arrêt de bus en utilisant le réseau OSM.
Pour obtenir des valeurs exactes, il est nécessaire que le routage «démarre» et «s'arrête» le plus près des arrêts de bus. Dans de nombreux cas, le nœud existant le plus proche sera trop éloigné pour obtenir des valeurs exactes. Mais il ne devrait pas y avoir de routage vers l'emplacement réel du point de l'arrêt de bus. Dans mon exemple sur l'image, vous pouvez voir à quoi devrait ressembler le routage entre les arrêts.
Y a-t-il une possibilité d'insérer automatiquement de nouveaux nœuds dans le réseau (LINESTRING) qui sont les plus proches des arrêts de bus ou est-il possible de commencer le routage sur une sorte de `` point factice '' qui est défini uniquement pour la requête (similaire à ce que la route plugin graphique dans QGIS fait)?
Ceci est ma solution complète. Cela implique une sorte de piratage pour effectuer le fractionnement: j'obtiens les points sur les lignes (façons d'utiliser la terminologie OSM) en les utilisant
ST_ClosestPoint
, puis je les tamponne sur une très petite distance pour que le fractionnement fonctionne réellement. Sinon, des erreurs d'imprécision / d'arrondi empêchaient le fractionnement.Cela a le problème de générer deux divisions sur chaque ligne par point (en raison de la mise en mémoire tampon). Pour mon utilisation, cela allait bien, car plus tard, j'ai routé entre les points de division les plus proches des points d'origine, qui étaient en dehors de la ligne, et cela pourrait être l'un des deux points de division de l'intersection ligne-tampon.
J'ai commencé par télécharger les données OSM et les intégrer dans Postgres:
Diviser les voies à l'aide d'un tampon:
Créez la topologie nécessaire pour le routage avec pgrouting:
la source
Comme je travaille sur une tâche similaire, je voulais juste parler de l'approche que j'utilise actuellement. Cela utilise GRASS GIS, mais en ce qui concerne mes expériences avec PostGIS, il est assez compliqué d'ajouter plusieurs nouveaux points aux lignes de chaîne existantes en divisant ces lignes de chaîne aux emplacements respectifs - bien que je suis sûr qu'il existe une solution pratique.
J'ai maintenant utilisé la
v.net
fonction GRASS GIS en utilisant l'optionconnect
. Choisissez simplementinput vector line layer
etpoints layer
. Il y a la possibilité soit d'aligner les points sur le point le plus proche sur les lignes, soit de créer de nouvelles connexions entre le point le plus proche sur les lignes et le nouveau point.Voici une image avant et après. Sur le côté droit, pour chaque point de la couche de points, un nœud sur le réseau routier a été ajouté:
Ensuite, dans PostGIS, après avoir créé votre
..._vertices_pgr
table à partir du réseau routier, affectez simplement vos points au sommet le plus proche afin de pouvoir les utiliser dans vos demandes de routage. Pour cette tâche, vous pouvez utiliser laST_ClosestPoint
fonction telle que effectuée par @Setraworks dans sa réponse.Les inconvénients de cette approche sont:
Cette approche fonctionne bien si vous avez un nombre défini de points à ajouter au réseau routier (comme dans l'exemple de la question avec les arrêts de bus).
Si quelqu'un peut fournir un exemple de travail en utilisant PostGIS, j'aimerais en savoir plus à ce sujet!
la source
Il existe un message qui traite d'un problème similaire, vous pouvez le voir à l'emplacement suivant: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html
la source