¿Cómo obtener el punto más cercano en una cadena lineal a un punto dado?

27

Hace mucho tiempo que uso PostGIS, ¡pero nunca tuve que usar la geometría LINESTRING ...! :)

Esto es lo que me gustaría hacer: tengo una tabla de cadenas lineales (que representan 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 lineales dentro de mi punto utilizando el método expand() y determinar la distancia entre cada serie lineal y mi punto utilizando el método ST_Distance() .

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 me parecen bien, pero tengo la sensación de que algo está mal en mi implementación.

1) ¿Ustedes creen que expand() puede obtener todas las cadenas de líneas en cuestión?

2) ¿Ustedes creen que el 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 de líneas.

Ilustración:

    
pregunta Vivi 21.09.2010 - 11:32

4 respuestas

5

Lo encontré :) (Bueno, supongo: P)

Usando ST_Line_Locate_Point() y ST_Line_Interpolate_point() logré obtener un punto que NO ES parte de la definición de LINESTRING pero ESTÁ en dicha línea :) Todo lo que tengo que hacer es obtener la distancia desde mi punto hasta este punto y he terminado.

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

El método ST_Line_Locate_Point() encuentra la ubicación del punto más cercano en la línea al punto dado, el método ST_Line_Interpolate_Point convierte esta ubicación en un punto.

    
respondido por el Vivi 21.09.2010 - 18:12
10

anuncio 1) Mirando la documentación de tus funciones usadas, diría: "Sí, se encontrarán todos los linestings relacionados".

expandir (geometría, flotar)

  

Esta función devuelve un cuadro delimitador expandido en todas las direcciones desde el cuadro delimitador de la geometría de entrada, en una cantidad especificada en el segundo argumento. Muy útil para consultas de distancia (), para agregar un filtro de índice a la consulta.

A & & B

  

El "& &" operador es el operador de "superposiciones". Si el cuadro delimitador de A se superpone al cuadro delimitador de B, el operador devuelve verdadero.

anuncio 2) Debería poder lograr lo que desea a través de:

line_interpolate_point(linestring, line_locate_point(LineString, Point))

line_interpolate_point (linestring, ubicación)

  

Interpola un punto a lo largo de una línea. El primer argumento debe ser un LINESTRING. El segundo argumento es un float8 entre 0 y 1 que representa la fracción de la longitud total 2d en que debe ubicarse el punto.

line_locate_point (LineString, Point)

  

Devuelve un flotante entre 0 y 1 que representa la ubicación del punto más cercano en LineString al Punto dado, como una fracción de la longitud total de la línea 2d.   Puede utilizar la ubicación devuelta para extraer un punto (line_interpolate_point)

Fuente: enlace

    
respondido por el underdark 21.09.2010 - 13:34
7

Hallo

Primero, la pregunta sobre qué devuelve ST_Distance. ST_Distance devuelve la distancia más corta entre la línea y el punto (o qué tipos de geometría se ingresan) Eso significa que ST_Distance entre el punto (1 3) y la cadena de líneas (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) hasta (0 3).

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 usas así: ST_Closestpoint ('LINESTRING (0 0,0 10)' :: geometría, 'PUNTO (1 3)' :: geometría) luego debe obtener el punto (0 3) a cambio, el punto en la línea que está más cerca de su punto.

HTH Nicklas

    
respondido por el Nicklas Avén 06.10.2010 - 14:50
2

Este hilo de archivo de Postgis puede responderte enlace

    
respondido por el ThomasG77 21.09.2010 - 13:45

Lea otras preguntas en las etiquetas