Estou tentando implementar uma verificação muito eficiente para ver se dois pontos estão a uma milha um do outro, ou não.
Minha abordagem atual é calcular a distância de Haversine e verificar se está a menos de uma milha.
A eficiência é importante nesse caso, porque eu tenho que calcular esse sinalizador de sim / não para grandes conjuntos de registros.
Só me importo se eles estão a uma milha - nada mais sobre a distância importa para mim.
Então, qual é a maneira mais eficiente de saber se dois pontos lat / long estão a uma milha um do outro?
Em resposta aos comentários, estou fazendo isso no SQL Server. Meu código está abaixo.
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
fonte
fonte
Respostas:
Experimente este método - pode não ser o melhor, mas pode limitar o espaço de pesquisa a alguns e, assim, ajudá-lo a acelerar o processo.
Certifique-se de criar índices espaciais e verifique se esse procedimento melhorou o tempo de resposta da consulta. Você também pode refinar a abordagem criando uma tabela próxima (o ESRI ArcGIS tem uma ferramenta) com 1 milha como critério.
fonte
Se você trabalha em nível global, pode evitar calcular muito pecado e cos através de testes simples e diretos:
O primeiro teste para rastrear pontos antes de computar a haversine é excluir o ponto em que @DLAT> 0,015 graus (pode ser mais preciso, mas eu prefiro segurança).
Em uma segunda etapa, você também pode fazer isso com o @DLON em um determinado intervalo de latitude com um valor conservador (por exemplo, entre -60 e 60 graus, exclua o @DLON> 0,03 (= 0,015 / cos (60)).
Como 1 milha é muito pequena, você raramente precisará calcular Haversine com essas duas regras (exceto se trabalhar em áreas polares) e poderá substituir Haversine por Pitágoras (2 cossenos versus 2 senos e 2 cossenos com Haversine), como mencionado por @whuber.
fonte