Calculs simples pour travailler avec lat / lon et la distance en km?

119

Y a-t-il un calcul simple que je peux faire qui convertira km en une valeur que je peux ajouter à un flotteur lat ou lon pour calculer une boîte englobante pour les recherches? Il n'a pas besoin d'être complètement précis.

Par exemple: si on me donnait un lat / lon pour Londres, Angleterre (51,5001524, -0,1262362) et que je voulais calculer ce que serait le lat à 25 km est / ouest de ce point, et ce que serait le lon à 25 km au nord / sud de cela point, que dois-je faire pour convertir les 25 km en un nombre décimal à ajouter aux valeurs ci-dessus?

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

Éditer:

Ma recherche initiale pour "lat lon" n'a pas retourné ce résultat:

Comment calculer la boîte englobante pour un emplacement lat / lng donné?

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

Phillip B Oldham
la source

Réponses:

221

Les conversions approximatives sont:

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

Cela ne corrige pas entièrement 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 cosfonction dans la plupart des langues (toutes?) Accepte généralement les radians, donc une conversion des degrés en radians est nécessaire.

Jim Lewis
la source
Voulez-vous dire cos (longitude) dans la deuxième formule?
Odys
1
Comment en êtes-vous arrivé là? Il me manque quelque chose, pouvez-vous préciser les calculs de longitude? Ty
Odys
5
@Odys: Si vous comparez deux points qui se trouvent sur la même ligne de longitude (nord / sud), ils se trouvent sur un grand cercle et le facteur de conversion est juste la circonférence polaire de la Terre divisée par 360 degrés. Mais c'est différent pour les mesures est-ouest, car (à l'exception de l'équateur) vous ne mesurez pas le long d'un "grand cercle", donc la "circonférence" à une latitude donnée est plus petite. Et le facteur de correction s'avère être le cosinus de la latitude.
Jim Lewis
17
Mon explication: cos(0°) = 1=> Il n'y a donc pas de facteur de correction appliqué lors du calcul à l'équateur. Les longitudes y sont les plus larges. cos(90°) = 0=> Aux pôles les longitudes se rencontrent en un point. Il n'y a pas de distance à calculer.
Jenny O'Reilly
4
@Stijn: Vous devez convertir des degrés en radians avant d'appeler Math.cos ().
Jim Lewis
5

Si vous utilisez Java, Javascript ou PHP, il existe une bibliothèque qui effectuera exactement ces calculs, en utilisant une trigonométrie amusante compliquée (mais toujours rapide):

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

skaffman
la source
Le site a maintenant la bibliothèque.
milieu de
2
Le lien est rompu!
chatzich
Pour PHP, vous pouvez utiliser ce fork: github.com/dvdoug/PHPCoord
dearsina
1

http://www.jstott.me.uk/jcoord/ - utilisez 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);
Nikhil Dinesh
la source
1

Merci Jim Lewis pour sa bonne réponse et je voudrais 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))
Serj Kultenko
la source
Je pense que ça devrait être "lat * pi / 180"
magamig le
1

Pourquoi ne pas utiliser des requêtes géospatiales correctement formulées ???

Voici la page de référence du serveur SQL sur la fonction géospatiale STContains:

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

ou si vous ne souhaitez pas utiliser la conversion box et radian, vous pouvez toujours utiliser la fonction distance pour trouver les points dont vous avez besoin:

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

Il devrait y avoir des fonctionnalités similaires pour presque toutes les bases de données.

Si vous avez correctement implémenté l'indexation géospatiale, vos recherches seraient bien plus rapides que l'approche que vous utilisez

George Karadov
la source
1
Veuillez prendre un moment pour lire l' aide à la modification dans le centre d'aide . Le formatage sur Stack Overflow est différent des autres sites.
Dharman