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.
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
, LINESTRING
e 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:
- 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
- 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.
- 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.