Analisi e testPiattaforme dati clientiStrumenti 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 PHP e MySQL da GIS. Durante la ricerca sull'argomento, ho avuto difficoltà a trovare calcoli geografici per trovare la distanza tra due luoghi, quindi volevo condividerli qui.

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.

1 Man mano che ci si avvicina all'equatore, le linee di latitudine si allontanano. Se si utilizza una semplice equazione di triangolazione, la distanza potrebbe essere misurata in modo accurato in un punto e in modo errato in un altro a causa della curvatura terrestre.

Immagine

Grande distanza dal cerchio

Le rotte percorse lungo lunghe distanze attorno alla Terra sono note come Distanza Ortodromica. Ovvero... la distanza più breve tra due punti su una sfera è diversa da quella su una mappa piana. Se a questo si aggiunge il fatto che latitudine e longitudine non sono equidistanti... si ottiene 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. Una linea retta è un arco quando trovi la distanza tra 2 luoghi sulla Terra (in linea d'aria).

Questo è applicabile ai viaggi aerei. Hai mai guardato la mappa reale dei voli e notato che sono arcuati? Questo perché volare in un arco tra due punti è più breve che volare 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, considera la curvatura della superficie terrestre. Il modello sferico utilizzato da ST_Distance impiega la formula Haversine. Questa approssimazione è adatta alla maggior parte degli scopi pratici ma può introdurre lievi imprecisioni per lunghe distanze.

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 e 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 utilizzi Microsoft SQL Server, offrono una funzione chiamata 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 È un Chief Marketing Officer frazionario specializzato in aziende SaaS e AI, dove contribuisce a scalare le operazioni di marketing, guidare la generazione della domanda e implementare strategie basate sull'AI. È fondatore ed editore di Martech Zone, una pubblicazione leader in… Di Più "
Torna a pulsante in alto
Chiudi

Blocco annunci rilevato

Facciamo affidamento su pubblicità e sponsorizzazioni per mantenere Martech Zone Gratuito. Valuta la possibilità di disattivare il tuo AdBlocker o di sostenerci con un abbonamento annuale conveniente e senza pubblicità (10 $ USA):

Iscriviti per un abbonamento annuale