¡He estado usando PostGIS durante mucho tiempo, pero nunca tuve que usar la LINESTRING
geometría ...! :)
Esto es lo que me gustaría hacer: tengo una tabla de cadenas lineales (que representan las calles de una ciudad determinada, SRID 3395) y me gustaría encontrar las cadenas lineales más cercanas a un punto determinado (posición GPS, SRID 4326).
La solución que encontré es seleccionar todas las cadenas de líneas dentro de mi punto usando el expand()
método y determinar la distancia entre cada cadena de líneas y mi punto usando el ST_Distance()
método.
Aquí está el SQL:
SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;
Los resultados que obtengo se ven bien, pero tengo la sensación de que algo está mal en mi implementación.
1) ¿Ustedes piensan que expand()
pueden obtener todas las cadenas de líneas en cuestión?
2) ¿Ustedes piensan que ST_Distance()
es el método correcto para usar? Supongo que lo estoy haciendo mal, ya que la distancia que me gustaría obtener es la distancia más pequeña entre el punto y mi línea y no la distancia entre el punto y uno de los puntos de la cadena lineal.
Ilustración:
Hola
Primero la pregunta sobre qué ST_Distance devuelve. ST_Distance devuelve la distancia más corta entre la línea y el punto (o qué tipos de geometría se incorporan) Eso significa que ST_Distance entre el punto (1 3) y la cadena lineal (0 0,0 10) devolverá 1. La distancia no se medirá entre punto y (0 0) o el punto y (0 10) pero desde el punto (1 3) a (0 3).
Entonces, por lo que entiendo, ST_Distance te da la respuesta que deseas.
Si desea encontrar el punto (0 3) en el ejemplo anterior, puede usar ST_Closestpoint si tiene PostGIS 1.5. Para mi ejemplo, lo usa así: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometry, ' POINT (1 3) ':: geometry), entonces debería obtener el punto (0 3) a cambio, el punto en la línea que está más cerca de su punto.
HTH Nicklas
fuente
Lo encontré :) (Bueno, supongo: P)
Usando
ST_Line_Locate_Point()
yST_Line_Interpolate_point()
logré obtener un punto que NO ES parte de la definición de LINESTRING, pero ESTÁ en la línea mencionada :) Todo lo que tengo que hacer es obtener la distancia desde mi punto hasta este punto y listo.El
ST_Line_Locate_Point()
método encuentra la ubicación del punto más cercano en la línea al punto dado, elST_Line_Interpolate_Point
método convierte esta ubicación en un punto.fuente
ST_Distance(geometry g1, geometry g2)
Este hilo del archivo de Postgis puede responderle http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html
fuente