
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 un bel po' PHP e MySQL rispetto a GIS. Curiosando in rete, in realtà ho avuto difficoltà a trovare alcuni dei Calcoli geografici per trovare la distanza tra due posizioni, quindi ho voluto condividerle 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.
Questo è un inizio interessante ma non si applica alla geografia poiché la distanza tra le linee di latitudine e longitudine non è uguale. Man mano che ti avvicini all'equatore, le linee di latitudine si allontanano ulteriormente. Se usi una semplice equazione di triangolazione, potrebbe misurare la distanza con precisione in una posizione e sbagliata nell'altra, 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 utilizzando la curvatura della Terra è incorporata nella formula Haversine, che utilizza la trigonometria per tenere conto della curvatura della Terra. Quando trovi la distanza tra 2 punti 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
Ad ogni modo, ecco la formula Python per calcolare la distanza tra due punti (insieme alla conversione Mile vs. Kilometer) arrotondata a due cifre decimali. Ringraziamo mio figlio, Bill Karr, per il quale è un Data Scientist 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
È anche possibile utilizzare SQL per calcolare tutti i record entro una distanza specifica. In questo esempio, interrogherò MyTable in MySQL per trovare tutti i record che sono inferiori o uguali alla variabile $distanza (in miglia) dalla mia posizione a $latitudine e $longitudine:
La query per il recupero di tutti i record all'interno di uno specifico distanza calcolando la distanza in miglia tra due punti di latitudine e longitudine sono:
$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) as distance FROM `table` WHERE distance <= ".$distance."
Dovrai personalizzare questo:
- $ longitudine - questa è una variabile PHP in cui sto passando la longitudine del punto.
- $ latitudine - questa è una variabile PHP in cui sto passando la longitudine del punto.
- $ distanza - questa è la distanza a cui vorresti trovare tutti i record minore o uguale.
- tavolo - questa è la tabella ... ti consigliamo di sostituirla con il nome della tua tabella.
- latitudine - questo è il campo della tua latitudine.
- longitudine - questo è il campo della tua longitudine.
MySQL: recupero di tutti i record all'interno di un intervallo calcolando la distanza in chilometri utilizzando latitudine e longitudine
Ed ecco la query SQL che utilizza i chilometri in 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) as distance FROM `table` WHERE distance <= ".$distance."
Dovrai personalizzare questo:
- $ longitudine - questa è una variabile PHP in cui sto passando la longitudine del punto.
- $ latitudine - questa è una variabile PHP in cui sto passando la longitudine del punto.
- $ distanza - questa è la distanza a cui vorresti trovare tutti i record minore o uguale.
- tavolo - questa è la tabella ... ti consigliamo di sostituirla con il nome della tua tabella.
- latitudine - questo è il campo della tua latitudine.
- longitudine - questo è il campo della tua longitudine.
Ho utilizzato questo codice in una piattaforma di mappatura aziendale che abbiamo utilizzato per un negozio al dettaglio con oltre 1,000 sedi in tutto il Nord America e ha funzionato magnificamente.
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);
Punta di cappello a Manash Sahoo, vicepresidente e architetto di Highbridge.
Grazie mille per la condivisione. Questo è stato un semplice lavoro di copia e incolla e funziona alla grande. Mi hai risparmiato un sacco di tempo.
Cordiali saluti per chiunque effettui il porting su C:
double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }
Posto molto bello - ha funzionato molto bene - ho dovuto solo cambiare il nome del tavolo che reggeva il lat-long. Funziona abbastanza velocemente per .. Ho un numero ragionevolmente piccolo di lat-long (< 400) ma penso che si ridimensionerebbe bene. Bel sito anche: l'ho appena aggiunto al mio account del.icio.us e lo controllerò regolarmente.
Grazie mille Peter e Kerry! Se ti piace lavorare su progetti GIS, ti consiglio:
Grazie mille… 😀
Ho cercato l'intera giornata per i calcoli della distanza e ho trovato l'algoritmo di harversine, grazie a te per aver fornito l'esempio su come inserirlo in un'istruzione sql. Grazie e saluti, Daniele
Felice di aiutarti, amico di rotaie!
Ora sono alla ricerca di una funzione PHP "in Polygon" che prenda una matrice di coordinate di latitudine e longitudine in sequenza e capisca se un altro punto si trova all'interno o all'esterno del poligono.
Ho trovato il equazione per capire se un punto in un poligono!
penso che il tuo SQL abbia bisogno di un'istruzione have.
invece di WHERE distanza <= $distanza potrebbe essere necessario
usa HAVING distanza <= $distanza
altrimenti grazie per avermi fatto risparmiare un sacco di tempo ed energia.
Ciao David,
Se stai facendo qualsiasi tipo di istruzione GROUP BY, avrai bisogno di HAVING. Non lo sto facendo nell'esempio sopra.
Doug
A partire da MySQL 5.x, non è possibile utilizzare un alias su una clausola WHERE, vedere http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Usa HAVING invece di WHERE nelle query precedenti
Grazie mille. Hai fatto un ottimo lavoro Questa è la cosa che voglio davvero. Molte grazie.
Grazie mille per aver condiviso questo codice. Mi ha fatto risparmiare un sacco di tempo di sviluppo. Inoltre, grazie ai tuoi lettori per aver sottolineato che un'istruzione HAVING è necessaria per MySQL 5.x. Molto utile.
Sono fortunato ad avere lettori molto più intelligenti di me!
🙂
La formula di cui sopra mi fa risparmiare un sacco di tempo. Grazie mille.
Devo anche passare dal formato NMEA ai gradi. Ho trovato una formula a questo URL in fondo alla pagina. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Qualcuno sa come verificarlo?
.
tormentare
Ciao,
Un'altra domanda. Esiste una formula per le stringhe NMEA come quella qui sotto?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Grazie,
tormentare
Ho anche scoperto che WHERE non ha funzionato per me. Cambiato in HAVING e tutto funziona perfettamente. All'inizio non ho letto i commenti e li ho riscritti usando una selezione annidata. Entrambi funzioneranno bene.
Grazie mille per lo script scritto in mysql, ho dovuto solo apportare alcune piccole modifiche (AVVISO) 🙂
Ottimo lavoro
Incredibilmente utile, grazie mille! Stavo avendo dei problemi con il nuovo "HAVING", piuttosto che "WHERE", ma una volta che ho letto i commenti qui (dopo circa mezz'ora di digrignare i denti per la frustrazione =P), ho funzionato bene. Grazie ^_^
grazie mille funziona benissimo
Tieni presente che un'istruzione selezionata come quella sarà molto intensa dal punto di vista computazionale e quindi lenta. Se hai molte di queste domande, può impantanare le cose abbastanza rapidamente.
Un approccio molto meno intenso consiste nell'eseguire una prima selezione (grezza) utilizzando un'area QUADRATA definita da una distanza calcolata, ad esempio "seleziona * dal nome della tabella dove latitudine tra lat1 e lat2 e longitudine tra lon1 e lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, simile a lon. latdiff ~= distanza / 111 (per km), o distanza/69 per miglia poiché 1 grado di latitudine è ~ 111 km (leggera variazione poiché la terra è leggermente ovale, ma sufficiente per questo scopo). londiff = distanza / (abs(cos(deg2rad(latitude))*111)) — o 69 per miglia (puoi effettivamente prendere un quadrato leggermente più grande per tenere conto delle variazioni). Quindi prendi il risultato e inseriscilo nella selezione radiale. Non dimenticare di tenere conto delle coordinate fuori limite, ad esempio l'intervallo di longitudine accettabile è compreso tra -180 e +180 e l'intervallo di latitudine accettabile è compreso tra -90 e +90 - nel caso in cui il tuo latdiff o londiff si trovi al di fuori di questo intervallo . Si noti che nella maggior parte dei casi ciò potrebbe non essere applicabile poiché influisce solo sui calcoli su una linea attraverso l'Oceano Pacifico da un polo all'altro, sebbene intersechi parte del chukotka e parte dell'alaska.
Ciò che otteniamo in questo modo è una significativa riduzione del numero di punti rispetto ai quali si effettua questo calcolo. Se si dispone di un milione di punti globali nel database distribuiti in modo pressoché uniforme e si desidera effettuare una ricerca entro 100 km, la prima ricerca (veloce) è di un'area di 10000 kmq e probabilmente produrrà circa 20 risultati (basati su una distribuzione uniforme su un superficie di circa 500 milioni di kmq), il che significa che si esegue il complesso calcolo della distanza 20 volte per questa query anziché un milione di volte.
Piccolo errore nell'esempio... che sarebbe entro 50 km (non 100) poiché stiamo guardando il "raggio" del nostro... quadrato.
Consiglio fantastico! In realtà ho lavorato con uno sviluppatore che ha scritto una funzione che tirava il quadrato interno e quindi una funzione ricorsiva che creava "quadrati" attorno al perimetro per includere ed escludere i punti rimanenti. Il risultato è stato un risultato incredibilmente veloce: poteva valutare milioni di punti in microsecondi.
Il mio approccio sopra è decisamente "grezzo" ma capace. Grazie ancora!
Douglas,
Ho provato a usare mysql e php per valutare se un punto lat long si trova all'interno di un poligono. Sai se il tuo amico sviluppatore ha pubblicato degli esempi su come portare a termine questo compito. Oppure conosci qualche buon esempio. Grazie in anticipo.
Ciao a tutti questa è la mia istruzione SQL di prova:
SELECT DISTINCT area_id, (
(
(
acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
`lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
`lat_dec` * pi( ) /180 )
) * cos( (
( 51.02 - `lon_dec` ) * pi( ) /180 )
)
)
) *180 / pi( )
) *60 * 1.1515 * 1.609344
) AS distance
FROM `post_codes` WHERE distance <= 50
e Mysql mi sta dicendo quella distanza, non esiste come colonna, posso usare order by, posso farlo senza WHERE, e funziona, ma non con esso...
Sostituire “Distanza DOVE” con “Distanza AVERE”.
Funziona come un incantesimo, grazie Douglas!
Questo è fantastico, tuttavia è proprio come volano gli uccelli. Sarebbe fantastico provare a incorporare l'API di Google Maps in questo in qualche modo (magari usando strade ecc.) Solo per dare un'idea usando un diverso mezzo di trasporto. Devo ancora creare una funzione di ricottura simulata in PHP che sia in grado di offrire una soluzione efficiente al problema del commesso viaggiatore. Ma penso che potrei essere in grado di riutilizzare parte del tuo codice per farlo.
Ciao Douglas,
grazie mille per questo articolo, mi hai appena risparmiato un sacco di tempo.
stai attento,
nimrod @Israele
Buon articolo! Ho trovato molti articoli che descrivono come calcolare la distanza tra due punti, ma stavo davvero cercando lo snippet SQL.
Grazie mille funziona bene
Grazie mille per questa formula. Mi è passato un po' di tempo su un progetto di localizzazione di un negozio che mi stava mangiando.
Grazie un fascio. Questa piccola riga di codice mi ha fatto risparmiare parecchio tempo in un progetto di localizzazione di un negozio!
#1054 – Colonna sconosciuta "distanza" in "clausola where"
approvare
Lo stesso qui! Qual è il problema :-/? come risolvere il problema della “distanza” – Colonna? Aiutaci, per favore!! 🙂
Prova a usare HAVING invece di WHERE
2 giorni di ricerca per trovare finalmente questa pagina che risolve il mio problema. Sembra che farei meglio a tirare fuori la mia WolframAlpha e rispolverare i miei calcoli. Il passaggio da WHERE a HAVING ha il mio script funzionante. GRAZIE
invece della clausola WHERE usa:
AVENDO distanza < 50
Grazie Giorgia. Continuavo a ricevere la colonna "distanza" non trovata. Una volta cambiato il DOVE in AVERE ha funzionato come un incantesimo!
Vorrei che questa fosse la prima pagina che ho trovato su questo. Dopo aver provato molti comandi diversi, questo era l'unico a funzionare correttamente e con modifiche minime necessarie per adattarsi al mio database.
Grazie mille!
Vorrei che questa fosse la prima pagina che ho trovato su questo. Dopo aver provato molti comandi diversi, questo era l'unico a funzionare correttamente e con modifiche minime necessarie per adattarsi al mio database.
Grazie mille!
Molte grazie!
Molte grazie!
Non credo che il codice venga più visualizzato. Forse è Firefox?
Ho appena testato sia in Firefox che in Chrome e viene visualizzato. Riprova?
Ciao. Molte grazie. Funziona come un incantesimo.
Grazie mille Douglas. Questo funziona perfettamente.
So che questa formula funziona, ma non riesco a vedere dove viene preso in considerazione il raggio della terra. Qualcuno può illuminarmi, per favore?
Tim, per una spiegazione completa della formula Haversine (che non è codice), controlla l'articolo di Wikipedia: http://en.wikipedia.org/wiki/Haversine_formula
Bellissimo! Questo mi ha aiutato immensamente!
Roba fantastica Douglas. Hai provato a ottenere il punto di intersezione dato il Long/Lat/Bearing di due punti?
Non l'ho ancora fatto, Khanh!
Grazie Douglas, la query SQL è esattamente ciò di cui avevo bisogno e ho pensato di doverlo scrivere da solo. Mi hai salvato da forse ore di curva di apprendimento latitudine longitudine!
Continuo a ricevere messaggio di errore: colonna sconosciuta "Distanza" in "clausola where" sulla query MySQL.
Peter, leggi gli altri commenti. Sembra che alcune persone abbiano dovuto usare una sintassi diversa per WHERE/HAVING.
Grazie per questo fantastico articolo! Ho appena testato il codice sul mio DB e ha funzionato alla grande!
Douglas, grazie per questo fantastico codice. Mi sono scervellato su come farlo sul mio portale della community GPS. Mi hai risparmiato ore.
Bello sentirti, Ash!
grazie per aver pubblicato questo utile articolo,
ma per qualche motivo vorrei chiedere
come ottenere la distanza tra le coordinate all'interno di mysql db e le coordinate inserite in php dall'utente?
per descrivere più chiaramente:
1. l'utente deve inserire [id] per selezionare i dati specificati dal db e le coordinate dell'utente stesso
2. il file php ottiene i dati di destinazione (coordinate) utilizzando [id] e quindi calcola la distanza tra l'utente e il punto di destinazione
o puoi semplicemente ottenere la distanza dal codice qui sotto?
$qry = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180))) * sin((`Latitude`*pi()/180))+cos((“. $latitudine."*pi()/180)) * cos((`Latitudine`*pi()/180)) * cos(((".$longitudine."- `Longitudine`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) come distanza DA `MyTable` DOVE distanza >= “.$distanza.” >>>>posso “ridurre” la distanza da qui?
grazie ancora,
Timmy S
non importa, ho capito come funziona la "funzione" in php
$dis=getDistanceBetweenPointsNew($utenteLati, $utenteLongi, $lati, $longi, $unità = 'Km')
molte grazie!!
ok, tutto quello che ho provato non funziona. Voglio dire, quello che ho funziona, ma le distanze sono lontane.
Qualcuno potrebbe vedere cosa c'è di sbagliato in questo codice?
if(isset($_POST['inviato'])){ $z = $_POST['zipcode']; $r = $_POST['raggio']; echo “Risultati per “.$z; $sql = mysql_query(“SELECT DISTINCT m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m.verified, z1.lat, z2.lon, z1. city,z1.state DA mrk m, zip z1, zip z2 DOVE m.zipcode = z1.zipcode AND z2.zipcode = $z AND (3963 * acos( truncate( sin( z2.lat / 57.2958 ) * sin( m. y1 / 57.2958 ) + cos( z2.lat / 57.2958 ) * cos( m.y1 / 57.2958 ) * cos( m.x1 / 57.2958 – z2.lon / 57.2958 ) , 8 ) ) ) <= $r ") o die (mysql_error()); while($riga = mysql_fetch_array($sql )) { $store1 = $riga['NomeMkt']."”; $negozio = $riga['LocAddSt'].””; $store .= $riga['LocAddCity'].”, “.$riga['LocAddState'].” “.$riga['codice postale']; $latitudine1 = $riga['lat']; $longitudine1 = $riga['lon']; $latitudine2 = $riga['y1']; $longitudine2 = $riga['x1']; $città = $riga['città']; $stato = $riga['stato']; $dis = getnew($latitudine1, $longitudine1, $latitudine2, $longitudine2, $unità = 'Mi'); // $dis = distanza($lat1, $lon1, $lat2, $lon2); $verificato = $riga['verificato']; if($verificato == '1'){ echo “”; echo “”.$store.””; eco $dis . " lontano miglia"; eco ""; } else { echo “”.$store.””; eco $dis . " lontano miglia"; eco ""; } }}
il mio codice functions.php
funzione getnew($latitudine1, $longitudine1, $latitudine2, $longitudine2, $unità = 'Mi') { $teta = $longitudine1 – $longitudine2; $distanza = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $distanza = acos($distanza); $distanza = rad2deg($distanza); $distanza = $distanza * 60 * 1.1515; switch($unit) { case 'Mi': break; caso 'Km' : $distanza = $distanza * 1.609344; } ritorno (round($distanza,2)); }
Grazie in anticipo
Grazie per questo articolo. Funziona bene con il mio codice. 🙂
Ehi Douglas, ottimo articolo. Ho trovato davvero interessante la tua spiegazione dei concetti geografici e del codice. Il mio unico suggerimento sarebbe di spaziare e far rientrare il codice per la visualizzazione (come Stackoverflow, ad esempio). Capisco che vuoi risparmiare spazio, ma la spaziatura/rientro del codice convenzionale renderebbe molto più facile per me, come programmatore, leggere e sezionare. Comunque è una piccola cosa. Continuate così.
Grazie! Ho modificato un po' il post... ma le equazioni occupano così tanto spazio e sono così lunghe che non sono sicuro che aiuti troppo.
Grazie mille.
qui mentre si usa con la funzione otteniamo un tipo di distanza..mentre si usa la query sta arrivando un altro tipo di distanza
Non calcolerò la distanza tra due stati
Muchas gracias por tan hermoso codigo…
Queste sono buone funzioni del coseno. Non so matematica, ma grazie!
Ottimo lavoro... 🙂 (y)
sembra più veloce (mysql 5.9) usare due volte la formula nella selezione e dove:
$formula = “(((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)”;
$sql = 'SELEZIONA *, '.$formula.' come distanza DAL tavolo WHERE '..$formula.' <= '.$distanza;
Grazie…
non funziona se
“DOVE distanza”
lavorando se
“AVERE distanza”
Grazie mille per aver letto questo articolo. È molto utile.
PHP è stato inizialmente creato come una semplice piattaforma di scripting chiamata "Home page personale". Oggi PHP (abbreviazione di Hypertext Preprocessor) è un'alternativa alla tecnologia ASP (Active Server Pages) di Microsoft.
PHP è un linguaggio lato server open source utilizzato per la creazione di pagine Web dinamiche. Può essere incorporato in HTML. PHP viene solitamente utilizzato insieme a un database MySQL su server Web Linux/UNIX. È probabilmente il linguaggio di scripting più popolare.
Ho trovato la soluzione di cui sopra non funziona correttamente.
devo cambiare in:
$qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitudine . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitudine . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) come distanza DA `registro` “;
Grazie Kupendra!
grazie signore che funziona perfettamente .. ma ho una domanda se voglio emettere senza punto decimale, cosa posso fare ..?
Grazie in anticipo.
Ciao, per favore, avrò davvero bisogno del tuo aiuto su questo.
Ho fatto una richiesta di get al mio server web
53.47792 = $latitudine
-2.23389 = $longitudine
e 20 = la distanza che voglio recuperare
Tuttavia, usando la tua formula, recupera tutte le righe nel mio db
$results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”pi()/180)) * sin((latpi()/180))+cos((“.$latitudine.”pi()/180)) * cos((latpi()/180)) * cos(((“.$longitudine.”- lng)pi()/180))))180/pi())601.1515*1.609344) come distanza DA marcatori AVENTI distanza >= “.$distanza ));
[{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”address”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, ”distanza”:16079.294719663},{“id”:2,”nome”:”Amici's East Coast Pizzeria”,”indirizzo”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distanza”:16079.175940152},{“id”:3,”nome”:”Kapp's Pizza Bar & Grill”,”indirizzo”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”address”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”. View, CA”,”lat”:37.402652740479”,lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Origano's Wood-Fired Pizza”,”address”:”619 El Camino Real, Los Altos, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distanza”:16078.563225154},{“ id”.
Voglio recuperare solo righe con 20 miglia ma porta tutte le righe. Per favore, cosa sto sbagliando
Sto cercando una query simile ma ho intensificato un po ': in breve, questo è raggruppare tutte le coordinate entro 2 miglia da ciascuna coordinata e quindi contare quante coordinate in ciascun gruppo e produrre solo un gruppo che ha il maggior numero di coordinate, anche se hai più di un gruppo tra i gruppi che hanno il maggior numero di coordinate – emetti semplicemente il gruppo casuale dai gruppi con lo stesso numero più grande –
Grazie mille per la condivisione.