
Izračunajte ili postavite upit za udaljenost velikog kruga između tačaka geografske širine i dužine koristeći Haversine formulu (PHP, JavaScript, Java, Python, MySQL, MSSQL primjeri)
Ovog mjeseca sam dosta programirao PHP i MySQL u odnosu na GIS. Njuškajući po mreži, bilo mi je teško pronaći neke od njih Geografski proračuni kako bih pronašao udaljenost između dvije lokacije, pa sam ih želio podijeliti ovdje.

Jednostavan način izračuna udaljenosti između dvije točke je pomoću pitagorejske formule za izračunavanje hipotenuze trokuta (A² + B² = C²). Ovo je poznato kao Euklidska udaljenost.
To je zanimljiv početak, ali se ne odnosi na geografiju jer razdaljina između linija geografske širine i dužine nije jednaka. Kako se približavate ekvatoru, linije geografske širine se dalje udaljavaju. Ako koristite jednostavnu jednadžbu triangulacije, ona može precizno izmjeriti udaljenost na jednoj lokaciji, a pogrešno na drugoj, zbog zakrivljenosti Zemlje.
Udaljenost velike kružnice
Rute koje se putuju na velike udaljenosti oko Zemlje poznate su kao Velika kružna udaljenost. To jest... najkraća udaljenost između dvije tačke na sferi razlikuje se od tačaka na ravnoj karti. Kombinujte to sa činjenicom da linije geografske širine i dužine nisu jednako udaljene... i dobićete tešku kalkulaciju.
Evo fantastičnog video objašnjenja kako funkcioniraju Veliki krugovi.
Formula Haversine
Udaljenost koja koristi zakrivljenost Zemlje uključena je u Haversine formulu, koja koristi trigonometriju kako bi omogućila zakrivljenost Zemlje. Kada pronalazite udaljenost između 2 mjesta na Zemlji (zračnom linijom), prava linija je zapravo luk.
Ovo je primjenjivo u zračnom letu – da li ste ikada pogledali stvarnu kartu letova i primijetili da su zakrivljeni? To je zato što je letenje u luku između dvije točke kraće nego direktno do lokacije.
PHP: Izračunajte udaljenost između 2 tačke širine i dužine
Evo PHP formule za izračunavanje udaljenosti između dve tačke (zajedno sa konverzijom milja prema kilometru) zaokružene na dve decimale.
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));
}
Varijable su:
- $Latitude1 – varijabla za geografsku širinu vaše prve lokacije.
- $Longitude1 – varijabla za geografsku dužinu vaše prve lokacije
- $Latitude2 – varijabla za geografsku širinu vaše druge lokacije.
- $Longitude2 – varijabla za geografsku dužinu vaše druge lokacije.
- $unit – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.
Java: Izračunajte udaljenost između 2 tačke geografske širine i dužine
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;
}
}
Varijable su:
- geografska širina1 – varijabla za geografsku širinu vaše prve lokacije.
- geografska dužina1 – varijabla za geografsku dužinu vaše prve lokacije
- geografska širina2 – varijabla za geografsku širinu vaše druge lokacije.
- geografska dužina2 – varijabla za geografsku dužinu vaše druge lokacije.
- jedinica – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.
Javascript: Izračunajte udaljenost između 2 tačke geografske širine i dužine
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);
}
}
Varijable su:
- geografska širina1 – varijabla za geografsku širinu vaše prve lokacije.
- geografska dužina1 – varijabla za geografsku dužinu vaše prve lokacije
- geografska širina2 – varijabla za geografsku širinu vaše druge lokacije.
- geografska dužina2 – varijabla za geografsku dužinu vaše druge lokacije.
- jedinica – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.
Python: Izračunajte udaljenost između 2 tačke geografske širine i dužine
U svakom slučaju, evo Python formule za izračunavanje udaljenosti između dvije tačke (zajedno sa konverzijom milja u odnosu na kilometar) zaokružene na dvije decimale. Svaka čast mom sinu, Billu Karru koji radi kao Data Scientist OpenINSIGHTS, za kod.
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)
Varijable su:
- geografska širina1 – varijabla za vašu prvu lokaciju širina.
- geografska dužina1 – varijabla za vašu prvu lokaciju zemljopisnu dužinu
- geografska širina2 – varijabla za vašu drugu lokaciju širina.
- geografska dužina2 – varijabla za vašu drugu lokaciju zemljopisnu dužinu.
- jedinica – podrazumevano je hiljade. Ovo se može ažurirati ili proslijediti kao kilometara.
MySQL: Dohvaćanje svih zapisa unutar raspona izračunavanjem udaljenosti u miljama koristeći geografsku širinu i dužinu
Također je moguće koristiti SQL za izračunavanje svih zapisa unutar određene udaljenosti. U ovom primjeru, postavit ću upit MyTable u MySQL da pronađem sve zapise koji su manji ili jednaki promjenljivoj udaljenosti (u miljama) do moje lokacije na $latitude i $longitude:
Upit za dohvaćanje svih zapisa unutar određenog rastojanje izračunavanjem udaljenosti u miljama između dvije tačke geografske širine i dužine su:
$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."
Morat ćete prilagoditi ovo:
- $ zemljopisne dužine - ovo je PHP varijabla gdje prolazim dužinu točke.
- $ geografska širina - ovo je PHP varijabla gdje prolazim dužinu točke.
- $ udaljenost - ovo je udaljenost na kojoj biste željeli pronaći sve zapise manje ili jednake.
- sto - ovo je tablica ... to ćete htjeti zamijeniti imenom svoje tablice.
- širina - ovo je polje vaše geografske širine.
- zemljopisnu dužinu - ovo je polje vaše geografske dužine.
MySQL: Dohvaćanje svih zapisa unutar raspona izračunavanjem udaljenosti u kilometrima koristeći geografsku širinu i dužinu
I evo SQL upita koji koristi kilometre u 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."
Morat ćete prilagoditi ovo:
- $ zemljopisne dužine - ovo je PHP varijabla gdje prolazim dužinu točke.
- $ geografska širina - ovo je PHP varijabla gdje prolazim dužinu točke.
- $ udaljenost - ovo je udaljenost na kojoj biste željeli pronaći sve zapise manje ili jednake.
- sto - ovo je tablica ... to ćete htjeti zamijeniti imenom svoje tablice.
- širina - ovo je polje vaše geografske širine.
- zemljopisnu dužinu - ovo je polje vaše geografske dužine.
Koristila sam ovaj kod u platformi za mapiranje preduzeća, koju smo koristili za maloprodaju sa preko 1,000 lokacija širom Sjeverne Amerike, i to je djelovalo lijepo.
Microsoft SQL Server Geografska udaljenost: STDistance
Ako koristite Microsoft SQL Server, oni nude svoju vlastitu funkciju, STDistance za izračunavanje udaljenosti između dvije tačke koristeći tip podataka Geografija.
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);
Šešir za Manash Sahoo, potpredsjednik i arhitekta Highbridge.
Hvala vam puno na dijeljenju. Ovo je bio lak posao kopiranja i lijepljenja i odlično funkcionira. Uštedeli ste mi puno vremena.
FYI za sve koji portiraju na C:
double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }
Vrlo lijepa objava – funkcionirala je jako lijepo – morao sam samo promijeniti ime stola sa lat-long. Radi prilično brzo da.. Imam relativno mali broj lat-longs (< 400), ali mislim da bi ovo bilo dobro skalirati. I dobra stranica – upravo sam je dodao na svoj del.icio.us nalog i redovno ću provjeravati.
Hvala puno Peter i Kerry! Ako volite raditi na GIS projektima, preporučio bih:
Hvala vam puno… 😀
Cijeli dan sam tražio kalkulacije udaljenosti i pronašao harversine algoritam, zahvaljujući vama što ste dali primjer kako ga staviti u sql izraz. Hvala i pozdrav, Daniele
Drago mi je pomoći, rails prijatelju!
Sada sam u potrazi za PHP funkcijom 'u poligonu' koja će uzeti niz sekvencioniranih koordinata geografske širine i dužine i otkriti da li je druga tačka unutar ili izvan poligona.
Pronašao sam jednadžba za određivanje da li je tačka u poligonu!
Mislim da je vašem SQL-u potreban iskaz.
umjesto WHERE distance <= $distance možda ćete trebati
koristite HAVING distance <= $distance
inače hvala što si mi uštedio gomilu vremena i energije.
Hi David,
Ako radite bilo koju vrstu naredbe GROUP BY, trebat će vam HAVING. Ne radim to u gornjem primjeru.
Doug
Od MySQL 5.x, ne možete koristiti pseudonim u klauzuli WHERE pogledajte http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Koristite HAVING umjesto WHERE u gornjim upitima
Hvala vam puno. Uradili ste odličan posao. To je ono što ja zapravo želim. Hvala puno.
Hvala vam puno što ste podijelili ovaj kod. To mi je uštedilo dosta vremena za razvoj. Takođe, hvala vašim čitaocima što su istakli da je izjava HAVING neophodna za MySQL 5.x. Vrlo korisno.
Blagoslovena sam što imam čitaoce mnogo pametnije od mene!
🙂
Gornja formula mi štedi puno vremena. Hvala vam puno.
Također moram prebaciti između NMEA formata i stupnjeva. Pronašao sam formulu na ovom URL-u na dnu stranice. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Da li neko zna kako to provjeriti?
Hvala ti!
Harry
Zdravo,
Drugo pitanje. Postoji li formula za NMEA stringove poput one ispod?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
hvala,
Harry
Također sam otkrio da WHERE ne radi za mene. Promijenio u HAVING i sve radi savršeno. U početku nisam čitao komentare i prepisao sam ih koristeći ugniježđeni odabir. Oba će raditi sasvim dobro.
Hvala puno na skripti napisanoj u mysql-u, samo sam morao da napravim nekoliko manjih podešavanja (IMAM) 🙂
Bravo
Nevjerovatno korisno, hvala vam puno! Imao sam problema sa novim “IMATI”, a ne “GDJE”, ali kada sam pročitao komentare ovdje (nakon otprilike pola sata frustrirano škrgutanja zubima =P), dobro sam uspio. Hvala ^_^
hvala puno radi odlično
Imajte na umu da će takva odabrana izjava biti računski vrlo intenzivna i stoga spora. Ako imate puno tih upita, stvari mogu brzo da se završe.
Mnogo manje intenzivan pristup je pokretanje prvog (sirovog) odabira koristeći KVADRATNU oblast definisanu izračunatom rastojanjem, tj. “odaberite * iz naziva tabele gde je geografska širina između lat1 i lat2 i dužina između lon1 i lon2”. lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, slično kao i lon. latdiff ~= udaljenost / 111 (za km), ili udaljenost/69 za milje jer je 1 stepen geografske širine ~ 111 km (mala varijacija jer je zemlja blago ovalna, ali dovoljna za ovu svrhu). londiff = udaljenost / (abs(cos(deg2rad(latitude))*111)) — ili 69 za milje (zapravo možete uzeti malo veći kvadrat da biste uzeli u obzir varijacije). Zatim uzmite rezultat toga i unesite ga u radijalni odabir. Samo ne zaboravite da uzmete u obzir koordinate izvan granica – tj. raspon prihvatljive geografske dužine je -180 do +180, a raspon prihvatljive geografske širine je -90 do +90 — u slučaju da vaš latdiff ili londiff ide izvan ovog raspona . Imajte na umu da u većini slučajeva ovo možda nije primjenjivo jer utječe samo na proračune preko linije kroz Tihi ocean od pola do pola, iako siječe dio Čukotke i dio Aljaske.
Ono što time postižemo je značajno smanjenje broja bodova prema kojima vršite ovu kalkulaciju. Ako imate milion globalnih tačaka u bazi podataka raspoređenih otprilike ravnomjerno i želite da pretražujete u krugu od 100 km, tada je vaša prva (brza) pretraga površine 10000 kvadratnih kilometara i vjerovatno će dati oko 20 rezultata (zasnovano na ravnomjernoj distribuciji na površine oko 500M kvadratnih kilometara), što znači da za ovaj upit izvodite složeno izračunavanje udaljenosti 20 puta umjesto milion puta.
Manja greška u primjeru… to bi bilo za unutar 50 km (ne 100) budući da gledamo „radijus“ našeg… kvadrata.
Fantastičan savjet! Zapravo sam radio sa programerom koji je napisao funkciju koja je povukla unutrašnji kvadrat, a zatim rekurzivnu funkciju koja je napravila 'kvadrate' oko perimetra da bi uključila i isključila preostale tačke. Rezultat je bio neverovatno brz rezultat – mogao je da proceni milione poena u mikrosekundama.
Moj gore navedeni pristup je definitivno 'grub', ali sposoban. Hvala još jednom!
Doug,
Pokušavao sam da koristim mysql i php da procenim da li je duga tačka lat unutar poligona. Znate li da li je vaš prijatelj programer objavio ikakve primjere kako da izvršite ovaj zadatak. Ili znate neki dobar primjer. Hvala unaprijed.
Zdravo svima ovo je moj test SQL izraz:
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
a Mysql mi govori da udaljenost, ne postoji kao kolona, mogu koristiti poredak po, mogu to učiniti bez WHERE, i radi, ali ne sa njim...
Zamijenite “WHERE distance” sa “HAVING distance”.
Radi kao šarm, hvala, Douglas!
Ovo je sjajno, međutim to je baš kao što ptice lete. Bilo bi sjajno pokušati i na neki način uključiti API google maps (možda korištenjem cesta itd.) Samo da date ideju koristeći drugačiji oblik prijevoza. Još uvek treba da napravim simuliranu funkciju žarenja u PHP-u koja bi bila u stanju da ponudi efikasno rešenje za problem trgovačkog putnika. Ali mislim da ću možda moći ponovo upotrijebiti dio vašeg koda da to učinim.
Zdravo Douglas,
hvala vam puno na ovom članku – upravo ste mi uštedjeli puno vremena.
čuvaj se,
nimrod @Israel
Dobar članak! Pronašao sam mnogo članaka koji opisuju kako izračunati udaljenost između dvije tačke, ali sam zaista tražio SQL isječak.
Hvala puno radi dobro
Hvala vam puno za ovu formulu. Izbrijao je neko vrijeme na projektu lokacije trgovine koji me je izjedao.
Hvala paket. Ovaj mali red koda mi je uštedio dosta vremena u projektu lokacije trgovine!
#1054 – Nepoznata kolona 'udaljenost' u 'gdje klauzula'
odobri
Isto ovdje! Šta je problem :-/? kako riješiti problem “udaljenost” – kolona? Pomozite nam, molim vas!! 🙂
Pokušajte koristiti HAVING umjesto WHERE
2 dana istraživanja da konačno pronađem ovu stranicu koja rješava moj problem. Izgleda da je bolje da izbacim svoju WolframAlpha-u i popravim matematiku. Promjena sa WHERE na HAVING ima moju skriptu u radnom stanju. HVALA TI
umjesto klauzule WHERE koristite :
IMAJUĆI rastojanje < 50
Hvala Georgi. Stalno sam dobijao da kolona 'distance' nije pronađena. Jednom kada sam promijenio WHERE u HAVING, radilo je kao šarm!
Volio bih da je ovo prva stranica koju sam pronašao o ovome. Nakon pokušaja mnogih različitih komandi, ovo je jedina koja je ispravno radila i sa minimalnim promjenama potrebnim da bi se uklopila u moju vlastitu bazu podataka.
Puno hvala!
Volio bih da je ovo prva stranica koju sam pronašao o ovome. Nakon pokušaja mnogih različitih komandi, ovo je jedina koja je ispravno radila i sa minimalnim promjenama potrebnim da bi se uklopila u moju vlastitu bazu podataka.
Puno hvala!
Hvala puno!
Hvala puno!
Mislim da se kod više ne pojavljuje. Možda je firefox?
Upravo sam testirao i Firefox i Chrome i pojavljuje se. Pokušaj ponovo?
Zdravo. Hvala puno. Ovo djeluje kao šarm.
Hvala puno Douglas. Ovo radi savršeno.
Znam da ova formula funkcioniše, ali ne mogu da vidim gde se uzima u obzir poluprečnik Zemlje. Može li me neko prosvijetliti, molim vas?
Tim, za potpuno objašnjenje Haversine formule (to nije kod), pogledajte članak na Wikipediji: http://en.wikipedia.org/wiki/Haversine_formula
Beautiful! Ovo mi je izuzetno pomoglo!
Odlična stvar Douglas. Jeste li pokušali dobiti tačku raskrsnice s obzirom na Long/Lat/Bearing dvije tačke?
Još to nisam uradio, Khanh!
Hvala Douglase, SQL upit je upravo ono što mi je trebalo, i mislio sam da ću morati sam da ga napišem. Spasio si me od mogućih sati krivulje učenja geografske širine i dužine!
Stalno dobijam poruku o grešci: Nepoznata kolona 'Distance' u 'where clause' na MySQL upitu.
Peter, pročitaj ostale komentare. Čini se da su neki ljudi morali koristiti drugačiju sintaksu za WHERE/HAVING.
Hvala vam na ovom sjajnom članku! Upravo sam testirao kod na mojoj DB i odlično je radio!
Douglase, hvala ti na ovom sjajnom kodu. Razbijao sam glavu o tome kako to učiniti na svom portalu GPS zajednice. Uštedio si mi sate.
Divno je čuti, Ash!
hvala na objavi ovog korisnog članka,
ali iz nekog razloga želim da pitam
kako dobiti udaljenost između koordinata unutar mysql db-a i koordinata koje je korisnik umetnuo u php?
za jasnije opisati:
1.korisnik mora umetnuti [id] za odabir specificiranih podataka iz db-a i samih korisnika
2. php fajl dobija ciljne podatke (koorde) koristeći [id], a zatim izračunava udaljenost između korisnika i ciljne tačke
ili jednostavno možete dobiti udaljenost od koda ispod?
$qry = “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) kao udaljenost OD `MyTable` GDJE udaljenost >= “.$distance.” >>>>mogu li odavde "izvući" udaljenost?
hvala još jednom,
Timmy S
nema veze, shvatio sam kako “funkcija” radi u php-u
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
hvala puno!!
ok, sve što sam probao ne radi. Mislim, ono što imam radi, ali udaljenosti su velike.
Da li bi neko mogao da vidi šta nije u redu sa ovim kodom?
if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['radijus']; echo “Rezultati za “.$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. grad,z1.state FROM mrk m, zip z1, zip z2 GDJE m.zipcode = z1.zipcode I z2.zipcode = $z I (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 ) ) ili <= ) ) ") (mysql_error()); while($row = mysql_fetch_array($sql)) { $store1 = $row['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$row['zipcode']; $latitude1 = $red['lat']; $longitude1 = $red['lon']; $latitude2 = $red['y1']; $longitude2 = $red['x1']; $city = $row['grad']; $state = $row['state']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = distance($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo “”; echo “.$store.””; echo $dis . " miljama daleko"; echo “”; } else { echo “.$store.””; echo $dis . " miljama daleko"; echo “”; } }}
moj kod functions.php
funkcija getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $theta = $longitude1 – $longitude2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $distanca = akos($udaljenost); $distanca = rad2deg($distanca); $distance = $distance * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } povratak (okrugli($distance,2)); }
Unaprijed hvala
Hvala vam na ovom članku. Dobro radi sa mojim kodom. 🙂
Hej Douglase, odličan članak. Vaše objašnjenje geografskih koncepata i šifre bilo mi je zaista zanimljivo. Moj jedini prijedlog bi bio da razmaknete i uvučete kod za prikaz (kao Stackoverflow, na primjer). Razumijem da želite uštedjeti prostor, ali konvencionalni razmak/uvlačenje koda bi mi, kao programeru, mnogo olakšalo čitanje i seciranje. U svakom slučaju, to je mala stvar. Nastavite sa odličnim radom.
Hvala! Malo sam izmijenio post... ali jednačine zauzimaju toliko prostora i toliko su dugačke da nisam siguran da previše pomaže.
Hvala ti puno.
ovdje dok koristimo with funkciju dobijamo jednu vrstu udaljenosti..dok koristimo upit dolazimo drugu vrstu udaljenosti
Neću izračunati udaljenost između dva stanja
Muchas gracias por tan hermoso codigo…
Ovo ima dobre kosinusne funkcije. Ne znam matematiku, ali hvala!
Odličan posao… 🙂 (y)
čini se bržim (mysql 5.9) koristiti dvostruku formulu u odabiru i gdje:
$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 = 'IZABIR *, '.$formula.' kao udaljenost OD tabele WHERE '..$formula.' <= '.$distance;
hvala ...
ne radi ako
“WHERE distance”
radi ako
“IMATI distancu”
Hvala puno što ste pročitali ovaj članak, od velike je pomoći.
PHP je isprva kreiran kao jednostavna platforma za skriptiranje pod nazivom “Personal Home Page”. Danas je PHP (skraćenica od Hypertext Preprocessor) alternativa Microsoftovoj tehnologiji Active Server Pages (ASP).
PHP je jezik otvorenog koda na strani servera koji se koristi za kreiranje dinamičkih web stranica. Može se ugraditi u HTML. PHP se obično koristi u sprezi sa MySQL bazom podataka na Linux/UNIX web serverima. To je vjerovatno najpopularniji skriptni jezik.
Našao sam da gore navedeno rješenje ne radi kako treba.
Moram promijeniti u:
$qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitude . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) kao udaljenost OD `registra` “;
Hvala Kupendra!
hvala gospodine, savršeno funkcionirate.. ali imam jedno pitanje ako želim ispisati bez decimalnog zareza, što onda mogu učiniti..?
Hvala unaprijed.
Zdravo, molim vas, zaista će mi trebati vaša pomoć oko ovoga.
Napravio sam zahtjev za preuzimanje svom web serveru
53.47792 = $latitude
-2.23389 = $dužina
i 20 = udaljenost koju želim pronaći
Međutim, koristeći vašu formulu, dohvaća sve redove u mojoj db
$results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude.”))pi()/180)) * sin((latpi()/180))+cos((“.$latitude.”pi()/180)) * cos((latpi()/180)) * cos(((.$longitude.”- lng)pi()/180))))180/pi())601.1515*1.609344) kao rastojanje OD markera KOJI IMAJU rastojanje >= “.$distance ));
[{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”address”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, ”distance”:16079.294719663},{“id”:2,”name”:”Amici's East Coast Pizzeria”,”address”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”adresa”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”adresa”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”adresa Escuela”:619”: View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Origano's Wood-Fired Pizza:””4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distance”:16077.937560795},{“ id”:7,”name”:”Šarkovi i roštilji”,”adresa”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distance”:8038.7620112314
Želim da dohvatim samo redove sa 20 milja, ali to donosi sve redove. Molim te šta radim pogrešno
Tražim sličan upit, ali sam se malo pojačao – ukratko, ovo je grupirati sve koordinate unutar 2 milje od svake koordinate, a zatim izbrojati koliko koordinata u svakoj grupi i ispisati samo jednu grupu koja ima najviše koordinata – čak i ako imate više od jedne grupe među grupama koje imaju najveći broj koordinata – jednostavno ispišite slučajnu grupu iz grupa s istim najvećim brojem –
Hvala vam puno što ste podelili.