Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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 smile

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: 1534

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

 

Pied de page des forums

Powered by FluxBB