Necesito conectar paradas de autobús (puntos) a una capa de red (datos OSM). Estas paradas de autobús no se encuentran directamente en las líneas (ver captura de pantalla) ni se debe mover su ubicación. Uso PostGIS, pgrouting y QGIS y la red ya es enrutable con columnas de origen y destino, etc.
Principalmente quiero hacer dos cosas después:
- Obtener las distancias entre las paradas de autobús utilizando el análisis de ruta más corta.
- Creación de isócronas a poca distancia de la parada de autobús utilizando la red OSM.
Para obtener valores exactos, es necesario que la ruta "comience" y "pare" más cerca de las paradas de autobús. En muchos casos, el nodo existente más cercano estará demasiado lejos para obtener valores exactos. Pero no debe haber una ruta a la ubicación del punto real de la parada de autobús. En mi ejemplo en la imagen, puede ver cómo debería ser la ruta entre paradas.
¿Existe la posibilidad de insertar nuevos nodos automáticamente en la red (LINESTRING) que están más cerca de las paradas de autobús o es posible comenzar el enrutamiento en una especie de 'punto ficticio' que se establece solo para la consulta (similar a lo que ocurre en la carretera plugin gráfico en QGIS hace)?
Esta es mi solución completa. Implica una especie de truco para hacer la división: obtengo los puntos en las líneas (formas, para usar la terminología OSM) usando
ST_ClosestPoint
, y luego los amortiguo a una distancia muy pequeña para que la división realmente funcione. De lo contrario, los errores de imprecisión / redondeo impedían la división.Esto tiene el problema de que genera dos divisiones en cada línea por punto (debido al almacenamiento en búfer). Para mi uso, esto estaba bien, ya que más tarde me dirigí entre los puntos de división más cercanos a los puntos originales, que estaban fuera de la línea, y podría ser cualquiera de los dos puntos de división de la intersección del búfer de línea.
Comencé descargando datos de OSM e incorporándolos a Postgres:
Dividiendo las formas usando un buffer:
Cree la topología necesaria para el enrutamiento con pgrouting:
fuente
Como estoy trabajando en una tarea similar, solo quería contarles sobre el enfoque que estoy usando actualmente. Esto hace uso de GRASS GIS, pero en lo que respecta a mis experimentos con PostGIS, es bastante complicado agregar múltiples puntos nuevos a LineStrings existentes al dividir esos LineStrings en las ubicaciones respectivas, aunque estoy seguro de que hay una solución conveniente.
Ahora hice uso de la
v.net
función GRASS GIS usando la opciónconnect
. Solo eligeinput vector line layer
ypoints layer
. Existe la opción de ajustar los puntos al punto más cercano en las líneas o crear nuevas conexiones entre el punto más cercano en las líneas y el nuevo punto.Aquí hay una imagen de antes y después. En el lado derecho, para cada punto de la capa de puntos se agregó un nodo en la red vial:
Luego, en PostGIS, después de crear su
..._vertices_pgr
tabla fuera de la red de carreteras, simplemente asigne sus puntos al vértice más cercano para que pueda usarlos en sus solicitudes de enrutamiento. Para esta tarea, puede hacer uso de laST_ClosestPoint
función como lo hizo @Setraworks en su respuesta.Las desventajas de este enfoque son:
Este enfoque funciona bien si tiene un número definido de puntos para agregar a la red vial (como en el ejemplo de la pregunta con paradas de autobús).
¡Si alguien puede proporcionar un ejemplo de trabajo usando PostGIS, me encantaría leer sobre eso!
fuente
Hay una publicación que analiza un problema similar, puede ver esa publicación en la siguiente ubicación: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html
fuente