PgRouting - Comment couper les liens lorsque vous atteignez les coûts maximum?

13

J'ai un fichier de formes polyligne représentant un réseau routier et un second fichier de formes contenant des points. Je voudrais utiliser PostGIS (vraisemblablement PgRouting) pour identifier les sous-réseaux ou les zones de service rayonnant à partir de ces points.

Essentiellement, j'espère poser la question: "À partir du point X, jusqu'où pourrais-je marcher dans une direction donnée, compte tenu d'un budget de déplacement total de 1 km, en suivant le réseau routier?" Le résultat serait un ensemble de polylignes coupées représentant la gamme totale des possibilités de déplacement, compte tenu d'un budget de déplacement de 1 km.

Pour référence, cette analyse GRASS semble être exactement ce que je veux faire (sauf que je veux le faire dans PostGIS): http://www.gdf-hannover.de/lit_html/grass60_v1.2_en/node57.html#sec: optalloc

Cet exemple suivant semble être presque ce que je veux faire, sauf qu'il semble répondre à la question "vers quels nœuds pourrais-je voyager avec un budget de déplacement de X distance?" http://underdark.wordpress.com/2011/02/12/drive-time-isochrones/

La seconde n'est pas tout à fait la réponse que je cherche, car je veux que les polylignes soient coupées sur ma distance de déplacement - je m'en fiche si je parviens jusqu'à un nœud.

Peter
la source
Une option qui me vient à l'esprit est de diviser en quelque sorte mes polylignes en beaucoup de points. Cela me rapproche de la bonne réponse, mais semble assez hacky, et ne m'amène toujours pas tout à fait.
Peter

Réponses:

2

Une pensée que je devais était de 1) exécuter la routine driving_distance et 2) utiliser la routine "points_as_polygon" de pgRouting (qui appelle la fonction alphashape) pour générer le plus petit polygone (s) à des distances de coût données en fonction des points de la routine driving_distance Retour. Ensuite, vous pouvez sélectionner toutes les rues dans les polygones, ce qui vous donnera une idée générale du voyage.

Si vous n'avez pas suivi la discussion sur la liste des utilisateurs de pgRouting , ils ont discuté plus d'options récemment (discussions de mai et juin 2011).

RyanKDalton
la source
1
Discussions intéressantes sur la liste des utilisateurs. Dommage que la fonction driving_distance soit boguée.
underdark
1

Comme il s'agit vraiment d'un problème de graphique, ce dont vous avez besoin, c'est de la connectivité / topologie + informations sur les coûts. Pour pg_routing, c'est la table que vous envoyez aux algorithmes de chemin le plus court. Cet article contient des informations sur la façon d'en créer un (je suppose que vous en avez déjà un). Désolé, je ne peux pas vous donner la fonction exacte dans pg_routing qui fait cela, mais en écrire une devrait être faisable. Cependant, je peux vous dire que si vous continuez d'appeler le chemin le plus court encore et encore, vous faites l'algorithme ci-dessous encore et encore et supprimez le résultat - pas efficace du tout.

Votre solution devient alors marcher chaque bord tout en les ajoutant à une "liste parcourue" et en calculant un coût jusqu'à ce que votre budget (c'est-à-dire la distance) soit dépassé. Si le budget est acceptable (c'est-à-dire que le budget n'a pas été dépassé), vous ajoutez également la géométrie à un "sac de géométrie de liste acceptable". Vous ne devez traiter chaque bord qu'une seule fois. Pour la toute dernière tranche (où vos budgets sont dépassés), vous devez obtenir la longueur et interpoler la distance exacte que vous souhaitez parcourir , puis ajouter le résultat à la "liste acceptable". Votre résultat est une union de ce sac de géométrie.

Ragi Yaser Burhum
la source
1
Il y a une subtilité dans la dernière étape: certains bords peuvent être atteints à partir de l'un ou l'autre de ses points d'extrémité. Cela peut entraîner l'inclusion de parties des deux extrémités ou même le bord entier, même si le fait de traverser le bord entier à partir de l'un des points de terminaison dépasserait la limite budgétaire. Par exemple, considérons le déplacement à partir du point a le long d'un graphique non orienté avec des bords de longueur unitaire {(a, b), (a, c), (b, c)} et un budget de 1,6. Vous pouvez atteindre b ou c pour un coût de 1, avec 0,6 restant à dépenser. Cela rend chaque point le long du bord (b, c) accessible.
whuber
Vous avez raison :) +1
Ragi Yaser Burhum
1

"À partir du point X, jusqu'où pourrais-je marcher dans une direction donnée, compte tenu d'un budget de déplacement total de 1 km, en suivant le réseau routier?"

Comme vous n'avez qu'à considérer une petite région (1 km de rayon au maximum), vous pourriez probablement vous en tirer en divisant les liens en plusieurs petits morceaux (selon la précision que vous souhaitez atteindre) et en créant les nœuds nécessaires. Les réseaux "haute résolution" qui en résultent devraient être encore gérables.

obscur
la source