Fermer

novembre 2, 2020

Calcul de la distance entre les emplacements avec PHP et MySQL


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 certains 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 .

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 n'est pas à pas une distance égale . À mesure que vous vous rapprochez de l'équateur, les lignes de latitude s'écartent de plus en plus. Si vous utilisez une sorte d'équation de triangulation simple, elle peut mesurer la distance avec précision à un endroit et terriblement mauvaise à l'autre, à cause de la courbure de la Terre.

The Haversine Formula

 Flight Map Europe

La ​​distance utilisant 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 du kilomètre) arrondi à 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 – 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 moins o r égal à.
  • table – c'est le tableau… vous voudrez le remplacer par le nom de votre table.
  • latitude – c'est le champ de votre latitude.
  • longitude – c'est le 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 – c'est 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 votre nom de 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 à travers l'Amérique du Nord et cela a fonctionné à merveille.




Source link