Cálculos simples para trabalhar com lat / lon e km de distância?

119

Existe um cálculo simples que posso fazer para converter km em um valor que posso adicionar a uma flutuação lat ou lon para calcular uma caixa delimitadora para pesquisas? Não precisa ser totalmente preciso.

Por exemplo: se eu recebesse uma latitude / longitude para Londres, Inglaterra (51,5001524, -0,1262362) e eu quisesse calcular qual lat seria 25km leste / oeste daquele ponto e qual long seria 25km norte / sul daquele ponto, o que eu preciso fazer para converter os 25km em um decimal para somar aos valores acima?

Estou procurando uma regra geral, ou seja: 1km == +/- 0.XXX

Editar:

Minha pesquisa original por "lat lon" não retornou este resultado:

Como calcular a caixa delimitadora para uma determinada localização lat / lng?

A resposta aceita parece adequada para minhas necessidades.

Phillip B Oldham
fonte

Respostas:

220

As conversões aproximadas são:

  • Latitude: 1 grau = 110,574 km
  • Longitude: 1 grau = 111,320 * cos (latitude) km

Isso não é totalmente correto para o achatamento polar da Terra - para isso, você provavelmente gostaria de uma fórmula mais complicada usando o elipsóide de referência WGS84 (o modelo usado para GPS). Mas o erro provavelmente é insignificante para seus propósitos.

Fonte: http://en.wikipedia.org/wiki/Latitude

Cuidado : Esteja ciente de que as coordenadas latlong são expressas em graus, enquanto a cosfunção na maioria (todas?) Das linguagens normalmente aceita radianos, portanto, uma conversão de grau para radianos é necessária.

Jim Lewis
fonte
Você quer dizer cos (longitude) na segunda fórmula?
Odys
1
Como você veio com isso? Estou faltando alguma coisa, você pode, por favor, elaborar os cálculos da longitude? Ty
Odys
5
@Odys: se você está comparando dois pontos que estão na mesma linha de longitude (norte / sul), eles estão em um grande círculo e o fator de conversão é apenas a circunferência polar da Terra dividida por 360 graus. Mas é diferente para medições leste-oeste, porque (exceto para o equador) você não está medindo ao longo de um "grande círculo", então a "circunferência" em uma determinada latitude é menor. E o fator de correção acaba sendo o cosseno da latitude.
Jim Lewis
17
Minha explicação: cos(0°) = 1=> Portanto, não há fator de correção aplicado ao fazer o cálculo no equador. As longitudes são as mais largas lá. cos(90°) = 0=> Nos pólos as longitudes se encontram em um ponto. Não há distância a ser calculada.
Jenny O'Reilly
4
@Stijn: você precisa converter de graus para radianos antes de chamar Math.cos ().
Jim Lewis
5

Se você estiver usando Java, Javascript ou PHP, existe uma biblioteca que fará esses cálculos exatamente, usando uma trigonometria divertidamente complicada (mas ainda rápida):

http://www.jstott.me.uk/jcoord/

skaffman
fonte
O site já possui a biblioteca.
meio-
2
O link está quebrado!
chatzich
Para PHP, você pode usar este fork: github.com/dvdoug/PHPCoord
dearsina
1

http://www.jstott.me.uk/jcoord/ - use esta biblioteca

            LatLng lld1 = new LatLng(40.718119, -73.995667);
            LatLng lld2 = new LatLng(51.499981, -0.125313);
            Double distance = lld1.distance(lld2);
            Log.d(TAG, "Distance in kilometers " + distance);
Nikhil Dinesh
fonte
1

Obrigado Jim Lewis por sua ótima resposta e eu gostaria de ilustrar esta solução por minha função no Swift:

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

Nesta função para converter distância eu uso as seguintes fórmulas:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))
Serj Kultenko
fonte
Eu acho que deveria ser "lat * pi / 180"
magamig
1

Por que não usar consultas geoespaciais devidamente formuladas ??

Aqui está a página de referência do servidor SQL na função geoespacial STContains:

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

ou se você não desistir de usar conversão de caixa e radianos, você pode sempre usar a função de distância para encontrar os pontos que você precisa:

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

Deve haver funcionalidade semelhante para quase qualquer banco de dados lá fora.

Se você implementou a indexação geoespacial corretamente, suas pesquisas seriam muito mais rápidas do que a abordagem que você está usando

George Karadov
fonte
1
Por favor, tome um momento para ler a ajuda de editar no centro de ajuda . A formatação no Stack Overflow é diferente de outros sites.
Dharman