1 votos

Obtener lo más cercano (origen o destino) de una arista desde un punto en postgres

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.

the red point is the one I want, but I get the purple one since its closer
(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;

2voto

Strinat Puntos 1

Creo que no es necesario establecer el BOX3D En su lugar, utilice el siguiente enfoque. Pero tenga en cuenta que el 0.00012 es un poco crucial, tienes que seleccionarlo con cuidado. No inserte 0 en su lugar, ya que he notado un comportamiento anormal en el pasado. Además, si su CRS está en ESPG:3857 entonces tiene que definir este valor de búfer no en grados sino en metros.

with line as
(select geom as line_geom from trail_split_segs order by
geom <-> st_setsrid(st_makepoint(-123.036073 49.357152), 4326) limit 1)
select id, the_geom as point_geom from trail_split_segs_vertices_pgr, line
where st_dwithin(the_geom, line_geom, 0.00012) 
order by the_geom <-> st_setsrid(st_makepoint(-123.036073 49.357152), 4326) limit 1;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X