web-dev-qa-db-fra.com

Calculs simples pour travailler avec lat/lon + km distance?

Existe-t-il un calcul simple que je peux faire et qui convertira km en une valeur que je peux ajouter à un flottant lat ou long pour calculer un cadre de sélection? Il n'a pas besoin d'être complètement précis.

Par exemple: si on me donnait une latitude pour Londres, en Angleterre (51.5001524, -0.1262362) et que je voulais calculer quelle serait la latitude à 25 km est/ouest à partir de ce point et celle à l Point, que devrais-je faire pour convertir les 25 km en virgule à ajouter aux valeurs ci-dessus?

Je recherche une règle générale, c'est-à-dire: 1 km == +/- 0.XXX

Modifier:

Ma recherche initiale de "lat lon" n'a pas donné ce résultat:

_ { Comment calculer le cadre de sélection pour un emplacement donné en latitude/longitude? } _

La réponse acceptée semble convenir à mes besoins.

105
Phillip B Oldham

Les conversions approximatives sont:

  • Latitude: 1 deg = 110.574 km
  • Longitude: 1 deg = 111.320 * cos (latitude) km

Cela ne corrige pas totalement l'aplatissement polaire de la Terre - pour cela, vous voudriez probablement une formule plus compliquée utilisant l'ellipsoïde de référence WGS84 (le modèle utilisé pour le GPS). Mais l'erreur est probablement négligeable pour vos besoins.

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

Attention: Sachez que les coordonnées latlong sont exprimées en degrés, alors que la fonction cos de la plupart des langues (toutes?) Accepte généralement les radians. Par conséquent, une conversion de degrés en radians est nécessaire.

188
Jim Lewis

Si vous utilisez Java, Javascript ou PHP, alors une bibliothèque effectuera ces calculs avec exactitude, en utilisant une trigonométrie amusante et compliquée (mais toujours rapide):

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

4
skaffman

http://www.jstott.me.uk/jcoord/ - utiliser cette bibliothèque

            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
Nikhil Dinesh

Intéressant que je n'ai pas vu une mention des coordonnées UTM. 

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system .

Du moins si vous voulez ajouter des km à la même zone, cela devrait être simple (en Python: https://pypi.org/project/utm/ )

utm.from_latlon et utm.to_latlon.

0
Mircea

Merci Jim Lewis pour cette excellente réponse et j'aimerais illustrer cette solution par ma fonction dans 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)
    }

Dans cette fonction pour convertir la distance, j'utilise les formules suivantes:

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