5 votos

ST_DistanceSphere y KNN discrepancia

Tengo una tabla que contiene miles de puntos de datos en los alrededores de Londres.

Estoy tratando de escribir una consulta para encontrar el más cercano de puntos de datos a una determinada latitud y longitud.

Estoy obteniendo diferentes resultados en función de si puedo realizar el pedido por la <-> de la distancia del operador o el resultado de ST_DistanceSphere. Aquí están las dos consultas y sus resultados:


Order By <->
------------
SELECT 
uid,
ST_DistanceSphere(
  ST_PointFromText('POINT(-0.186243362115208 51.5128590051459)', 4326),
  the_geom
) as d
FROM points 
ORDER BY the_geom <-> ST_SetSRID(ST_Point(-0.186243362115208, 51.5128590051459), 4326) LIMIT 5;

Resultados:

  uid   |         st_astext          |       d
---------+----------------------------+---------------
6997685 | POINT(-0.186723 51.500052) | 1424.46281677
6997684 | POINT(-0.187011 51.500056) | 1424.62219563
6997686 | POINT(-0.186435 51.500047) | 1424.69367394
6997683 | POINT(-0.187299 51.500061) | 1424.94947768
6997687 | POINT(-0.186147 51.500043) |    1425.09232

Order By ST_DistanceSphere
--------------------------
SELECT 
uid,
ST_DistanceSphere(
  ST_PointFromText('POINT(-0.186243362115208 51.5128590051459)', 4326),
  the_geom
) as d
FROM points 
ORDER BY d LIMIT 5;

Resultados:

   uid   |         st_astext          |       d
---------+----------------------------+---------------
6997686 | POINT(-0.186435 51.500047) | 1424.69367394
6997685 | POINT(-0.186723 51.500052) | 1424.46281677
6997687 | POINT(-0.186147 51.500043) |    1425.09232
6997688 | POINT(-0.185859 51.500039) | 1425.76968591
6997684 | POINT(-0.187011 51.500056) | 1424.62219563

Como se puede ver, la primera consulta devuelve 6997683 en los resultados, pero la segunda consulta no (y vuelve 6997688 lugar). 6997683 es el más cercano el valor de los dos, 6997688 no debe ser devuelto por la consulta.

El tipo de the_geom es ST_Point y el SRID (marcada con Find_SRID) 4326.

¿Cuál podría ser la causa de la diferencia, y lo que estoy haciendo mal?

1voto

Idelic Puntos 4196

Creo que esto es porque <-> usa ST_Distance , ya que cuando ordeno explícitamente por ST_Distance obtengo los mismos resultados.

He modificado mi consulta a esto:

 SELECT 
  points.*,
  ST_AsText(points.geolocation) as geolocation, 
  ST_DistanceSphere(points.geolocation, ST_Point(:x, :y)) as distance

FROM (
  SELECT * FROM points ORDER BY geolocation <-> ST_SetSRID(ST_Point(:x, :y),4326) LIMIT 50
) as points

ORDER BY ST_DistanceSphere(points.geolocation, ST_Point(:x, :y)) LIMIT 5
 

Utilizo la eficiencia de <-> para reducir mis resultados a los "50" más cercanos y luego filtrar esta lista por el ST_DistanceSphere más preciso. Y creo que me da los resultados que quiero.

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