Estou tentando calcular a distância entre duas posições em um mapa. Tenho armazenado em meus dados: Longitude, Latitude, X POS, Y POS.
Eu usei anteriormente o trecho abaixo.
DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
3956 * 2 * ASIN(
SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2)
+ COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)
* POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) ))
AS distance
--INTO #includeDistances
FROM #orig dest
No entanto, não confio nos dados que saem disso, parece estar dando resultados ligeiramente imprecisos.
Alguns dados de amostra, caso você precise
Latitude Longitude Distance
53.429108 -2.500953 85.2981833133896
Alguém poderia me ajudar com meu código, não me importo se você quiser consertar o que já tenho se você tiver uma nova maneira de conseguir isso que seria ótimo.
Indique em que unidade de medida estão os seus resultados.
sql
sql-server
tsql
math
sql-server-2008-r2
Waller
fonte
fonte
Respostas:
Como está usando o SQL Server 2008, você tem o
geography
tipo de dados disponível, projetado exatamente para este tipo de dados:Dá
Dizendo-nos que fica a cerca de 538 km de (perto) de Londres a (perto de) Edimburgo.
Naturalmente, haverá muito aprendizado a ser feito primeiro, mas uma vez que você saiba, é muito mais fácil do que implementar seu próprio cálculo de Haversine; além disso, você obtém MUITA funcionalidade.
Se quiser manter sua estrutura de dados existente, você ainda pode usar
STDistance
, construindogeography
instâncias adequadas usando oPoint
método:fonte
A função abaixo fornece a distância entre duas geocoordenadas em milhas
A função abaixo fornece a distância entre duas geocoordenadas em quilômetros
A função abaixo fornece a distância entre duas geocoordenadas em quilômetros usando o tipo de dados Geografia que foi introduzido no sql server 2008
Uso:
Referência: Ref1 , Ref2
fonte
Parece que a Microsoft invadiu os cérebros de todos os outros entrevistados e os fez escrever as soluções mais complicadas possíveis. Esta é a maneira mais simples, sem nenhuma função adicional / declarações de declaração:
Basta substituir os seus dados, em vez de
LATITUDE_1
,LONGITUDE_1
,LATITUDE_2
,LONGITUDE_2
por exemplo:fonte
Como você está usando o SQL 2008 ou posterior, recomendo verificar o tipo de dados GEOGRAPHY . O SQL possui suporte integrado para consultas geoespaciais.
por exemplo, você teria uma coluna em sua tabela do tipo GEOGRAPHY que seria preenchida com uma representação geoespacial das coordenadas (verifique a referência do MSDN no link acima para obter exemplos). Este tipo de dados então expõe métodos que permitem que você execute uma série de consultas geoespaciais (por exemplo, encontrar a distância entre 2 pontos)
fonte
Uso:
selecione dbo.DistanceKM (37.848832506474, 37.848732506474, 27.83935546875, 27.83905546875)
Saídas:
0,02849639
Você pode alterar o parâmetro @R com flutuações comentadas.
fonte
Além das respostas anteriores, aqui está uma maneira de calcular a distância dentro de um SELECT:
Uso:
As funções escalares também funcionam, mas são muito ineficientes ao computar uma grande quantidade de dados.
Espero que isso possa ajudar alguém.
fonte