¿Cómo llenar un gráfico no dirigido desde PostGIS?

9

Esta pregunta está más relacionada con recursos que quizás aún no haya identificado, aunque he estado buscando en la web por un tiempo.

En el proyecto en el que estoy trabajando en este momento, necesito ejecutar un algoritmo de ruta más corta en un gráfico que represente salas de oficinas, pasillos, escaleras, ascensores y rutas entre edificios.

Para la capa de presentación, pensé en usar secuencias de comandos de Python con MapServer, pero ahora estoy pensando más sobre cómo construir el gráfico a partir de los (shapefiles convertidos en a) postGIS db generado desde OpenEV para que sea fácil agregar y quitar bordes o pesos o información sobre los puntos posteriores.

Para Python hay un módulo llamado networkX que se ocupa de los gráficos, y aunque este problema se ha planteado en stackexchange aquí , el gráfico que estoy tratando de construir no es un dígrafo sino indirecto.

Actualización: hace 5 días se agregó la red de servicios públicos de Ben Reilly al proyecto networkX. Utilitynetwork crea un gráfico dirigido a partir de las características del archivo shape.
Las preguntas siguen abiertas para un enfoque similar de las características de lectura de la base de datos postGIS.

usuario39901230
fuente
¿No quieres usar pgRouting?
oscuro
Usaría pgRouting, sin embargo, el algoritmo que estoy tratando de implementar es una estrella bidireccional y no una opción estándar.
user39901230

Respuestas:

5

NetworkX tiene un método para convertir gráficos dirigidos en gráficos no dirigidos .

Además, el código para leer un shapefile (o directorio de shapefiles) realmente no necesita generar un gráfico dirigido, eso es justo lo que necesitaba en ese momento. No lo he intentado, pero reemplazando la línea única:

net = nx.DiGraph()

... podría hacer el truco.

Parece que NetworkX admitirá la lectura de archivos de forma listos para usar (con OGR) en 1.4 ( función ).

bwreilly
fuente
perdón por la confusion. Lo que realmente estoy tratando de hacer es convertir los archivos de forma en una base de datos postGIS usando shp2pgsql y luego desde la base de datos postGIS para importarlo en el gráfico networkX.
user39901230
gracias Ben Acabo de notar que hace 5 días cerraron el ticket y su código ha sido agregado al proyecto networkX. Hubiera sido interesante ver si sería posible hacer lo mismo con las características de la base de datos postGIS, pero lo veré durante las vacaciones de Navidad.
user39901230
dado que networkx ha incluido el módulo pero aún no se ha lanzado la v1.4, ¿sería posible dar algunas muestras del uso de la red de servicios públicos? Hasta ahora, he hojeado la carga de prueba de red y sus muestras encontradas aquí: gis.stackexchange.com/questions/210/alternatives-to-pgrouting/…
user39901230
Todavía hay un poco de trabajo por hacer en esto, por lo que no lo puse en pypi. He hecho pública la wiki ahora, debe contener las mejores muestras de trabajo: bitbucket.org/gallipoli/utilitynetwork/wiki/Home
bwreilly
Dado que planeo incluir esto en mi proyecto final de pregrado, ¿sería posible que yo también contribuya?
user39901230
2

No estoy seguro de qué tan interesado está en usar otros marcos, o si ya ha resuelto esto, pero el proyecto Geodjango agrega características ORM realmente agradables a los modelos de datos GIS, para una variedad de bases de datos habilitadas para SIG, incluidos postgres con los enlaces PostGIS instalados .

El enlace Geodjango está aquí: http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#overview

Tenga en cuenta que Django es un marco web para python, geodjango se encargó de editar y mostrar datos SIG para el desarrollo web de back-end, pero también ofrece un conjunto de clases mucho más intuitivo y poderoso que los enlaces directos de Python OGR (mucho más 'pythonic' en lugar de directamente 'convertido desde la sintaxis C', por ejemplo, puede crear una clase django.contrib.gis.geos.linestring.LineString directamente en lugar de crear una clase ogr.Geometry con constante wkbLineString en el constructor).

En el tutorial de geodjango ubicado: http://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/

Los pasos necesarios para configurar la lectura / escritura desde su base de datos Postgres son tan simples como usar otros modelos de django python, el dolor de cabeza es configurar su base de datos geoespaciales. Entonces, para cargar datos en la base de datos postgres, vea el enlace de anclaje #layermapping en el tutorial anterior; es un mapeo de campo entre los datos disponibles en el archivo de forma a las columnas de la base de datos configuradas para su modelo de datos.

Como mínimo, me tomaría de 2 a 3 horas revisar el tutorial y configurar los enlaces PostGIS y ver si esta herramienta GIS es lo que está buscando.

Tenga en cuenta también que cuando tiene una base de datos habilitada para SIG (por ejemplo, enlaces PostGIS para pgsql) puede hacer 'contiene' 'dentro de' directamente en los datos de geometría de la base de datos (Líneas / Polígonos) utilizando las funciones almacenadas de la base de datos (por ejemplo ST_Contains(...): vea el ejemplo de SQL para postgis / pgsql aquí: http://postgis.refractions.net/docs/ch04.html#id2639062 ... y lo mejor de Geodjango es que está optimizado para hacer estas búsquedas espaciales por usted .

tmarthal
fuente