Tengo un conjunto de scripts postgis que genera dos tablas: una de un conjunto de puntos y la segunda un conjunto de carreteras que los rodean. Todos los datos están en la misma proyección y ambas salidas se almacenan en tablas postgres 9.2 con postgis 2.1
Se ha creado la topología de la red de carreteras y la tabla de puntos tiene una columna que contiene el segmento de carretera más cercano.
Entonces me gustaría generar un subconjunto de la red de carreteras que represente la red más pequeña que conecta todos los puntos usando algo así como un árbol de expansión mínima. La red de carreteras no está dirigida y los costos son simplemente la longitud de la ruta.
Puedo hacer esto en QGIS / Grass usando la familia de módulos v.net, pero idealmente me gustaría mantener este paso final en SQL también.
He visto la nueva función postgis apspWarshall, pero no sé cómo se puede alentar a centrar su energía en conectar los puntos y no en toda la red.
Este es el script corto que he creado en un intento de crear un marco para resolver esto, pero no puedo ver dónde es posible enfocar la función para comenzar con un subconjunto de los bordes.
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
En los problemas de ruta más corta de ruta única, la función solicita el inicio y el final, pero aparentemente no en los problemas de todos los puntos. Igualmente en Grass, v.net.spanningtree y v.net.steiner esperan un conjunto de puntos y líneas como una red combinada para trabajar.
¿Alguien tiene alguna sugerencia sobre cómo hacer esto en PostGIS?
Respuestas:
Esta respuesta no está completa o probada, pero intente algo como esto:
Según las preguntas / 39210 :
Creo que esto no es muy eficiente.
fuente
@Adrian, no estoy muy familiarizado con los resultados de pgrouting, sin embargo, la documentación es muy detallada. Mi respuesta se basa en una función de dos pasos, que será muy ineficiente en SQL pero [probablemente] produce los resultados. Esta solución [no probada] NO optimizará cuál es el mejor punto de partida, pero reducirá toda la red de rutas a solo los bordes que conectan todas las paradas, luego las rutas de manera eficiente a todas las paradas.
Paso 1 (sub-selección de un subconjunto de red de carreteras que conecta todas las paradas) Utiliza la función de enrutamiento de múltiples destinos (ruta K Dijkstr) para devolver una colección de rutas que (cuando el costo <> -1) realmente conecta todos sus se detiene
Paso 2 (selección final de las rutas mínimas en función de las rutas de red de carreteras del subconjunto anteriores que conectan todas las paradas) Esto es esencialmente con lo que comenzó, pero le propongo que combine su red de carreteras con el resultado inicial en id1 (ruta) para que solo se use el subconjunto de carreteras en la ruta final de Field-Warshal :
Entonces, en resumen ... la consulta de enrutamiento interna k_dijkstra_path reduce la red vial total a solo las rutas que conectan todas sus paradas, luego la ruta externa fField_Warshal usa solo esos identificadores de borde para resolver la consulta de optimización de ruta ... tal vez.
fuente