¿Cómo agregar compensaciones a la ruta?

13

Editado :

Quieroilustrarmipregunta.Supongamosqueestásenel"Punto A" y quieres ir al "Punto B". Estos puntos no estarían en la tabla "at_2po_4pgr" porque no son los nodos fuente / destino. Luego, buscaría el nodo más cercano para los puntos A y B (puntos verdes). Después de esto, podría realizar una llamada a la ruta más corta usando ids de puntos verdes y obtendría una ruta "naranja". Pero para obtener el costo de la ruta real (distancia) en el primer caso, tendría que restar "offsetA" y en el segundo caso agregar "offset B". Para calcular la distancia entre puntos rojos y puntos verdes, ejecuto la siguiente consulta:

SELECT * FROM st_distance( ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326), ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326)) .

¿Cómo sabría cuándo sumar o restar el desplazamiento?

¡Lo siento por mi inglés!

    
pregunta Iñigo 14.11.2012 - 11:18

4 respuestas

2

No creo que puedas confiar en el vértice más cercano. Imagine que la fuente y el destino están ubicados en el mismo borde cerca del mismo vértice.

¡Prefieres considerar tres! diferentes casos:

  1. un vértice es el punto más cercano.
  2. un nodo de formulario del borde es el correcto
  3. la propia línea de borde está más cerca. (ortogonal)
respondido por el Carsten 15.11.2012 - 19:10
7

Puede encontrar una función aquí: enlace

Busca el enlace más cercano en la red, lo que generalmente da un mejor resultado. Si utiliza Shooting Star, puede iniciar el enrutamiento desde / hacia este enlace. Para A * o Dijkstra, seleccione el punto de inicio o final del enlace, o cree un nodo "virtual" al dividir el enlace en dos.

    
respondido por el dkastl 14.11.2012 - 12:16
1

Voy a explicar la solución que he encontrado (quizás no sea la mejor).

Según la imagen de la publicación, supongamos que estamos en Punto A y vamos a ir a Punto B . Como expliqué anteriormente, estos puntos no son vértice (fuente / objetivos en la tabla generada con la herramienta osm2po).

Debido a esto, necesitamos saber la dirección de caminar / conducir. Si pasamos del vértice más cercano al Punto A (punto verde) a través de la ruta naranja, tendremos que restar el desplazamiento entre Punto A y el punto verde (vértice más cercano). Pero si tuviéramos que pasar por la calle Calle Almirante Bonifaz , entonces deberíamos agregar el desplazamiento a la longitud de este borde (desde el punto verde hasta la intersección entre Calle Almirante Bonifaz y < fuerte> Calle San Juan ).

Ejecuto la siguiente consulta para obtener la ruta más corta (necesita la extensión pgRouting que se explica aquí pgRouting - instalación y requisitos aquí requisitos de instalación y requisitos ):

SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);

Esto da como resultado un conjunto de bordes que representa la ruta completa. Por ejemplo, una salida posible para esta consulta podría ser:

Dondeelcampogid(idenlatablageneradaporosm2po)representaelidentificadordeborde.Bueno,debemosverificarlascompensacionesalinicioyalfinal(PuntosA/B).

Siverificamoseldesplazamientodeinicio,debemosverificarsielprimerbordedelconjuntodebordesobtenidoenlaconsultaanterioreselmismoqueelcaminomáscercanoalPuntoA.Sicoinciden,entoncesrestaremoslacompensación.Sinocoinciden,agregaremoslacompensación.Paraobtenerelenlacemáscercanoaunpunto,ejecutolasiguienteconsulta:

SELECT*FROMfind_node_by_nearest_link_within_distance(point,0.1,'xx_2po_4pgr')asid;

Debeadaptarestafunciónparaquedevuelvaelbordemáscercano.Primerodebemodificareltipolink_point(agregueelcampoclosest_link):

CREATETYPElink_pointAS(idinteger,namecharactervarying,nearest_linkinteger);ALTERTYPElink_pointOWNERTOpostgres;

Tambiéndebesmodificarfind_node_by_nearest_link_within_distance.Soloagreguelaúltimalínea(solomuestrounextractodelafunción):

--SearchingforanearestlinkFORrowinEXECUTE'selectidfromfind_nearest_link_within_distance('''||point||''','||distance||','''||tbl||''')asid'LOOPENDLOOP;IFrow.idisnullTHENres.id=-1;RETURNres;ENDIF;link:=row.id;res.nearest_link:=link;

Luegodebesabercuálesladistanciaentreelpunto(PuntoA/PuntoB)yelbordemáscercano(desplazamiento).Paraelloejecutoestaconsulta:

SELECTST_Line_Locate_Point(geom,point)asoffset;

Dondegeomeselcampothe_geomenlatablageneradaporosm2po.

Enestepunto,tendríamoslacompensaciónparasumarorestar.

Finalmente,necesitaríaconocerelladodelbordeparaaplicarelvalorobtenidoenlaconsultaanterioryajustarelreal(sitrabajaconeltipodegeometría,tendráquenormalizarparamedirelvalorobtenido.Simplementemultiplique111000porlalongitudobtenidaenlaconsulta):

selectst_length(the_geom)from(selectST_ASTEXT(the_geom)asthe_geomFROMdr_2po_4pgrWHEREid=edge_identifier)t";

Si verificamos el desplazamiento final, tendríamos que verificar si la última ruta del conjunto de rutas obtenidas en la consulta anterior es la misma que la ruta más cercana al punto final ( Punto B ) y sumaríamos / restaríamos de la misma manera que antes.

Disculpe mi inglés.

    
respondido por el Iñigo 02.02.2013 - 11:55
1

En pgrouting, pgr_trsp - Turn Restriction Shortest Path (TRSP) hace exactamente lo que está buscando.

En lugar de especificar los nodos de origen y destino, puede especificar los bordes de origen y destino, y la fracción a lo largo del borde donde se encuentran su origen y destino.

(Puedes usar ST_Line_Locate_Point para obtener esa fracción de la geometría de tu punto, suponiendo que conoces el borde más cercano)

Consulte enlace

    
respondido por el amball 25.06.2015 - 01:31

Lea otras preguntas en las etiquetas