- Lorsqu’on ajoute à des coordonnées latitude/longitude des déplacements x,y en mètres, si la distance parcourue est de quelques km au maximum et qu’on n’est pas près des pôles, une simple approximation suffit pour calculer rapidement
- Le calcul de base consiste à considérer 111 111 m dans la direction y comme 1 degré de latitude, et
111111 * cos(latitude) m dans la direction x comme 1 degré de longitude ; pour un déplacement de 100 m vers le nord, il suffit donc d’ajouter 100 / 111111 degré
- On peut exprimer la même idée en modélisant la Terre comme une sphère de rayon
R=6378137 et en calculant dLat=dn/R, dLon=de/(R*cos(lat)) ; à la latitude 51°, avec dn=100 et de=100, on obtient latO=51.00089832, lonO=0.001427437
- Si l’exigence de précision est inférieure à 10 m et que l’offset va jusqu’à 1 km, on peut utiliser des formules plus complexes comme celles de l’Aviation Formulary, mais l’approximation plane simple devrait rester sous 50 m d’erreur pour un offset de 1 km
- Si l’on doit aussi tenir compte de la variation de la longueur d’un degré selon la latitude, il est plus sûr d’utiliser les formules meters per degree, ou de convertir vers un système de coordonnées projetées local, d’ajouter le déplacement, puis de reconvertir en latitude/longitude
Pour les petits déplacements, l’approximation 111 111 m/degré suffit
- Pour de petits déplacements, on peut calculer la variation de latitude/longitude avec l’approximation suivante
- 111 111 m en direction y ≈ 1 degré de latitude
111111 * cos(latitude) m en direction x ≈ 1 degré de longitude
- Les nouvelles coordonnées s’obtiennent approximativement ainsi
lat_new = lat + dy / 111111
lon_new = lon + dx / (111111 * cos(latitude))
- Pour
cos(latitude), il faut utiliser l’unité attendue par l’environnement d’exécution
- Dans un environnement qui attend des radians, il faut convertir avec
latitude * pi / 180
- Cette approximation convient lorsque le déplacement n’est pas trop grand, qu’on n’est pas tout près des pôles et que l’exigence de précision n’est pas très élevée
Origine du nombre 111 111 m et marge d’erreur
- La valeur 111 111 est liée à la définition historique du mètre
- La France avait initialement défini le mètre comme
10^7e de la distance mesurée le long du méridien de Paris, de l’équateur au pôle Nord
10^7 / 90 = 111 111,1 m correspond donc à 1 degré de latitude
- Dans une vérification en commentaire, la comparaison avec un calcul UTM, pour 1 400 m sur chacun des axes x et y et un déplacement total de 2 km, donnait un écart de 8,6 m au maximum
- Dans ces conditions, la pire latitude était 81°
- L’erreur restait sous 10 m jusqu’au-delà de 89,6°
- La formule simple tient compte, avec
cos(latitude), du fait que les longitudes se resserrent vers les régions polaires
- Comme la distance réelle correspondant à 1 degré de longitude diminue, un même déplacement en mètres dans la direction x se convertit en une variation de longitude plus grande aux hautes latitudes
Le même calcul avec le rayon de la Terre
- Le même calcul peut aussi être exprimé avec une formule basée sur le rayon terrestre
//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
- Cet exemple renvoie le résultat suivant
latO = 51,00089832
lonO = 0,001427437
- Cette méthode est pratiquement la même solution que l’approximation 111 111 m/degré, à ceci près qu’elle utilise une valeur basée sur le rayon, plus proche de
111319.5m
- Le déplacement x doit être proche d’un vrai axe est-ouest, et le déplacement y proche d’un axe nord-sud
- Si l’easting/northing d’un système de coordonnées projetées local est orienté avec une rotation, il faut d’abord le convertir en composantes est-ouest et nord-sud
Options quand il faut plus de précision
- La formule “lat/long given radial and distance” de l’Aviation Formulary peut être utilisée pour calculer une nouvelle latitude/longitude à partir d’une distance et d’un azimut
- Elle peut être un peu complexe pour des environnements embarqués où l’on souhaite réduire l’usage des fonctions trigonométriques
- Le paramètre de distance est traité comme une valeur en radians sous la forme
distance / earth radius
- On peut aussi projeter les coordonnées dans un système plan adapté à la région, puis ajouter l’offset
flat_coordinate = latlon_to_utm(original_coordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)
- Cette approche ne nécessite pas forcément UTM ; n’importe quel système de coordonnées plan adapté à la zone peut convenir
- En revanche, elle est difficile à appliquer telle quelle si le déplacement fait franchir une limite de zone UTM
Exemples d’implémentation par langage et formules précises selon la latitude
- L’exemple Python encapsule directement l’approximation 111 111 m/degré dans une fonction
from math import cos, radians
def meters_to_lat_lon_displacement(m, origin_latitude):
lat = m / 111111
lon = m / (111111 * cos(radians(origin_latitude)))
return lat, lon
- L’exemple R effectue le même calcul
deg2rad = function(deg) {(deg * pi) / (180)}
meters_to_lat_lon_displacement = function(m, origin_latitude){
lat = m / 111111
lon = m / (111111 * cos((deg2rad(origin_latitude))))
return(list(lat=lat,lon=lon))
}
- Une formule meters per degree plus précise selon la latitude peut s’écrire ainsi
meters_per_degree_lat = (111132.92 - 559.82 * np.cos(2 * lat0_rad) +
1.175 * np.cos(4 * lat0_rad) - 0.0023 * np.cos(6 * lat0_rad))
meters_per_degree_lon = (111412.84 * np.cos(lat0_rad) -
93.5 * np.cos(3 * lat0_rad) + 0.118 * np.cos(5 * lat0_rad))
- Cette formule précise reflète le fait que la longueur d’un degré de latitude et d’un degré de longitude varie continuellement selon la latitude
- L’exemple Swift calcule le rayon terrestre en fonction de la latitude et utilise une distance et un azimut pour obtenir une nouvelle
CLLocationCoordinate2D
1 commentaires
Commentaires Hacker News
Le mètre a été redéfini en 1791 comme le dix-millionième du quart du méridien passant par Paris, c’est-à-dire de la longueur d’un arc de 90 degrés.
Ainsi, 1° ≡ 1/90 × 10^7 m = 111 111,111... m, et la circonférence de la Terre est donc d’environ 40 millions de mètres, soit 40 000 km.
La définition initiale du mètre était celle du pendule à secondes, c’est-à-dire la longueur d’un pendule dont la période est de 2 secondes ; en posant T = 2 et L = 1 dans T ≈ 2π√(L/g), on obtient 1 = π√(1/g), puis 1 = π²/g.
Donc le fait que g soit proche de π² n’est pas non plus une pure coïncidence, et le fait que 1 cm³ d’eau vaille 1 g vient aussi de ce que cela a longtemps été la définition du gramme.
Quand le mètre était défini par le pendule à secondes, il était entièrement lié à la définition de la seconde et à la valeur de g ; sous forme d’équation, 1 m = 1 s² × g / π².
g ≈ π² en découle naturellement, mais le fait que la circonférence terrestre soit suffisamment proche de 40 000 km pour que l’on puisse redéfinir le mètre comme une puissance de 10 sans grand changement ressemble à une coïncidence.
https://en.wikipedia.org/wiki/Second#Fraction_of_solar_day
3 pieds anglais ne font qu’environ 0,91 m.
Les gens de l’époque n’ont pas vraiment dérivé l’unité de longueur la plus principielle ou cosmiquement élégante dans le vide ; ils ont plutôt cherché à définir une unité déjà en usage autrement que par « la longueur de cette barre là-bas ».
Utiliser 40 000 km au lieu de 360 degrés, effectuer les vrais calculs avec les distances réelles, tout en gardant une approximation suffisamment proche.
Ainsi, au moins pour les utilisateurs du système métrique, il n’y aurait plus besoin de conversion pour passer à une distance.
Le problème des degrés est qu’il est difficile de les convertir en distances utiles ; cette astuce aide, mais l’absence de conversion dès le départ serait préférable.
Un mille marin, environ 6076 ft, correspond exactement à une minute d’arc à l’équateur terrestre.
Du point de vue de la navigation, j’aimerais que tous les milles soient des milles marins.
Le mille marin a un vrai sens ; 5280 ft, franchement, ça signifie quoi ?
La longueur de la chaîne est un sous-produit du droit fiscal foncier britannique, qui imposait les terres sur la base de l’acre.
Le mile romain valait 1000 pas, soit 5000 ft, ce qui avait un peu plus de sens.
https://en.wikipedia.org/wiki/Gunter%27s_chain
À l’origine, le mile romain valait 5000 pieds romains.
En réalité, 1 nmi ≡ 1,852 km par définition exacte.
La définition originale du mètre donne aussi 1/60 × 1/90 × 10^7 = 1851,85185185... m.
La caractéristique essentielle du SI et de ses prédécesseurs, MKS et CGS, était dès le départ la convertibilité entre unités ; c’est pourquoi on a des relations comme 1 m ≡ 1 s ≡ 1 kg ≡ 1 N ≡ 1 Pa ≡ 1 J ≡ 1 A ≡ 1 C ≡ 1 V ≡ 1 Ω ≡ 1 F ≡ 1 W ≡ 1 Wb ≡ 1 T ≡ 1 H ≡ 1 Hz.
Ici, ≡ n’est pas utilisé comme une équivalence stricte, mais plutôt pour désigner de façon souple les facteurs de conversion.
Dans le SI, les quasi-exceptions sont le kelvin, la mole, la candela et leurs unités dérivées ; les deux premières se traitent proprement avec la constante de Boltzmann et la constante d’Avogadro.
Personnellement, je n’aime pas que la candela fasse partie du SI.
Mais dans les années 1500, l’Angleterre a changé le mile en 8 furlongs pour simplifier beaucoup les calculs de mesures agricoles de l’époque.
https://en.m.wikipedia.org/wiki/Furlong
Ça ressemble à l’argument selon lequel les unités traditionnelles seraient meilleures parce qu’on ne peut pas diviser 10 par 3 avec seulement des entiers.
On dirait que, si l’on divise un cercle en 360 arcs, l’un de ces arcs aurait une signification à une certaine distance du foyer.
Mais si l’on considère qu’il y a environ 2000 ans, les Grecs ont repris l’usage babylonien de 360, et que les Babyloniens étaient eux-mêmes arrivés à ce nombre en affinant, pendant les 2000 années précédentes, une mesure approximative du nombre de jours dans l’année utilisée en astronomie, le sens du mille marin est moins « réel » que dérivé et contingent.
En plus, si l’on tient compte du fait que la Terre est un sphéroïde aplati, la longueur du mille marin varie selon l’endroit.
J’ai vécu plus de dix ans aux États-Unis, mais je ne me suis toujours pas habitué au système impérial, et je pense que ça ne viendra jamais.
Ça n’a absolument aucun sens.
Le système métrique, c’est de l’or pur : 1 cm = 10 mm, 1 m = 100 cm, 1 km = 1000 m, 1 kg = 1000 g, 1 tonne = 1000 kg.
Le système impérial, lui, fait « attends une seconde » puis sort des trucs du genre 1 in = ???, 1 ft = 12 in, 1 yd = 3 ft, 1 mile = 5280 ft, 1 lb = 16 oz.
Je ne sais pas qui a inventé cette folie.
Du coup, le problème apparaît moins souvent qu’on ne l’imagine.
Même quand une valeur est par hasard indiquée en métrique, on remarque qu’ils ne convertissent pas les unités.
Par exemple, ils écrivent 1000 mL au lieu de 1 L, ou 3500 g au lieu de 3,5 kg.
Un Européen peut dire « c’est à 600 m par ici, et à 1,2 km par là », mais un Américain dira rarement « c’est à 800 yards par ici, et à 1 mile par là ».
Un Européen peut dire « je dois transporter 4 L d’eau, donc mon sac pèse 4 kg de plus ».
Un Américain peut dire « ma bouteille fait 24 onces liquides, donc à peu près 24 onces de poids », mais si c’est un gallon, il dira plutôt que ça pèse environ un gallon.
Au final, le problème des conversions d’unités est moins présent que je ne l’imaginais, parce que les Américains ne passent pas leur temps à convertir des unités à chaque phrase.
Je serais surpris que plus de 50 % de la population sache combien d’onces il y a dans une tasse d’eau, ou combien de pieds il y a dans un mile.
Heureusement, même aux États-Unis, la communauté scientifique utilise le système métrique comme standard.
La chaîne, issue des outils d’arpentage, vaut 22 yards.
Une chaîne vaut aussi 4 rods, donc un rod fait 5½ yards, ce qui est tout de même étrange.
10 chaînes font un furlong, et 8 furlongs font 1 mile.
Au passage, un acre correspond à 1 furlong × 1 chaîne.
Ça a l’air fou, mais il y a quand même une certaine logique interne.
Pourquoi aurait-on besoin de convertir des pouces en miles ?
Dans la vie, on n’a jamais besoin de transformer des pouces, ou des pieds et pouces, en miles.
En menuiserie ou en artisanat, ça peut se justifier par l’origine, mais pour les autres usages ?
Essayez de lire 2 3/16" aussi vite que 5,6 cm sur une règle impériale.
Même les tailles de vis en subissent l’influence.
La distance parcourue par la lumière en 1 nanoseconde est aussi d’environ 1 pied.
Impressionnant :)
Le résultat de
$ units c ft/nsest* 0.98357106.1 kilochrono ferait 55 minutes, et ce serait assez utile dans des situations comme les voyages spatiaux, où l’on ne peut pas dépendre d’une unité liée au jour solaire.
Si la Terre est un sphéroïde aplati, la longueur réelle de l’arc d’un degré de latitude ne varie-t-elle pas ?
Je me demande si « fiable » signifie simplement « suffisamment proche pour être utilisable ».
Ça fait trop longtemps que je travaille sur des sujets sans rapport avec la géographie, j’ai dû oublier des choses que je savais autrefois.
J’ai noté ici, en partie, le cas d’usage qui m’a fait découvrir ce fait : https://twitter.com/mholt6/status/1695685022710477043
Même s’il y a quelques kilomètres d’erreur dans mon cas, il y a de fortes chances que ce ne soit pas près des pôles ; et si c’est le cas, on peut simplement se dire « d’accord, compris, tu es au pôle ».
L’orbite terrestre est similaire.
À l’école, on apprend que c’est une ellipse, mais on ne se fait presque jamais une idée juste de la forme réelle, et la plupart des schémas donnent une impression complètement fausse.
Cela reste toutefois suffisamment proche pour beaucoup d’usages pratiques.
Cet article donne aussi une bonne règle empirique : 111 111 * cos(latitude) m pour un degré de longitude.
J’aime bien cette correction.
En pratique, on peut aussi utiliser des constantes simples : à 25°, c’est environ 100 000 m ; à 44°, environ 80 000 m ; à 57°, environ 60 000 m.