Estoy tratando de implementar una verificación muy eficiente para ver si dos puntos están a una milla uno del otro, o no.
Mi enfoque actual es calcular la distancia de Haversine y luego verificar para ver si es menos de una milla.
La eficiencia importa en este caso porque tengo que calcular este indicador sí / no para grandes conjuntos de registros.
Solo me importa si están dentro de una milla , nada más sobre la distancia me importa.
Entonces, ¿cuál es la forma más eficiente de saber si dos puntos lat / long están a una milla de distancia?
En respuesta a los comentarios, estoy haciendo esto en SQL Server. Mi codigo esta abajo.
CREATE FUNCTION dbo.USR_UFN_HAVERSINE_DISTANCE
(
@LAT1 FLOAT(18)
,@LONG1 FLOAT(18)
,@LAT2 FLOAT(18)
,@LONG2 FLOAT(18)
,@UnitOfMeasure NVARCHAR(10) = 'KILOMETERS'
)
RETURNS FLOAT(18)
AS
BEGIN
DECLARE
@R FLOAT(8)
,@DLAT FLOAT(18)
,@DLON FLOAT(18)
,@A FLOAT(18)
,@C FLOAT(18)
,@D FLOAT(18)
;
SET @R =
CASE @UnitOfMeasure
WHEN 'MILES' THEN 3956.55
WHEN 'KILOMETERS' THEN 6367.45
WHEN 'FEET' THEN 20890584
WHEN 'METERS' THEN 6367450
ELSE 6367.45 --km
END
SET @DLAT = RADIANS(@LAT2 - @LAT1);
SET @DLON = RADIANS(@LONG2 - @LONG1);
SET @A = SIN(@DLAT / 2)
* SIN(@DLAT / 2)
+ COS(RADIANS(@LAT1))
* COS(RADIANS(@LAT2))
* SIN(@DLON / 2)
* SIN(@DLON / 2);
SET @C = 2 * ASIN(MIN(SQRT(@A)));
SET @D = @R * @C;
RETURN @D;
END;
distance
sql-server
algorithm
software-recommendations
JosephStyons
fuente
fuente
Respuestas:
Pruebe este método; puede que no sea el mejor, pero podría limitar su espacio de búsqueda a unos pocos y, por lo tanto, ayudarlo a acelerar el proceso.
Asegúrese de haber creado índices espaciales y verifique si este procedimiento ha mejorado el tiempo de respuesta de su consulta. También puede refinar el enfoque creando una tabla cercana (ESRI ArcGIS tiene una herramienta) con 1 milla como criterio.
fuente
Si trabaja a nivel mundial, puede evitar calcular muchos pecados y cos mediante simples pruebas directas:
La primera prueba para detectar puntos antes de calcular haversine es excluir el punto donde @DLAT> 0.015 grados (podría ser más preciso, pero prefiero la seguridad).
En un segundo paso, también puede hacer esto con @DLON en un rango de latitud dado con un valor conservador (por ejemplo, entre -60 y 60 grados, excluya @DLON> 0.03 (= 0.015 / cos (60)).
Debido a que 1 milla es bastante pequeña, rara vez necesitará calcular Haversine con estas dos reglas (excepto si trabaja en áreas polares), y podría reemplazar Haversine con Pitágoras (2 cosenos versus 2 senos y 2 cosenos con Haversina) como se mencionó por @whuber.
fuente