5 votos

Selección de los puntos más cercanos a partir de un punto dado en otra mesa

Tengo dos tablas, una con "casas" y otra con "puntos". Sé cómo obtener la distancia individualmente, así:

gisdb=# SELECT round(ST_Distance_Sphere(
(SELECT coordinates FROM houses WHERE id = 1),
(SELECT coordinates FROM points WHERE id = 2)))
as Distance
;
 distance
----------
      174
(1 row)

El caso es que si en la tabla "puntos" tengo unos 50 puntos, ¿cómo puedo hacer que devuelva la distancia del más cercano?

He visto la función ST_ClosestPoint pero no sé cómo aplicarlo a mi consulta.

0 votos

Por favor, dedícale más tiempo a investigar cómo hacer un "self join". Tenga en cuenta que sólo quiere hacer coincidir las características con una clave única superior.

0 votos

Había pensado en eso; recoger todas las distancias y luego devolver la más baja con min() pero no fue una forma muy limpia. Por eso pregunté aquí.

0 votos

@Newwt puede actualizar la pregunta con SELECT version() UNION ALL SELECT postgis_version();

5voto

Cohen Puntos 1649

Para encontrar el más cercano points a houses puede reemplazar su segunda subconsulta (SELECT coordinates FROM points WHERE id = 2) con uno que encuentre específicamente los puntos más cercanos, por ejemplo, ordenando:

SELECT coordinates FROM points ORDER BY coordinates <->
    (select coordinates from houses where id = 1) LIMIT 1 )

Esto selecciona el punto cuya distancia ( <-> ) a la casa con id=1 es el más pequeño ( ORDER BY y LIMIT 1 ). El SQL completo puede ser algo así:

SELECT round(ST_DistanceSphere(
 (SELECT coordinates FROM houses WHERE id = 1),
 (SELECT coordinates FROM points ORDER BY coordinates <->
    (select coordinates from houses where id = 1) LIMIT 1 )
 ))
as Distance;

Por cierto, ST_ClosestPoint probablemente no es lo que está buscando. Selecciona el vértice más cercano de una geometría (por ejemplo, una polilínea) con respecto a una geometría de consulta (por ejemplo, un punto). En su caso, el points contiene puntos, no multipuntos.

0 votos

Funciona perfectamente. Lo único que sugeriría cambiar es ST_DistanceSphere para ST_Distance_Sphere . Muchas gracias.

1 votos

@Newwt No, tinlyx lo hizo bien. ST_DistanceSphere es el nombre de la versión 2.x (actualizado para que coincida con la especificación), ST_Distance_Sphere es el nombre 1.5. Si estuvieras en la 1.5, no tendrías <-> . Esta respuesta utiliza knn (índice) para determinar la casa más cercana. Eso es genial. Es una gran consulta. No puedes usarla en 1.5x.

0 votos

@EvanCarroll: imgur.com/QkxXsns . El segundo no devuelve ningún resultado porque los ids no existen, pero qué más da.

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