Calcoli semplici per lavorare con lat / lon e km di distanza?


119

C'è un semplice calcolo che posso fare per convertire i km in un valore che posso aggiungere a un galleggiante lat o lon per calcolare un riquadro di delimitazione per le ricerche? Non è necessario che sia completamente accurato.

Ad esempio: se mi fosse stato dato un lat / lon per Londra, Inghilterra (51.5001524, -0.1262362) e volessi calcolare quale sarebbe la latitudine 25 km a est / ovest da quel punto e quale sarebbe la lon 25 km a nord / sud di quella punto, cosa dovrei fare per convertire i 25 km in un decimale da aggiungere ai valori sopra?

Sto cercando una regola pratica generale, ad esempio: 1 km == +/- 0.XXX

Modificare:

La mia ricerca originale di "lat lon" non ha restituito questo risultato:

Come calcolare il riquadro di delimitazione per una data posizione lat / lng?

La risposta accettata sembra adeguata alle mie esigenze.


Risposte:


220

Le conversioni approssimative sono:

  • Latitudine: 1 grado = 110,574 km
  • Longitudine: 1 gradi = 111,320 * cos (latitudine) km

Questo non è del tutto corretto per l'appiattimento polare della Terra - per questo probabilmente vorresti una formula più complicata usando l'ellissoide di riferimento WGS84 (il modello usato per il GPS). Ma l'errore è probabilmente trascurabile per i tuoi scopi.

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

Attenzione : tieni presente che le coordinate latlong sono espresse in gradi, mentre la cosfunzione nella maggior parte delle lingue (tutte?) In genere accetta i radianti, quindi è necessaria una conversione da gradi a radianti .


Intendi cos (longitudine) nella seconda formula?
Odys

1
Come sei arrivato a questo? Mi manca qualcosa, puoi approfondire i calcoli di longitudine? Ty
Odys

5
@ Odys: se stai confrontando due punti che si trovano sulla stessa linea di longitudine (nord / sud), si trovano su un grande cerchio e il fattore di conversione è solo la circonferenza polare della Terra divisa per 360 gradi. Ma è diverso per le misurazioni est-ovest, perché (ad eccezione dell'equatore) non stai misurando lungo un "cerchio grande", quindi la "circonferenza" a una data latitudine è più piccola. E il fattore di correzione risulta essere il coseno della latitudine.
Jim Lewis

17
La mia spiegazione: cos(0°) = 1=> Pertanto non viene applicato alcun fattore di correzione durante il calcolo all'equatore. Le longitudini sono le più ampie lì. cos(90°) = 0=> Ai poli le longitudini si incontrano in un punto. Non c'è distanza da calcolare.
Jenny O'Reilly

4
@Stijn: è necessario convertire da gradi a radianti prima di chiamare Math.cos ().
Jim Lewis,


1

http://www.jstott.me.uk/jcoord/ - usa questa libreria

            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);


1

Grazie Jim Lewis per la sua ottima risposta e vorrei illustrare questa soluzione dalla mia funzione in 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)
    }

In questa funzione per convertire la distanza utilizzo le seguenti formule:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))

Penso che dovrebbe essere "lat * pi / 180"
magamig

1

Perché non utilizzare query geospaziali correttamente formulate ???

Ecco la pagina di riferimento del server SQL sulla funzione geospaziale STContains:

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

oppure se non si rinuncia a utilizzare box e conversione in radianti, è possibile utilizzare sempre la funzione distanza per trovare i punti di cui si ha bisogno:

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

Dovrebbero esserci funzionalità simili per quasi tutti i database disponibili.

Se hai implementato correttamente l'indicizzazione geospaziale, le tue ricerche sarebbero molto più veloci dell'approccio che stai utilizzando


1
Dedica un momento alla lettura della guida alla modifica nel Centro assistenza . La formattazione su Stack Overflow è diversa da quella di altri siti.
Dharman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.