Analyses et testsCRM et plateformes de donnéesOutils marketing

Calculer ou interroger la distance orthodromique entre les points de latitude et de longitude à l'aide de la formule Haversine (exemples PHP, JavaScript, Java, Python, MySQL, MSSQL)

Ce mois-ci, j'ai programmé en PHP et MySQL pour les SIG. En recherchant le sujet, j'ai eu du mal à trouver calculs géographiques pour trouver la distance entre deux endroits, je voulais donc les partager ici.

Carte de vol Europe avec grande distance de cercle

La manière 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 le Distance euclidienne.

C'est un début intéressant, mais cela ne s'applique pas à la géographie puisque les distances entre les lignes de latitude et de longitude sont pas de distances égales. À mesure que l’on se rapproche de l’équateur, les lignes de latitude s’éloignent. Si vous utilisez une simple équation de triangulation, elle peut mesurer la distance avec précision à un endroit et mal à l'autre en raison de la courbure de la Terre.

Distance du grand cercle

Les routes parcourues sur de longues distances autour de la Terre sont connues sous le nom de distance orthodromique. Autrement dit… la distance la plus courte entre deux points sur une sphère diffère 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 des Grands Cercles.

La formule Haversine

La distance utilisant la courbure de la Terre est incorporée dans la formule 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 fait 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 que voler dans une arche entre deux points est plus court que directement vers l'emplacement.

PHP: Calculez 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; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($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 étant miles. Cela peut être mis à jour ou transmis comme kilomètres.

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

public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
    double theta = longitude1 - longitude2;
    double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit.equals("miles")) {
        return Math.round(distance, 2);
    } else if (unit.equals("kilometers")) {
        return Math.round(distance * 1.609344, 2);
    } else {
        return 0;
    }
}

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 étant miles. Cela peut être mis à jour ou transmis comme kilomètres.

JavaScript : calculer la distance entre 2 points de latitude et de longitude

function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
    let theta = longitude1 - longitude2;
    let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit == 'miles') {
        return Math.round(distance, 2);
    } else if (unit == 'kilometers') {
        return Math.round(distance * 1.609344, 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 étant miles. Cela peut être mis à jour ou transmis comme kilomètres.

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

Voici la formule Python pour calculer la distance entre deux points (avec la conversion Mile/Kilomètre) arrondie à deux décimales. Merci à mon fils, Bill Karr, Data Scientist pour OuvrirINSIGHTS, pour le code.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * 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(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

Les variables sont :

  • latitude1 – une variable pour votre premier emplacement latitude.
  • longitude1 – une variable pour votre premier emplacement longitude
  • latitude2 – une variable pour votre deuxième emplacement latitude.
  • longitude2 – une variable pour votre deuxième emplacement longitude.
  • unité – la valeur par défaut étant miles. Cela peut être mis à jour ou transmis comme kilomè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

L'utilisation des types de données spatiales dans MySQL est un moyen plus efficace et plus pratique de travailler avec des données géographiques, notamment pour calculer les distances entre les points. MySQL prend en charge les types de données spatiales tels que POINT, LINESTRINGet POLYGON, ainsi que des fonctions spatiales comme ST_Distance.

Lorsque vous utilisez le ST_Distance fonction dans MySQL avec des données géographiques représentées comme POINT coordonnées, il prend en compte la courbure de la surface terrestre. Le modèle sphérique utilisé par ST_Distance utilise la formule Haversine. Cette approximation convient à la plupart des objectifs pratiques mais peut introduire de légères imprécisions sur de très longues distances.

Voici comment calculer les distances entre deux points à l’aide des types de données spatiales :

  1. Créer une table avec un type de données spatiales: Commencez par créer un tableau avec un POINT colonne pour stocker des points géographiques. Par exemple:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Insérez vos points géographiques dans ce tableau à l'aide du POINT constructeur:

INSERT INTO locations (name, coordinates)
VALUES
    ('Point A', POINT(40.7128, -74.0060)), -- New York City
    ('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
  1. Calculer la distance à l'aide de ST_Distance: Vous pouvez calculer la distance entre deux points à l'aide de la ST_Distance fonction. Voici un exemple de requête pour calculer la distance entre deux points :
SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

remplacer 1 et 2 avec les identifiants des deux points dont vous souhaitez calculer la distance entre.

  1. Résultat: La requête renverra la distance entre les deux points en miles.

Utilisation des types de données spatiales et du ST_Distance La fonction fournit un moyen plus efficace et plus précis de travailler avec des données géographiques dans MySQL. Il simplifie également le calcul des distances entre les points, facilitant ainsi la gestion et l'interrogation de vos données.

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

Par défaut ST_Distance renvoie la distance en mètres, il vous suffit donc de mettre à jour la requête en kilomètres :

SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

Distance géographique de Microsoft SQL Server : STDistance

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

DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  
SELECT @g.STDistance(@h);  

Chapeau à Manash Sahoo, fondateur et architecte principal de Ion Trois.

Douglas Karr

Douglas Karr est le directeur marketing de OuvrirINSIGHTS et le fondateur de la Martech Zone. Douglas a aidé des dizaines de startups MarTech à succès, a contribué à la due diligence de plus de 5 milliards de dollars d'acquisitions et d'investissements MarTech, et continue d'aider les entreprises à mettre en œuvre et à automatiser leurs stratégies de vente et de marketing. Douglas est un expert et conférencier de renommée internationale en matière de transformation numérique et de MarTech. Douglas est également l'auteur d'un guide pour les nuls et d'un livre sur le leadership d'entreprise.

Articles Relatifs

Retour à bouton en haut
Fermer

Adblock détecté

Martech Zone est en mesure de vous fournir ce contenu gratuitement car nous monétisons notre site grâce aux revenus publicitaires, aux liens d'affiliation et aux parrainages. Nous vous serions reconnaissants de supprimer votre bloqueur de publicités lorsque vous consultez notre site.