He hecho un sistema de planificación de rutas (basado en el camino más corto usando A*) como el servicio de direcciones de Google usando pgrouting y google maps. Incluye hacer clic en el mapa para generar puntos de ruta, arrastrar los puntos de ruta o las polilíneas para cambiar la ruta deseada. También muestra un panel de direcciones con instrucciones para llegar de A a B.
Sin embargo, en la geocodificación inversa que utilizo para saber dónde hace clic el usuario en el mapa, devuelvo el nodo más cercano en la topología. Todo esto funciona bastante bien excepto en algunos casos del mundo real en los que una ruta directa de A a B es más larga que una ruta indirecta a través de D
Los azules A,D,B son los nodos y los rojos C-A, C-B son los clics de mi ratón que corresponden a esos nodos. El rojo C-C es el lugar del borde que quiero que visite mi ruta.
Si un usuario quiere ir de A a B a través de la arista larga directa no es posible en este momento porque no es la ruta más rápida.
Estoy buscando una manera de hacer rutas sobre aristas o aristas parciales. Uno puede imaginar que un usuario no quiere empezar en un nodo, sino en algún lugar a mitad de camino en un borde (este es otro caso de uso, pero creo que se resolverá también con la respuesta que busco).
La forma más limpia que se me ocurre es generar nodos temporales en una arista cuando el usuario hace clic en ella (véase el clic C-C en la imagen) dividiendo efectivamente una arista en 2 aristas y colocando un nuevo nodo (temporal) en el punto de división. De esta manera, el pgrouting puede hacer una ruta sobre este nuevo nodo y así forzar la ruta para seguir las aristas que rodean ese nuevo nodo.
Sin embargo, esto generará muchos nodos temporales al arrastrar una polilínea por el mapa. Todos esos nodos generados durante_arrastrar_deben ser eliminados, excepto el creado al arrastrar_final, ya que ese pasa a formar parte de la ruta final.
Así que me pregunto si hay maneras más fáciles de resolver esto?