Fermer

avril 1, 2022

Calcul de la distance entre 2 emplacements de latitude et de longitude (PHP, Python, MySQL)


Ce mois-ci, j'ai pas mal programmé en PHP et MySQL en ce qui concerne les SIG. En fouinant sur le net, j'ai eu du mal à trouver certains desCalculs géographiquespour trouver la distance entre deux endroits donc je voulais les partager ici.

Carte de vol Europe avec distance orthodromique

La façon simple de calculer une distance entre deux points consiste à utiliser la formule de Pythagore pour calculer l'hypoténuse d'un triangle (A² + B² = C²). Ceci est connu comme leDistance euclidienne.

C'est un début intéressant mais cela ne s'applique pas à la géographie puisque la distance entre les lignes de latitude et de longitude estpas des distances égales une part. À 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 erronée à l'autre, à cause de la courbure de la Terre.

Distance orthodromique

Les routes parcourues sur de longues distances autour de la Terre sont connues sous le nom deDistance orthodromique . Autrement dit… la distance la plus courte entre deux points sur une sphère est différente des points sur une carte plate. 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 fantastique explication vidéo du fonctionnement de Great Circles.

La formule Haversine

La distance utilisant la courbure de la Terre est incorporée dans laFormule 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 vraiment 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 arqué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 de latitude et de longitude

Voici la formule PHP pour calculer la distance entre deux points (avec la conversion Mile vs Kilomètre) arrondie à deux décimales.

 function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') { $theta = $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 ;  switch($unit) { case 'miles': break;  cas 'kilomètres' : $distance = $distance * 1,609344 ;  } retour (rond($distance,2));  }

Les variables sont :

  • $Latitude1– une variable pour la latitude de votre premier emplacement.
  • $Longitude1– une variable pour la longitude de votre premier emplacement
  • $Latitude2– une variable pour la latitude de votre deuxième emplacement.
  • $Longitude2– une variable pour la longitude de votre deuxième emplacement.
  • $unité– la valeur par défaut étantmilles . Cela peut être mis à jour ou transmis commekilomètres.

Python : Calculer la distance entre 2 points de latitude et de longitude

Quoi qu'il en soit, voici la formule Python pour calculer la distance entre deux points (avec la conversion Mile vs Kilomètre) arrondie à deux décimales. Merci à mon fils, Bill Karr qui est Data Scientist pourOuvrirINSIGHTSpour le code.

from numpy import sin, cos, arccos, pi, round def rad2deg(radians): degrés = radians * 180 / pi return degrés def deg2rad(degrees): radians = degrés * pi / 180 return radians def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2 , longitude2, unit = 'miles'): theta = longitude1 - longitude2 distance = 60 * 1.1515 * rad2deg( arccos( (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + (cos(deg2rad(latitude1) ) * cos(deg2rad(latitude2)) * cos(deg2rad(thêta))) ) ) if unit == 'miles': return round(distance, 2) if unit == 'kilomètres': return round(distance * 1.609344, 2)

Les variables sont :

  • latitude1– une variable pour votre premier emplacementlatitude.
  • longitude1– une variable pour votre premier emplacementlongitude
  • latitude2– une variable pour votre deuxième emplacementlatitude.
  • longitude2– une variable pour votre deuxième emplacementlongitude.
  • unité– la valeur par défaut étantmilles . Cela peut être mis à jour ou transmis commekilomètres.

MySQL : 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) à mon emplacement à $latitude et $longitude :

La requête pour récupérer tous les enregistrements d'undistanceen calculant la distance en milles 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– 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– il s'agit de 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.

MySQL : 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 des 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– il s'agit de 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.

Distance géographique de Microsoft SQL Server : STDistance

Si vous utilisez Microsoft SQL Server, ils offrent leur propre fonction,STDistancepour calculer la distance entre deux points à l'aide du type de données Géographie.

 DÉCLARER @g géographie ;  DÉCLARER @h géographie ;  SET @g = géographie::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  SET @h = géographie::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  SELECT @g.STDistance(@h);

Coup de chapeau à Manash Sahoo, vice-président et architecte deHighbridge.




Source link