Forum Programmation.web [Résolu] Calculs sur des coordonnées géographiques

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
0
8
avr.
2022

Bonjour!

Pour un de mes projets je dois effectuer des additions et soustractions sur des coordonnées géographiques. Le problème est quand on dépasse une des limites des longitudes (-180:180). Je pourrais gérer ces cas avec des if/else mais il y a peut être un meilleur moyen en JavaScript? J'utilise la bibliothèque leafletjs, si ça peut être utile.

Exemple: je voudrais que la longitude 170+20 ne donne pas 190 mais -170.

  • # Bibliothèques spécialisées

    Posté par  (site web personnel) . Évalué à 3. Dernière modification le 08 avril 2022 à 10:30.

    Il existe des bibliothèques pour faire ce genre de calcul (notamment le calcul de distance) : https://www.sitepoint.com/javascript-geospatial-advanced-maps/

    • [^] # Re: Bibliothèques spécialisées

      Posté par  (site web personnel) . Évalué à 5.

      C'est un peu overkill d'installer une bibliothèque juste pour ça… J'ai vu que je ne suis pas le seul à me poser la question, et que ma solution n'est pas si mauvaise. Je vais me faire une fonction contenant ça:

      while(lng < -180){
        lng +=360;
      }
      while (lng > 180){
        lng -= 360;
      }
      

      Un LUG en Lorraine : https://enunclic-cappel.fr

      • [^] # Re: Bibliothèques spécialisées

        Posté par  . Évalué à 7. Dernière modification le 08 avril 2022 à 13:07.

        et un calcul de ce genre ?
        (170+20) + 180)%360 - 180

        en gros on décale l'acceptable vers 0 à 360 ( +180),
        on fait le modulo %360
        on recale sur -180;180

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: Bibliothèques spécialisées

          Posté par  (site web personnel) . Évalué à 2.

          Pas mal, mais pour -170-20 ça me donne -190 au lieu de 170 ;)
          On pourrait rectifier ça en ajoutant encore une fois 360:

          (170+20) + 180 + 360)%360 - 180
          

          et là ça marche, sauf si on en vient à utiliser des nombres négatifs encore plus petits… Je ne suis pas certain que ça ne puisse pas arriver, il faudrait alors ajouter un certain nombre de fois 360 pour être tranquille.

          En fait mon but c'est de récupérer les coordonnées des coins d'une carte leaflet ("Bounds") et d'élargir ces coordonnées. En dézoomant sur la carte, la carte se répète et on sort des limites (-180:180). Exemple en dézoomant:

          mymap.getBounds();
          {
            "_southWest": {
              "lat": -88.80731006008952,
              "lng": -537.1875000000001
            },
            "_northEast": {
              "lat": 89.91982624234947,
              "lng": 450.00000000000006
            }
          }
          

          Donc c'est pas parfait. D'ailleurs je me rends compte que ces coordonnées me posent d'autres problèmes pour disposer des marqueurs sur la carte…

          Un LUG en Lorraine : https://enunclic-cappel.fr

          • [^] # Re: Bibliothèques spécialisées

            Posté par  . Évalué à 6.

            dans ce cas il faut d'abord faire un %360 + 360 pour s'assurer du coté positif :)

            echo $(( (( (-170 -20) % 360)+360 + 180)%360 -180))

            par contre t'a intérêt a ajouter un bon vieux commentaire pour expliquer ;)

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

            • [^] # Re: Bibliothèques spécialisées

              Posté par  (site web personnel) . Évalué à 2.

              hahahaha xD
              Merci pour la solution, c'est ce qu'il me fallait!

              Un LUG en Lorraine : https://enunclic-cappel.fr

            • [^] # Re: Bibliothèques spécialisées

              Posté par  (Mastodon) . Évalué à 5. Dernière modification le 08 avril 2022 à 18:29.

              par contre t'a intérêt a ajouter un bon vieux commentaire pour expliquer ;)

              c'est peut-être la raison qui me ferait préférer les while() proposé plus haut dans le journal : je ne suis pas certain que ce soit moins efficace (voire je serais d'avis qu'il y a moins de calculs) et c'est bcp plus simple à comprendre.

              En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # utiliser un modulo

    Posté par  . Évalué à 5. Dernière modification le 08 avril 2022 à 13:08.

    Le plus simple est d'utiliser l'opérateur modulo:

    lng += 180;    // pour passer sur la plage 0-359
    lng += x;
    lng = lng%360; // pour forcer la plage 0-359
    lng -= 180;    // pour revenir dans la plage -180 - +179

    Dans ce cas, quelque soit la valeur de x (même en dehors de +-180), le résultat devrait être juste.

    Edit: grillé par Fearan

    Les vrais naviguent en -42

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.