Analisi e testCRM e piattaforme datiStrumenti di marketing

Calcola o interroga la distanza del cerchio massimo tra i punti di latitudine e longitudine utilizzando la formula Haversine (esempi PHP, JavaScript, Java, Python, MySQL, MSSQL)

Questo mese ho programmato in PHP e MySQL per GIS. Durante la ricerca sull'argomento, ho avuto difficoltà a trovare calcoli geografici per trovare la distanza tra due luoghi, quindi volevo condividerli qui.

Mappa di volo in Europa con grande distanza del cerchio

Il modo più semplice per calcolare una distanza tra due punti è utilizzare la formula pitagorica per calcolare l'ipotenusa di un triangolo (A² + B² = C²). Questo è noto come Distanza euclidea.

È un inizio interessante, ma non si applica alla geografia poiché lo è la distanza tra le linee di latitudine e longitudine distanze non uguali tra loro. Man mano che ci si avvicina all'equatore, le linee di latitudine si allontanano. Se si utilizza una semplice equazione di triangolazione, la misurazione della distanza potrebbe essere accurata in un punto e errata nell'altro a causa della curvatura della Terra.

Grande distanza dal cerchio

Le rotte percorse per lunghe distanze intorno alla Terra sono conosciute come la Grande Distanza Circolare. Cioè... la distanza più breve tra due punti su una sfera differisce dai punti su una mappa piatta. Combina questo con il fatto che le linee di latitudine e longitudine non sono equidistanti... e hai un calcolo difficile.

Ecco un fantastico video che spiega come funzionano le Great Circles.

La formula Haversine

La distanza che utilizza la curvatura della Terra è incorporata nella formula di Haversine, che utilizza la trigonometria per tenere conto della curvatura della Terra. Quando trovi la distanza tra 2 luoghi sulla Terra (in linea d'aria), una linea retta è in realtà un arco.

Questo è applicabile nel volo aereo: hai mai guardato la mappa dei voli e hai notato che sono arcuati? Questo perché volare in un arco tra due punti è più breve che direttamente verso la posizione.

PHP: calcola la distanza tra 2 punti di latitudine e longitudine

Ecco la formula PHP per calcolare la distanza tra due punti (insieme alla conversione Miglio vs. Chilometro) arrotondata a due cifre decimali.

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)); 
}

Le variabili sono:

  • $Latitudine1 – una variabile per la latitudine della tua prima posizione.
  • $ Longitudine1 – una variabile per la longitudine della tua prima posizione
  • $Latitudine2 – una variabile per la latitudine della tua seconda posizione.
  • $ Longitudine2 – una variabile per la longitudine della tua seconda posizione.
  • $ unità – l'essere predefinito miglia. Questo può essere aggiornato o passato come chilometri.

Java: calcola la distanza tra 2 punti di latitudine e longitudine

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;
    }
}

Le variabili sono:

  • latitudine1 – una variabile per la latitudine della tua prima posizione.
  • longitudine1 – una variabile per la longitudine della tua prima posizione
  • latitudine2 – una variabile per la latitudine della tua seconda posizione.
  • longitudine2 – una variabile per la longitudine della tua seconda posizione.
  • unità – l'essere predefinito miglia. Questo può essere aggiornato o passato come chilometri.

JavaScript: calcola la distanza tra 2 punti di latitudine e longitudine

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);
    }
}

Le variabili sono:

  • latitudine1 – una variabile per la latitudine della tua prima posizione.
  • longitudine1 – una variabile per la longitudine della tua prima posizione
  • latitudine2 – una variabile per la latitudine della tua seconda posizione.
  • longitudine2 – una variabile per la longitudine della tua seconda posizione.
  • unità – l'essere predefinito miglia. Questo può essere aggiornato o passato come chilometri.

Python: calcola la distanza tra 2 punti di latitudine e longitudine

Ecco la formula Python per calcolare la distanza tra due punti (insieme alla conversione miglia/chilometri) arrotondata a due cifre decimali. Ringraziamo mio figlio, Bill Karr, un data scientist per ApriINSIGHTS, per il codice.

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)

Le variabili sono:

  • latitudine1 – una variabile per la tua prima posizione latitudine.
  • longitudine1 – una variabile per la tua prima posizione longitudine
  • latitudine2 – una variabile per la tua seconda posizione latitudine.
  • longitudine2 – una variabile per la tua seconda posizione longitudine.
  • unità – l'essere predefinito miglia. Questo può essere aggiornato o passato come chilometri.

MySQL: recupero di tutti i record all'interno di un intervallo calcolando la distanza in miglia utilizzando latitudine e longitudine

L'uso dei tipi di dati spaziali in MySQL è un modo più efficiente e conveniente per lavorare con i dati geografici, incluso il calcolo delle distanze tra i punti. MySQL supporta tipi di dati spaziali come POINT, LINESTRINGe POLYGON, insieme a funzioni spaziali come ST_Distance.

Quando si utilizza il ST_Distance funzione in MySQL con dati geografici rappresentati come POINT coordinate, tiene conto della curvatura della superficie terrestre. Il modello sferico utilizzato da ST_Distance utilizza la formula di Haversine. Questa approssimazione è adatta alla maggior parte degli scopi pratici ma può introdurre lievi imprecisioni per distanze molto lunghe.

Ecco come calcolare le distanze tra due punti utilizzando i tipi di dati spaziali:

  1. Crea una tabella con tipo di dati spaziale: Innanzitutto, crea una tabella con a POINT colonna per memorizzare punti geografici. Per esempio:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Inserisci i tuoi punti geografici in questa tabella utilizzando il POINT costruttore:

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. Calcola la distanza utilizzando ST_Distance: È possibile calcolare la distanza tra due punti utilizzando ST_Distance funzione. Ecco una query di esempio per calcolare la distanza tra due punti:
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;

sostituire 1 ed 2 con gli ID dei due punti di cui vuoi calcolare la distanza.

  1. Risultato: La query restituirà la distanza tra i due punti in miglia.

Utilizzo dei tipi di dati spaziali e di ST_Distance La funzione fornisce un modo più efficiente e accurato per lavorare con i dati geografici in MySQL. Semplifica inoltre il calcolo delle distanze tra i punti, semplificando la gestione e l'interrogazione dei dati.

MySQL: recupero di tutti i record all'interno di un intervallo calcolando la distanza in chilometri utilizzando latitudine e longitudine

Di default ST_Distance restituisce la distanza in metri, quindi è sufficiente aggiornare la query in chilometri:

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;

Distanza geografica di Microsoft SQL Server: STDistance

Se stai utilizzando Microsoft SQL Server, offrono la propria funzione, STDistanza per calcolare la distanza tra due punti utilizzando il tipo di dati Geografia.

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);  

Un saluto affettuoso a Manash Sahoo, fondatore e architetto senior di Ione Tre.

Douglas Karr

Douglas Karr è CMO di ApriINSIGHTS e il fondatore della Martech Zone. Douglas ha aiutato dozzine di startup MarTech di successo, ha assistito nella due diligence di oltre 5 miliardi di dollari in acquisizioni e investimenti Martech e continua ad assistere le aziende nell'implementazione e nell'automazione delle loro strategie di vendita e marketing. Douglas è un esperto e relatore di trasformazione digitale e MarTech riconosciuto a livello internazionale. Douglas è anche autore di una guida per manichini e di un libro sulla leadership aziendale.

Articoli Correlati

Torna a pulsante in alto
Chiudi

Blocco annunci rilevato

Martech Zone è in grado di fornirti questi contenuti gratuitamente perché monetizziamo il nostro sito attraverso entrate pubblicitarie, link di affiliazione e sponsorizzazioni. Ti saremmo grati se rimuovessi il blocco degli annunci mentre visiti il ​​nostro sito.