Algorithme pour décaler une latitude / longitude de quelques mètres

108

Je cherche un algorithme qui, une paire latitude / longitude et une traduction vectorielle en mètres en coordonnées cartésiennes (x, y) me donnerait une nouvelle coordonnée. Un peu comme un Haversine inversé. Je pourrais aussi travailler avec une transformation de distance et de cap, mais cela serait probablement plus lent et moins précis. Idéalement, l'algorithme devrait être rapide car je travaille sur un système embarqué. La précision n'est pas critique, à moins de 10 mètres serait une bonne chose.

Thomas O
la source
Alors tu serais capable de modeler la terre comme une sphère?
underdark
1
Ouais, ce serait bien car j'attends moins de 1 km de compensation.
Thomas O

Réponses:

107

Si vos déplacements ne sont pas trop importants (moins de quelques kilomètres) et que vous n'êtes pas au niveau des pôles, utilisez l'estimation rapide et grossière selon laquelle 111 111 mètres (111,111 km) dans la direction y est de 1 degré (de latitude) et 111,111 * cos (latitude) mètres dans la direction x est égal à 1 degré (de longitude).

whuber
la source
3
@Thomas: En fait, vous pouvez être très proche des pôles. J'ai vérifié par rapport à un calcul UTM utilisant des déplacements x et y égaux de 1400 m (le déplacement total est donc de 2 km). Les résultats sont bons à 8,6 mètres ou mieux. La pire latitude (pour cette direction et cette quantité de déplacement) est de 81 degrés: l'approximation devient plus précise à mesure que vous vous déplacez vers le nord et son erreur reste inférieure à 10 mètres jusqu'à ce que vous dépassiez 89,6 degrés!
whuber
60
Incidemment, il est facile de se souvenir de ces nombres magiques de 111,111 en connaissant une certaine histoire: les Français avaient défini à l' origine le mètre de sorte que 10 ^ 7 mètres correspondraient à la distance le long du méridien de Paris de l'équateur au pôle nord. Ainsi, 10 ^ 7/90 = 111 111,1 mètres équivaut à un degré de latitude dans la limite des capacités des géomètres français il y a deux siècles.
whuber
3
Donc, avec la formule si je voulais déplacer + 100m dans la direction y à partir de 10.0 N, 10.0 E, est-ce que je rajouterais simplement 100/111111? Si vous vous déplacez dans la direction x + 100m, serait-il 100 (111,111 × (cos 10))? Je veux juste m'assurer que j'ai bien compris.
Thomas O
5
@ Thomas Oui, c'est vrai. Remarquez comment la deuxième formule augmente le déplacement apparent en x (en divisant par un nombre inférieur à 1) comme il se doit, car un degré de longitude diminue lorsque vous vous déplacez vers les pôles de l'équateur. Le seul problème potentiel est de s’assurer que votre plate-forme logicielle et vous êtes d’accord sur ce que signifie "cos": il vaut mieux interpréter cos (10) comme un cosinus de 10 degrés et non de 10 radians! (Si ce n'est pas le cas, 10 degrés = 10 * pi / 180 radians illustre la conversion simple.) À ce stade, le code proposé par @haakon_d devrait vous sembler complet.
whuber
7
Quelqu'un a tenté d'éditer cette réponse pour remplacer "mètres" par "km". Ils lisaient probablement la virgule "," au sens européen de virgule décimale. Je suis la convention américaine (qui, je crois, est la convention des publications internationales également) selon laquelle une virgule sépare les chaînes de chiffres longs en groupes de trois et un point décimal "." au lieu de la virgule. (Cet usage est clairement indiqué dans les commentaires précédents.) Pour éviter toute ambiguïté, j'ai modifié la réponse afin d'indiquer clairement ce que signifient les virgules et les points.
whuber
56

Comme le dit Liedman dans sa réponse, les formules d’aviation de Williams sont une source inestimable. Pour maintenir la précision à moins de 10 mètres des déplacements jusqu’à 1 km, vous devrez probablement utiliser les plus complexes.

Mais si vous êtes prêt à accepter des erreurs supérieures à 10 m pour des points décalés de plus de 200 m environ, vous pouvez utiliser un calcul simplifié de la terre plate. Je pense que les erreurs seront toujours inférieures à 50 m pour des décalages allant jusqu'à 1 km.

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

Cela devrait retourner:

 latO = 51,00089832
 lonO = 0,001427437
haakon_d
la source
7
Je tiens simplement à souligner que ceci est identique à la réponse que j’ai fournie, à la différence que vous avez remplacé ma valeur de 111 111 mètres par degré par 111 319,5. Votre valeur est légèrement meilleure aux hautes latitudes mais légèrement pire aux basses latitudes (de 0 à environ 40 degrés). Les deux valeurs répondent aux exigences de précision indiquées.
whuber
1
+1 pour fournir le code. Notez qu'il est plus précis que vous ne le pensez (l'erreur est généralement inférieure à 5 m sur 2 000 m).
whuber
1
Je me demandais si je devrais ajouter une remarque dans ma réponse, à savoir qu'il s'agit d'une solution identique à la vôtre, à l'exception de la valeur de R, mais elle l'a laissée de côté pour des raisons de brièveté. En ce qui concerne la précision, vous avez raison tant que vous n’ajoutez aucune erreur de rotation au système. En utilisant les décalages mesurés dans un système de coordonnées projetées local, les erreurs de rotation peuvent devenir assez importantes.
haakon_d
1
C'est un excellent point: nous avons implicitement supposé que le déplacement en x est au moins proche de la réalité est-ouest et que le déplacement en y est proche du nord au sud. Dans le cas contraire, ils doivent être convertis en déplacements EW et NS équivalents (pas seulement "est" et "nord") avant de calculer leurs équivalents lat-lon.
whuber
Le paramètre distance d des équations du formulaire Aviation est exprimé en radians, par exemple (distance / rayon de la Terre).
user1089933
23

Je trouve que l' aviation Formulary, ici est idéal pour ces types de formules et d' algorithmes. Pour votre problème, consultez le "lat / long donné radiale et distance": ici

Notez que cet algorithme peut être un peu trop complexe pour votre utilisation, si vous souhaitez limiter l'utilisation des fonctions de trigonométrie, etc.

Liedman
la source
Merci pour cela - semble idéal. Bien que je ne puisse pas savoir si la distance est en mètres ou une autre mesure.
Thomas O
2

Il pourrait être judicieux de projeter le point en premier. Vous pouvez faire quelque chose comme ce pseudo-code:

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

où (x, y) est le décalage souhaité.

Vous n'avez pas besoin d'utiliser utm, aucun système de coordonnées plat qui fait sens dans votre région fera l'affaire.

Avec quel logiciel travaillez-vous?

Martin
la source