Fermer

mars 2, 2021

Calcul de la distance entre les emplacements avec PHP et MySQL


Temps de lecture: 3 minutes

Ce mois-ci, j'ai beaucoup programmé en PHP et MySQL en ce qui concerne les SIG. En fouinant autour du net, j'ai eu du mal à trouver quelques-uns des calculs géographiques pour trouver la distance entre deux endroits, donc je voulais les partager ici.

La façon simple de calculer une distance entre deux points utilise la formule de Pythagore pour calculer l'hypoténuse d'un triangle (A² + B² = C²). Ceci est connu sous le nom de Distance euclidienne .

 Carte de vol pour l'Europe avec une distance de grand cercle

C'est un début intéressant mais cela ne s'applique pas avec la géographie puisque la distance entre les lignes de latitude et de longitude est de pas une distance égale . Au fur et à mesure que vous vous rapprochez de l'équateur, les lignes de latitude s'éloignent. Si vous utilisez une sorte d'équation de triangulation simple, elle peut mesurer la distance avec précision à un endroit et terriblement fausse dans l'autre, à cause de la courbure de la Terre.

Great Circle Distance

Les itinéraires parcourus sur de longues distances la Terre est connue sous le nom de Distance du Grand Cercle . Autrement dit… la distance la plus courte entre deux points sur une sphère est différente des points sur une carte plane. Combinez cela avec le fait que les lignes de latitude et de longitude ne sont pas équidistantes… et vous avez un calcul difficile.

Voici une vidéo fantastique expliquant le fonctionnement des Grands Cercles.

La formule Haversine

La distance l'utilisation de la courbure de la Terre est incorporée dans la formule de Haversine qui utilise la trigonométrie pour tenir compte de la courbure de la Terre. Lorsque vous trouvez la distance entre 2 endroits sur terre (à vol d'oiseau), une ligne droite est en réalité un arc.

Ceci est applicable en vol aérien – avez-vous déjà regardé la carte réelle des vols et remarqué qu'ils sont voûtés? C'est parce qu'il est plus court de voler dans une arche entre deux points que directement vers l'emplacement.

PHP: Calculer la distance entre 2 points

Quoi qu'il en soit, voici la formule PHP pour calculer la distance entre deux points (avec Mile vs. Conversion de kilomètres) arrondie à deux décimales.

 function getDistanceBetweenPointsNew ($ latitude1, $ longitude1, $ latitude2, $ longitude2, $ unit = 'miles') {
  $ thêta = $ longitude1 - $ longitude2;
  $ distance = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) );
  $ distance = acos ($ distance);
  $ distance = rad2deg ($ distance);
  $ distance = $ distance * 60 * 1,1515;
  commutateur ($ unit) {
    cas 'miles':
      Pause;
    cas 'kilomètres':
      $ distance = $ distance * 1,609344;
  }
  retour (rond ($ distance, 2));
} 

SQL: récupération de tous les enregistrements dans une plage en calculant la distance en miles à l'aide de la latitude et de la longitude

Il est également possible d'utiliser SQL pour effectuer un calcul afin de trouver tous les enregistrements à une distance spécifique. Dans cet exemple, je vais interroger MyTable dans MySQL pour trouver tous les enregistrements qui sont inférieurs ou égaux à la variable $ distance (en Miles) de mon emplacement à $ latitude et $ longitude:

La requête pour récupérer tout des enregistrements à une distance spécifique en calculant la distance en miles entre deux points de latitude et de longitude sont:

 $ query = "SELECT *, (((acos (sin (". $ latitude. "* pi () / 180)) * sin ((` latitude` * pi () / 180)) + cos ((". $ latitude." * pi () / 180)) * cos ((`latitude` * pi () / 180)) * cos (((". $ longitude." - `longitude`) * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515) comme distance FROM` table `WHERE distance <=". $ Distance. "

Vous devrez personnaliser ceci:

  • $ longitude – il s'agit d'une variable PHP où je passe la longitude du point.
  • $ latitude – c'est une variable PHP où je passe la longitude du point.
  • $ distance – c'est la distance à laquelle vous souhaitez trouver tous les enregistrements moins o r égal à.
  • table – c'est la table… vous voudrez la remplacer par le nom de votre table.
  • latitude – c'est le champ de votre latitude.
  • longitude – il s'agit du champ de votre longitude.

SQL: Récupération de tous les enregistrements dans une plage en calculant la distance en kilomètres à l'aide de la latitude et de la longitude

Et voici la requête SQL utilisant les kilomètres dans MySQL:

 $ query = "SELECT *, (((acos (sin ((". $ Latitude. "* Pi () / 180)) * sin ((` latitude` * pi () / 180)) + cos ((". $ Latitude. "* pi () / 180)) * cos ((` latitude` * pi () / 180)) * cos ((". $ longitude." - `longitude`) * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) comme distance FROM `table` WHERE distance <=". $ Distance. "

Vous devrez personnaliser ceci:

  • $ longitude – c'est une variable PHP où je passe la longitude du point.
  • $ latitude – il s'agit d'une variable PHP où je passe la longitude du point.
  • $ distance – c'est la distance à laquelle vous souhaitez trouver tous les enregistrements inférieurs ou égaux à.
  • table – c'est la table… vous voudrez la remplacer par le nom de votre table.
  • latitude – c'est le champ de votre latitude.
  • longitude – c'est le champ de votre longitude.

J'ai utilisé ce code dans une plate-forme de cartographie d'entreprise que nous avons utilisée pour un magasin de détail avec plus de 1 000 emplacements en Amérique du Nord et cela a fonctionné à merveille.




Source link