Suite

Calculer les chemins les plus courts de tous les points d'une couche à n'importe quel point d'une autre via la couche de route dans QGIS?

Calculer les chemins les plus courts de tous les points d'une couche à n'importe quel point d'une autre via la couche de route dans QGIS?


J'essaie de calculer les chemins les plus courts de tous les points d'une couche représentant les agglomérations (les points verts) jusqu'à l'un des points d'une autre couche représentant les hôpitaux (points orange), en passant par les routes en bleu.

L'idée est de voir où sont les lacunes en termes de prestation de services publics (ici pour les établissements de santé). J'ai essayé d'utiliser GRASS, converti toutes les couches vectorielles en sommets de graphes et connecté mes points au réseau routier à l'aide de l'outil "v.net" mais je n'ai pas réussi à aller plus loin avec les outils GRASS.

Après avoir vérifié un certain nombre d'autres sujets sur StackExchange, il me semble que je pourrais utiliser l'algorithme de pgRouting ou de Dijkstra, mais il me semble que ces deux outils ne permettent de trouver que les chemins les plus courts vers une destination définie. Comme je débute sur QGIS - ou Python d'ailleurs - je peux me tromper, mais je ne veux pas perdre trop de temps à apprendre un outil qui ne ferait pas le travail au final.

Un outil d'installation le plus proche existe apparemment dans ArcGIS, donc je suppose que j'aurais besoin de quelque chose d'équivalent dans QGIS.

Pourriez-vous s'il vous plaît me guider vers les meilleurs outils pour le faire?


Après ces commentaires :

En regardant les tutoriels de pgRouting, j'ai pensé que pgr_createTopology était suffisant pour créer des emplacements source et cible. Je ne suis pas sûr de comprendre comment vérifier que les emplacements source et cible ont des emplacements équivalents situés sur les bords du réseau

Je pense que mon problème était que tous les carrefours n'étaient pas mappés en tant que nœuds, j'ai donc utilisé l'outil v.split dans GRASS pour mettre à jour mon réseau, et la requête pgr_dijkstra fonctionne maintenant. Maintenant, savez-vous comment je pourrais attribuer à tous les points de mes couches le numéro correspondant en tant que « source » ou « cible » dans mon réseau routier ?

Ainsi, après avoir divisé vos lignes d'intersection de sorte que les intersections soient désormais des points dans votre graphique, la seule tâche de préparation restante consiste à mapper vos points d'intérêt source et cible à leurs nœuds les plus proches dans le graphique afin qu'ils puissent être acheminés entre eux. La documentation de pgRouting contient ici un exemple utile mais quelque peu avancé, y compris cet extrait de fonction plpgsql :

-- Trouver le nœud le plus proche EXECUTE 'SELECT id::integer FROM way_vertices_pgr ORDER BY the_geom <-> ST_GeometryFromText("POINT(' || x1 ||"|| y1 || ')",4326) LIMIT 1' INTO rec; source := rec.id;

Ensuite, il y a cet exemple de fonction plpgsql :

CREATE OR REPLACE FUNCTION get_nearest_station (IN x_long double precision, IN y_lat double precision) -- paramètres d'entrée TABLE DES RETOURS -- structure de la sortie ( nombre entier de station_id, caractère variable de nom_ville, caractère variable de nom_station, entier dist -- distance à la station la plus proche ) AS $$ BEGIN RETURN QUERY SELECT id, city, station, CAST (st_distance_sphere(geom, st_setsrid(st_makepoint(x_long,y_lat),4326)) AS INT) AS d FROM stations ORDER BY geom <-> st_setsrid(st_makepoint(x_long, y_lat ), 4326) LIMITE 1 ; -- l'opérateur géométrique <-> signifie "distance entre" END; $$ LANGUE plpgsql;

L'élément clé est leORDER BY geom <-> st_setsrid(st_makepoint(x_long, y_lat), 4326) LIMITE 1, un modèle qui est dans les deux solutions.

Vous pouvez l'utiliser avec la requête suivante (mais vous devrez légèrement ajuster la fonction ci-dessus pour qu'elle corresponde à votre schéma) :

SELECT get_nearest_station(ST_X(geom), ST_Y(geom)) FROM table ;

Enfin, vous pouvez également travailler avec ST_Point le plus proche entre deux couches de points.


Voir la vidéo: QGIS - Créer une couche de points depuis un fichier Excel