3 points par GN⁺ 2023-08-28 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2023-08-28
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.

    • La seconde est une unité plus ancienne que la redéfinition du mètre, et comme elle vient d’un découpage « élégant » de la journée, il semble rester malgré tout une part de hasard.
      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
    • On peut représenter une latitude ou une longitude avec une précision d’environ 1 cm à l’aide d’un seul entier 32 bits :D
    • Le mètre est en fait aussi assez proche de 3 pieds de Paris, soit environ 0,97 m.
      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 ».
    • Je me dis que ce serait bien si le système de coordonnées GPS était simplement en kilomètres.
      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.
    • La France a aussi appliqué la décimalisation aux angles ; en pratique, 1 gon = 100 km et 1 km n’est qu’un centigon.
  • 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 raison pour laquelle un mile vaut 5280 ft est qu’il correspond à 80 chaînes.
      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
    • La plupart des autres « miles » dérivent du mile romain et se sont développés assez indépendamment des unités anglaises comme le pied, le yard, le pouce ou le barleycorn, d’où des facteurs de conversion bizarres.
      À 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.
    • Fait intéressant, le mile était à l’origine un 5000 ft moins étrange.
      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
    • J’aurais aimé que les gens du Moyen Âge définissent le mile comme 5040 ft ; il aurait alors été divisible par 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 48, 56, 60, 63, 70, 72, 80, 84, 90, 105, 112, 120, 126, 140, 144, 168, 180, 210, 240, 252, 280, 315, 336, 360, 420, 504, 560, 630, 720, 840, 1008, 1260, 1680, 2520.
    • Je me demande ce que signifie vrai dans « le mille marin a un vrai sens ».
      Ç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.

    • Ce que j’ai compris en vivant aux États-Unis, c’est que la plupart des Américains ne convertissent pas entre unités sauf s’ils y sont vraiment obligés.
      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 pense qu’il y a pas mal de gens qui ont grandi aux États-Unis sans vraiment comprendre entièrement ce système.
      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.
    • Tu as sauté quelques unités intermédiaires, et les connaître aide un peu à comprendre.
      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.
    • En quoi faudrait-il convertir des pouces, au juste ?
      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.
    • Les conversions d’unités sont pénibles, mais le pire, à mon avis, c’est la notation des longueurs en fractions.
      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.

    • C’est étonnamment proche de la réalité.
      Impressionnant :)
      Le résultat de $ units c ft/ns est * 0.98357106.
    • La distance parcourue par le son en 1 milliseconde est aussi d’environ 1 pied.
    • Ce serait intéressant de changer l’unité de temps et de définir 1 chrono comme le temps nécessaire à la lumière pour parcourir 1e9 m.
      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.
    • Le nombre de secondes dans une année est aussi suffisamment proche de π*10^7.
    • 1 googol femtobarn correspond aussi à peu près à 1 square teraparsec.
  • 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.

    • Fiable signifie effectivement suffisamment proche pour être utilisable, et l’estimation est même assez précise dans les zones fortement peuplées.
      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 ».
    • Le diamètre équatorial de la Terre est 43 km plus grand que son diamètre polaire.
      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.
    • Rien qu’en lisant le titre de l’article, on pourrait penser que la variation de longueur d’un degré de latitude est inférieure à un décimètre, mais ce n’est évidemment pas le cas.
      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.