J'ai un ensemble de scripts postgis qui génère deux tableaux - l'un d'un ensemble de points et le second un ensemble de routes qui les entourent. Toutes les données sont dans la même projection et les deux sorties sont stockées dans des tableaux postgres 9.2 avec postgis 2.1
La topologie de routage du réseau routier a été créée et la table de points a une colonne contenant le segment de route le plus proche.
Je voudrais alors générer un sous-ensemble du réseau routier qui représente le plus petit réseau qui relie tous les points en utilisant quelque chose comme un arbre couvrant minimum. Le réseau routier n'est pas dirigé et les coûts sont simplement la longueur de l'itinéraire.
Je peux le faire dans QGIS / Grass en utilisant la famille de modules v.net mais, idéalement, je voudrais également conserver cette dernière étape dans SQL.
J'ai regardé la nouvelle fonction postgis apspWarshall, mais je ne sais pas comment l'encourager à concentrer son énergie sur la connexion des points et non sur l'ensemble du réseau.
Ceci est le court script que j'ai mis en place pour tenter de créer un cadre pour résoudre ce problème, mais je ne vois pas où il est possible de concentrer la fonction pour commencer avec un sous-ensemble des bords.
SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
FROM pgr_apspWarshall('SELECT gid AS id,
source,
target,
st_length(the_geom) AS cost
FROM road_network
',
false, false
) AS tree
JOIN road_network As roads
ON tree.id2 = roads.gid
Dans les problèmes de chemin le plus court à chemin unique, la fonction demande le début et la fin, mais apparemment pas dans les problèmes tous points. De même, dans Grass, v.net.spanningtree et v.net.steiner attendent un ensemble de points et de lignes en tant que réseau combiné avec lequel travailler.
Quelqu'un a-t-il des suggestions sur la façon de procéder dans PostGIS?
Réponses:
Cette réponse n'est pas complète ou testée, mais essayez quelque chose comme ceci:
selon questions / 39210 :
je pense que ce n'est pas très efficace.
la source
@Adrian, je ne connais pas vraiment les résultats du pgroutage, mais la documentation est très détaillée. Ma réponse est basée sur une fonction en deux étapes, qui sera très inefficace en SQL mais produira [probablement] les résultats. Cette solution [non testée] n'optimisera PAS le meilleur point de départ, mais réduira l'ensemble du réseau d'itinéraire aux seuls tronçons qui relient tous les arrêts, puis acheminera efficacement tous les arrêts.
Étape 1 (sous-sélection d'un sous-ensemble du réseau routier qui relie tous les arrêts) Cette fonction utilise la fonction de routage à destinations multiples (chemin K Dijkstr) pour renvoyer une collection de chemins qui (lorsque le coût <> -1) connectent réellement tous vos s'arrête.
Étape 2 (sélection finale des chemins minimaux en fonction des chemins de réseau routier du sous-ensemble ci-dessus qui relient tous les arrêts ) de sorte que seul le sous-ensemble de routes soit utilisé dans le routage final Field-Warshal :
Donc, en résumé ... la requête de routage k_dijkstra_path interne réduit le réseau routier total aux seuls chemins reliant tous vos arrêts, puis le routage fField_Warshal externe utilise uniquement ces identifiants de bord pour résoudre la requête d'optimisation de chemin .... peut-être.
la source