Suite

PgRouting - calculer l'itinéraire d'un point à un autre

PgRouting - calculer l'itinéraire d'un point à un autre


J'ai trois fichiers de formes :

  • routes (lignes),
  • centre logistique (caractéristique d'un point) et
  • lieux (beaucoup de caractéristiques ponctuelles).

J'ai essayé de calculer l'itinéraire du centre logistique aux lieux par l'analyste du réseau ArcMap, mais c'était pénible et je n'y suis pas parvenu.

J'ai donc installé PostGIS/Postgresql avec l'extension pgRouting. Maintenant, j'ai ces fichiers de formes importés dans la base de données avec l'outil SPIT de QGIS. Dans la base de données, ils sont affichés sous forme de 3 tableaux. J'ai également réussi à créer une topologie pour les routes grâce au didacticiel trouvé dans la documentation de l'atelier pgRouting.

Pour l'instant, je ne trouve pas de tutoriel pour ma situation, car je souhaite calculer les itinéraires les plus courts du centre logistique aux lieux à l'aide de la couche de routes. Je peux le faire à la main, un par un, sur QGIS ou ArcMap, en utilisant leurs outils, mais j'ai 1500 places, donc ce serait pénible de le faire.

Mes questions:

Est-il possible de calculer des itinéraires d'un point à plusieurs avec pgRouting (je n'ai besoin que des distances pour l'itinéraire le plus court) en utilisant le centre logistique comme source et les lieux comme cibles ?

Est-il possible de créer une table avec des informations contenant l'ID cible et la distance de l'itinéraire et de créer un fichier de formes avec la géométrie ?

Comment faire ça?


Le pgr_kDijkstra La fonction vous permet de calculer des distances un-à-plusieurs.

Avec l'algorithme de Dijkstra, vous devez commencer et terminer votre itinéraire avec un identifiant de nœud. Il peut donc être judicieux d'intégrer vos centres et points logistiques dans le réseau routier.

Vous pouvez le faire avec certaines fonctions PostGIS :

  • ST_LineLocatePoint vous donne le point le plus proche sur LineString du point donné, en tant que fraction de la longueur totale de la ligne 2D.
  • ST_LineSubstring vous renvoie une chaîne de ligne partielle en utilisant la fraction que vous avez calculée auparavant.
  • ST_LineInterpolatePoint vous renvoie le point interpolé.

Donnez ensuite à votre point interpolé un ID de nœud et remplacez la chaîne de lignes par les 2 sous-chaînes.

Vous pouvez également écrire une fonction pour le faire à chaque demande, mais si vos lieux et centres logistiques ne changent pas, vous pouvez le faire une fois pour tous les points et stocker le réseau étendu dans la base de données.


Je pense que vous recherchez la fonction pgr_drivingDistance

Cette fonction calcule une solution de chemin le plus court de Dijkstra et extrait le coût pour se rendre à chaque nœud du réseau à partir du nœud de départ. En utilisant ces nœuds et ces coûts, il est possible de calculer des polygones de temps de conduite constants. Renvoie un ensemble de lignes pgr_costResult (seq, id1, id2, cost) qui constituent une liste de points accessibles.

http://docs.pgrouting.org/2.0/en/src/driving_distance/doc/dd_driving_distance.html#pgr-driving-distance

Exemple:

SELECT seq, id1 AS nœud, coût FROM pgr_drivingDistance( 'SELECT id, source, cible, coût FROM edge_table', 7, 1.5, false, false );

suite | nœud | coût -----+------+------ 0 | 2 | 1 1 | 6 | 1 2 | 7 | 0 3 | 8 | 1 4 | 10 | 1 (5 rangées)


Voir la vidéo: PostgreSQL worst practices. Илья Космодемьянский Data Egret