Pages: 1
- Sujet précédent - Pgrouting - Le plus court chemin d'un point A à un point B - Sujet suivant
#1 Thu 10 September 2020 13:21
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Pgrouting - Le plus court chemin d'un point A à un point B
Bonjour,
Je m'initie depuis peu sur Pgrouting, notamment grâce à la documentation en ligne. Disposant d'une couche de route (source : OSM), je souhaite calculer le chemin le plus court entre deux points. J'utilise Windows 10, ainsi que postgreSQL et pgAdmin (dernière version).
La requête finale fonctionne, mais est malheureusement vide. Voici la démarche que j'utilise pour créer le trajet le plus court entre ces deux points https://zupimages.net/viewer.php?id=20/37/2piv.png --> Les points proviennent de "route_049_vertices_pgr" :
Code:
-- Sur QGis, conversion de la couche route de Multilinestring à linestring avec l'outil "De morceaux multiples à morceaux uniques" -- Importation de la couche route (nommée "route_049") dans PostgreSQL -- Création des colonnes Source et Target ALTER TABLE route_049 ADD COLUMN "source" integer; ALTER TABLE route_049 ADD COLUMN "target" integer; --Création que de la topologie (fonctionne bien, et me renvoie "OK") SELECT pgr_createtopology('route_049', 0.001, 'geom', 'id', 'source', 'target'); --Tentative de création d'un trajet le plus court entre deux points SELECT * FROM pgr_dijkstra('select id, source, target, st_length(geom) as cost, st_length(geom) as cost FROM route_049', 228, 282, false) --0 ligne retournée
J'ai du adapter mon code, car les formules que j'entrais n'était pas compatibles avec la doc, du fait de ma version de Pgrouting bien plus récente ("3.0.0-rc1"). Aurais-je loupé quelque chose ?
Merci.
Dernière modification par preliator (Thu 10 September 2020 13:26)
Hors ligne
#2 Fri 11 September 2020 17:13
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: Pgrouting - Le plus court chemin d'un point A à un point B
Bonjour,
Je ne vois pas d'erreur qui saute aux yeux dans votre code.
La première réponse serait qu'il n'existe aucun chemin possible entre les deux ID.
En effet si la route est coupée aucun id de tronçon n'est remonté.
il vous faut faire le test suivant :
- en premier diminuer la tolérance dans la requete de création de topologie, avec une tolérance de 1mm (0.001) sur les données OSM vous aurez des trous partout. Définir une tolérance de 1 m ou 10cm au pire sur un jeu de données comme ça est justifié.
Code:
SELECT pgr_createtopology('route_049', 1, 'geom', 'id', 'source', 'target');
- ensuite normalement un couche de données nommée "vertices" est créée. Ce sont les points qui sont créés à chaque intersection de tronçons routiers. Ainsi chaque tronçon se voit attribué dans les colonnes source et target, un id de vertice.
Choisissez deux vertices distants de seulement 2 à 3 tronçons pour faire un cheminement test et relancer la commande sur ces deux ID.
Enfin attention à la projection de votre couche. Si vos données sont en lambert alors votre tolérance est exprimée en metre, si vos données sont en WGS 84, votre tolérance est exprimée en degrés décimaux et là ce n 'est plus du tout pareil.
A+
Nicolas GRANIER
Dernière modification par Nicolas Granier (Fri 11 September 2020 17:13)
Hors ligne
#3 Fri 11 September 2020 19:52
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: Pgrouting - Le plus court chemin d'un point A à un point B
Merci pour votre réponse
J'ai résolu mon problème en faisant un v.clean sur QGis sur ma couche de route avant de l'importer dans Postgre et de retaper le code (en remplaçant la tolérance à 1). Je n'arrive pas à expliquer que le v.clean de QGis ait permit de faire fonctionner le code. ... existe t-il une fonction similaire dans Postgis pour réparer les linestring ? J'ai testé st_makevalid, mais cela ne résout pas le problème.
Merci.
Hors ligne
#4 Mon 14 September 2020 11:06
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Pgrouting - Le plus court chemin d'un point A à un point B
Bonjour,
v.clean est une commande GRASS, pas QGIS (GRASS est souvent inclu avec QGIS)
GRASS est un logiciel topologique, à la différence de PostGIS (sauf extension postgis_topology), qui traite chaque objet individuellement.
Quand on charge une couche dans GRASS ou qu'on lance v.clean, GRASS construit une topologie exacte à partir des données, à la précision près (fusion des sommets proches, des lignes confondues, fabrication de sommets aux intersections, etc.)
Ca a pour effet de nettoyer les données.
Il n'y a pas d'equivalent de v.clean dans PostGIS, helas, mais vous pouvez nettoyer les géométries et vérifier si elles sont correctes topologiquement par une série de fonctions PostGIS.
De ce que je comprends, vos données Postgis comportaient des erreurs topo => routing faux sur certaines portions.
Avec v.clean, vous avez nettoyé ces données => routing fonctionnel.
Nicolas
Hors ligne
Pages: 1
- Sujet précédent - Pgrouting - Le plus court chemin d'un point A à un point B - Sujet suivant