Comment remplir un graphique non orienté depuis PostGIS?

9

Cette question est davantage liée à des ressources que je n'ai peut-être pas encore identifiées, même si je fais des recherches sur le Web depuis un certain temps.

Dans le projet sur lequel je travaille en ce moment, j'ai besoin d'exécuter un algorithme de chemin le plus court sur un graphique représentant les bureaux, les couloirs, les escaliers, les ascenseurs et les itinéraires entre les bâtiments.

Pour la couche de présentation, j'ai pensé à utiliser les scripts Python avec MapServer, mais maintenant je réfléchis davantage à la façon de construire le graphique à partir des (fichiers de formes convétés en a) db postGIS généré à partir d'OpenEV afin qu'il soit facile d'ajouter et de supprimer des bords ou poids ou informations sur les points par la suite.

Pour Python, il existe un module appelé networkX qui traite des graphiques, et bien que ce problème ait été soulevé dans stackexchange ici , le graphique que j'essaie de construire n'est pas un digraphe mais un sens unidirectionnel.

Mise à jour: il y a 5 jours le réseau utilitaire de Ben Reilly a été ajouté au projet networkX. Utilitynetwork construit un graphique dirigé à partir des fonctionnalités du fichier de formes.
Les questions restent ouvertes pour une approche similaire de lecture des fonctionnalités de la base de données postGIS.

user39901230
la source
Vous ne voulez pas utiliser pgRouting?
underdark
J'utiliserais pgRouting, mais l'algorithme que j'essaie d'implémenter est une étoile bidirectionnelle et non une option standard.
user39901230

Réponses:

5

NetworkX a une méthode pour convertir les graphiques dirigés en graphiques non dirigés .

De plus, le code pour lire un fichier de formes (ou un répertoire de fichiers de formes) n'a pas vraiment besoin de générer un graphique dirigé, c'est exactement ce dont j'avais besoin à l'époque. Je n'ai pas essayé, mais en remplaçant la seule ligne:

net = nx.DiGraph()

... pourrait bien faire l'affaire.

NetworkX semble prendre en charge la lecture des fichiers de formes prêts à l'emploi (avec OGR) dans 1.4 ( fonctionnalité ).

bwreilly
la source
Désolé pour la confusion. Ce que j'essaie de faire, c'est de convertir les fichiers de formes en une base de données postGIS à l'aide de shp2pgsql, puis de la base de données postGIS pour l'importer dans le graphique networkX.
user39901230
merci Ben. Je viens de remarquer qu'il y a 5 jours, ils ont fermé le ticket et que votre code a été ajouté au projet networkX. Il aurait été intéressant de voir s'il serait possible de faire la même chose avec les fonctionnalités de la base de données postGIS, mais j'y reviendrai pendant les vacances de Noël.
user39901230
puisque le networkx a inclus le module mais pas encore sorti v1.4 serait-il possible de donner quelques exemples d'utilisation d'utilitaire réseau. Jusqu'à présent, j'ai parcouru le testnetworkload et vos exemples trouvés ici: gis.stackexchange.com/questions/210/alternatives-to-pgrouting/…
user39901230
Il y a encore un peu de travail à faire là-dessus, c'est pourquoi je ne l'ai pas mis sur pypi. J'ai rendu le wiki public maintenant, il devrait contenir les meilleurs exemples de travail: bitbucket.org/gallipoli/utilitynetwork/wiki/Home
bwreilly
étant donné que je prévois de l'inclure dans mon projet de dernière année de premier cycle, serais-je en mesure de contribuer également?
user39901230
2

Je ne sais pas à quel point vous êtes intéressé à utiliser d'autres frameworks, ou si vous avez déjà résolu ce problème, mais le projet Geodjango ajoute de véritables fonctionnalités ORM aux modèles de données SIG, pour une variété de bases de données activées SIG, y compris postgres avec les liaisons PostGIS installées .

Le lien Geodjango est ici: http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#overview

Notez que Django est un framework web pour python, geodjango est sur le point d'éditer et d'afficher des données SIG pour le développement web backend, mais il donne également un ensemble de classes beaucoup plus intuitif et puissant que les liaisons OGR python directes (beaucoup plus 'pythonic' plutôt que directement 'converti à partir de la syntaxe C', par exemple vous pouvez créer une classe django.contrib.gis.geos.linestring.LineString directement plutôt que de créer une classe ogr.Geometry avec la constante wkbLineString dans le constructeur).

Dans le didacticiel geodjango situé: http://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/

Les étapes nécessaires pour configurer la lecture / écriture à partir de votre base de données Postgres sont aussi simples que l'utilisation d'autres modèles de python django, le casse-tête met en place votre base de données géospatiales. Donc, pour charger des données dans la base de données postgres, consultez le lien d'ancrage #layermapping dans le tutoriel ci-dessus; il s'agit d'un mappage de champ entre les données disponibles dans le fichier de forme et les colonnes de base de données configurées pour votre modèle de données.

À tout le moins, je prendrais 2-3 heures pour parcourir le didacticiel et configurer les liaisons PostGIS et voir si cet outil SIG est ce que vous recherchez.

Notez également que lorsque vous avez une base de données compatible SIG (par exemple, les liaisons PostGIS pour pgsql), vous pouvez faire "contient" "à l'intérieur" directement sur les données de géométrie de la base de données (lignes / polygones) en utilisant les fonctions stockées de la base de données (par exemple ST_Contains(...): voir l'exemple SQL pour PostGIS / pgsql ici: http://postgis.refractions.net/docs/ch04.html#id2639062 ... et la meilleure partie de GeoDjango, est que il est optimisé pour faire ces recherches spatiales pour vous! .

tmarthal
la source