Tengo una función personalizada de Postgres que utiliza pgr_dijkstra para generar una ruta de trabajo. Funciona pasando la lat/lon de los puntos de inicio y destino. Luego encuentro el vértice del segmento más cercano a ese punto lat/lon y lo uso en la llamada a pgr_dijkstra.
snippit: EXECUTE 'SELECT id::integer FROM trail_split_segs_vertices_pgr ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' || x1 || ' ' || y1 || ')'',4326) LIMIT 1' INTO rec; source := rec.id;
El problema es que, aunque pase el ratón por un segmento específico, el vértice más cercano puede pertenecer a un segmento diferente, ya que la búsqueda se basa en la distancia.
(el punto rojo es el que quiero, pero cojo el morado ya que está más cerca)
Intenté crear una función diferente para encontrar la arista más cercana a los puntos lat/lon del usuario en lugar del vértice más cercano. Pero tengo que elegir si voy a usar el origen o el destino de esa arista.
snippit SELECT id, source, target, geom, ST_Distance( geom, ST_GeometryFromText( 'POINT(-123.036073 49.357152)', 4326 ) ) AS dist FROM trail_split_segs WHERE geom && ST_SetSRID( 'BOX3D(-123.036083 49.357142, -123.036063 49.357162)'::box3d, 4326 ) ORDER BY dist LIMIT 1
El cuadro creado por esto es muy pequeño, por lo que más o menos siempre seleccionará el borde correcto, porque tengo el ratón de los usuarios se ajustan a los bordes en la interfaz web.
Lo que quiero hacer es seleccionar el origen de la arista o el objetivo que está más cerca del punto lat/lon donde el id de la arista tiene que ser el mismo.
ACTUALIZACIÓN La respuesta de Zia a continuación me ayudó a ponerme en el camino correcto, modifiqué su consulta.
WITH point AS (SELECT st_setsrid(st_makepoint(-123.0568528175354, 49.36230206100319), 4326) AS point), line AS (SELECT geom AS line_geom FROM trail_split_segs, point WHERE st_dwithin(geom, point, 0.00012) ORDER BY geom <-> point LIMIT 1) SELECT id, ST_AsText(the_geom) AS point_geom FROM trail_split_segs_vertices_pgr, line, point WHERE st_dwithin(the_geom, line_geom, 0.00001) ORDER BY the_geom <-> point LIMIT 1;