
Laius- ja pikkuskraadi punktide vahelise laius- ja pikkuskraadi vahelise kauguse arvutamine või päring Haversine'i valemi abil (PHP, JavaScript, Java, Python, MySQL, MSSQL näited)
Sellel kuul olen üsna palju programmeerinud PHP ja MySQL austusega GIS. Netis nuhkides oli mul tegelikult raske mõnda neist leida Geograafilised arvutused kahe asukoha vahelise kauguse leidmiseks tahtsin neid siin jagada.

Lihtne viis kahe punkti vahelise kauguse arvutamiseks on Pythagorase valemi abil kolmnurga hüpotenuusi arvutamine (A² + B² = C²). Seda tuntakse kui Eukleidese kaugus.
See on huvitav algus, kuid see ei kehti geograafia kohta, kuna laius- ja pikkuskraadide vaheline kaugus ei ole üksteisest võrdne. Kui jõuate ekvaatorile lähemale, kaugenevad laiuskraadid üksteisest kaugemale. Kui kasutate lihtsat triangulatsioonivõrrandit, võib see Maa kõveruse tõttu mõõta kaugust ühes kohas täpselt ja teises kohas valesti.
Suur ringkaugus
Maa ümber pikki vahemaid läbitud marsruute tuntakse suure ringi vahemaa nime all. See tähendab… lühim vahemaa kahe punkti vahel sfääril erineb punktidest tasasel kaardil. Kombineerige see tõsiasjaga, et laius- ja pikkuskraadid ei ole võrdsel kaugusel... ja teil on keeruline arvutus.
Siin on fantastiline video selgitus suurepäraste ringide toimimise kohta.
Haversine valem
Maa kumerust kasutav kaugus sisaldub Haversine'i valemis, mis kasutab Maa kõveruse arvestamiseks trigonomeetriat. Kui otsite Maa kahe koha vahelist kaugust (lennult linnulennult), on sirgjoon tegelikult kaar.
See kehtib õhulendude puhul – kas olete kunagi tegelikku lendude kaarti vaadanud ja märganud, et need on kaarekujulised? Seda seetõttu, et kahe punkti vahel kaares lendamine on lühem kui otse asukohta.
PHP: arvutage kaugus kahe laius- ja pikkuskraadi vahel
Siin on PHP valem kahe punkti vahelise kauguse arvutamiseks (koos Mile vs. Kilometer teisendusega) ümardatuna kahe kümnendkohani.
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));
}
Muutujad on:
- $Latitude1 – teie esimese asukoha laiuskraadi muutuja.
- $ pikkuskraad1 – teie esimese asukoha pikkuskraadi muutuja
- $Latitude2 – teie teise asukoha laiuskraadi muutuja.
- $ pikkuskraad2 – teie teise asukoha pikkuskraadi muutuja.
- $ühik – vaikeolemus miili. Seda saab värskendada või edasi anda kilomeetrit.
Java: 2 laius- ja pikkuskraadi vahelise kauguse arvutamine
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;
}
}
Muutujad on:
- laiuskraad1 – teie esimese asukoha laiuskraadi muutuja.
- pikkuskraad1 – teie esimese asukoha pikkuskraadi muutuja
- laiuskraad2 – teie teise asukoha laiuskraadi muutuja.
- pikkuskraad2 – teie teise asukoha pikkuskraadi muutuja.
- üksus – vaikeolemus miili. Seda saab värskendada või edasi anda kilomeetrit.
Javascript: 2 laius- ja pikkuskraadi vahelise kauguse arvutamine
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);
}
}
Muutujad on:
- laiuskraad1 – teie esimese asukoha laiuskraadi muutuja.
- pikkuskraad1 – teie esimese asukoha pikkuskraadi muutuja
- laiuskraad2 – teie teise asukoha laiuskraadi muutuja.
- pikkuskraad2 – teie teise asukoha pikkuskraadi muutuja.
- üksus – vaikeolemus miili. Seda saab värskendada või edasi anda kilomeetrit.
Python: 2 laius- ja pikkuspunkti vahelise kauguse arvutamine
Igatahes on siin Pythoni valem kahe punkti vahelise kauguse arvutamiseks (koos Mile vs. Kilometer teisendusega) ümardatuna kahe kümnendkohani. Tänu minu pojale Bill Karrile, kes on andmeteadlane OpenINSIGHTS, koodi jaoks.
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)
Muutujad on:
- laiuskraad1 – teie esimese asukoha muutuja laius.
- pikkuskraad1 – teie esimese asukoha muutuja pikkuskraad
- laiuskraad2 – teie teise asukoha muutuja laius.
- pikkuskraad2 – teie teise asukoha muutuja pikkuskraad.
- üksus – vaikeolemus miili. Seda saab värskendada või edasi anda kilomeetrit.
MySQL: kõigi teatud vahemikus olevate kirjete hankimine, arvutades vahemaa miilides laius- ja pikkuskraadide abil
Samuti on võimalik kasutada SQL-i kõigi teatud vahemaa kirjete arvutamiseks. Selles näites esitan MySQL-i MyTable päringu, et leida kõik kirjed, mis on väiksemad või võrdsed muutujaga $kaugus (miilides) minu asukohast $laius- ja $pikkuskraad:
Päring kõigi konkreetses olevate kirjete hankimiseks kaugus arvutades kahe laius- ja pikkuskraadi vahelise kauguse miilides, on:
$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."
Peate seda kohandama:
- $ pikkuskraad - see on PHP muutuja, kus ma läbin punkti pikkuskraadi.
- $ laiuskraad - see on PHP muutuja, kus ma läbin punkti pikkuskraadi.
- $ vahemaa - see on vahemaa, mille soovite leida kõik kirjed vähem või võrdsed.
- tabel - see on tabel ... soovite selle asendada oma tabeli nimega.
- laius - see on teie laiuskraadi väli.
- pikkuskraad - see on teie pikkuskraadi väli.
MySQL: kõigi kirjete otsimine vahemikus, arvutades kauguse kilomeetrites laius- ja pikkuskraadi abil
Ja siin on SQL-päring, kasutades MySQL-is kilomeetreid:
$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."
Peate seda kohandama:
- $ pikkuskraad - see on PHP muutuja, kus ma läbin punkti pikkuskraadi.
- $ laiuskraad - see on PHP muutuja, kus ma läbin punkti pikkuskraadi.
- $ vahemaa - see on vahemaa, mille soovite leida kõik kirjed vähem või võrdsed.
- tabel - see on tabel ... soovite selle asendada oma tabeli nimega.
- laius - see on teie laiuskraadi väli.
- pikkuskraad - see on teie pikkuskraadi väli.
Kasutasin seda koodi ettevõtte kaardistamise platvormil, mida kasutasime Põhja-Ameerikas üle 1,000 asukohaga jaekaupluses ja see töötas suurepäraselt.
Microsoft SQL Serveri geograafiline kaugus: STDistance
Kui kasutate Microsoft SQL Serverit, pakuvad nad oma funktsiooni, STDistants kahe punkti vahelise kauguse arvutamiseks, kasutades andmetüüpi Geograafia.
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);
Kübaraotsa Manash Sahoole, VP ja arhitektile Highbridge.
Suur tänu jagamise eest. See oli lihtne kopeerimis- ja kleepimistöö ning töötab suurepäraselt. Olete minu aega säästnud.
Teabeks kõigile, kes portivad C-sse:
double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }
Väga tore postitus – töötas väga hästi – pidin muutma vaid lati-pikkust hoidva tabeli nime. See töötab üsna kiiresti, et.. Mul on suhteliselt vähe lat-longe (< 400), kuid ma arvan, et see mastaapiks kenasti. Tore sait ka – lisasin selle just oma del.icio.us kontole ja kontrollin seda regulaarselt.
Suur tänu Peter ja Kerry! Kui teile meeldib GIS-projektidega töötada, soovitan:
Suur tänu… 😀
Otsisin terve päeva kauguse arvutusi ja leidsin harversine'i algoritmi, tänan teid, et tõite näite selle kohta, kuidas see sql-lausesse panna. Aitäh ja tervitused, Daniel
Hea meel aidata, rööbaste sõber!
Nüüd otsin PHP funktsiooni „hulknurgas”, mis võtab järjestatud laius- ja pikkuskoordinaatide massiivi ning selgitab välja, kas hulknurga sees või väljaspool on mõni muu punkt.
Ma leidsin selle võrrand, et välja selgitada, kas punkt on hulknurgas!
Ma arvan, et teie SQL vajab avaldust.
asemel WHERE vahemaa <= $vahemaa, mida võib vaja minna
kasuta OMA kaugust <= $kaugust
muidu tänan, et säästsite mu hunniku aega ja energiat.
Tere David,
Kui teete mis tahes tüüpi GROUP BY avaldust, vajate sõna HAVING. Ülaltoodud näites ma seda ei tee.
Doug
Alates versioonist MySQL 5.x ei saa te WHERE-klauslis pseudonüümi kasutada http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Kasutage ülaltoodud päringutes WHERE asemel HAVING
Tänan teid väga. Olete teinud suurepärast tööd. See on asi, mida ma tegelikult tahan. Tänud.
Suur tänu selle koodi jagamise eest. See säästis palju arendusaega. Samuti täname teie lugejaid tähelepanu eest, et HAVING-lause on MySQL 5.x jaoks vajalik. Väga abivalmis.
Olen õnnistatud, et mul on minust palju targemad lugejad!
🙂
Ülaltoodud valem säästab palju aega. Tänan teid väga.
Samuti pean lülituma NMEA vormingu ja kraadide vahel. Leidsin valemi sellelt URL-ilt lehe allosas. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Kas keegi teab, kuidas seda kontrollida?
Aitäh!
Röövima
Tere,
Järgmine küsimus. Kas NMEA stringide jaoks on olemas selline valem nagu allpool?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Thanks,
Röövima
Samuti avastasin, et WHERE minu jaoks ei tööta. Vahetasin selle vastu HAVING ja kõik töötab ideaalselt. Alguses ma ei lugenud kommentaare ja kirjutasin selle ümber, kasutades pesastatud valikut. Mõlemad töötavad hästi.
Tänan teid väga mysql-is kirjutatud skripti eest, tuli lihtsalt teha mõned väikesed muudatused (HAVING) 🙂
Gret töö
Uskumatult abivalmis, suur tänu! Mul oli probleeme pigem uue “HAVING”-ga kui “KUS”, kuid kui lugesin siinseid kommentaare (pärast umbes poolt tundi pettunult hammaste krigistamist =P), sain selle kenasti tööle. Aitäh ^_^
suur tänu töötab suurepäraselt
Pidage meeles, et selline valitud avaldus on arvutuslikult intensiivne ja seetõttu aeglane. Kui teil on palju neid päringuid, võib see asjad üsna kiiresti takerduda.
Palju vähem intensiivne lähenemine on käivitada esimene (toores) valik, kasutades SQUARE ala, mis on määratletud arvutatud vahemaaga, st "vali * tabelinimest, kus laiuskraad on vahemikus lat1 ja lat2 ning pikkuskraad vahemikus lon1 ja lon2". lat1 = sihtlaiuskraad – latdiff, lat2 = sihtlaiuskraad + latdiff, sarnane lon-iga. latdiff ~= kaugus / 111 (km) või kaugus/69 miili puhul, kuna 1 laiuskraad on ~ 111 km (väike kõikumine, kuna maa on veidi ovaalne, kuid selleks piisab). londiff = kaugus / (abs(cos(deg2rad(laiuskraad))*111)) — või 69 miili kohta (tegelikult võite variatsioonide arvessevõtmiseks võtta veidi suurema ruudu). Seejärel võtke selle tulemus ja sisestage see radiaalsesse valikusse. Lihtsalt ärge unustage arvestada piiriväliste koordinaatidega – st vastuvõetava pikkuskraadi vahemik on -180 kuni +180 ja vastuvõetava laiuskraadi vahemik -90 kuni +90 - juhuks, kui teie latdiff või londiff jookseb sellest vahemikust välja . Pange tähele, et enamikul juhtudel ei pruugi see olla kohaldatav, kuna see mõjutab arvutusi ainult Vaikse ookeani poolusest pooluseni läbiva joone üle, kuigi see ristub osa chukotkast ja osa Alaskast.
See, mida me sellega saavutame, on selle arvutuse tegemisel kasutatavate punktide arvu märkimisväärne vähendamine. Kui teil on andmebaasis miljon globaalset punkti, mis on jaotatud ligikaudu ühtlaselt ja soovite otsida 100 km raadiuses, siis on teie esimene (kiire) otsing 10000 20 ruutkilomeetri suurusel alal ja annab tõenäoliselt umbes 500 tulemust (ühtlase jaotuse põhjal pindala on umbes 20 miljonit ruutkilomeetrit), mis tähendab, et käivitate selle päringu jaoks keeruka kauguse arvutamise miljoni korra asemel XNUMX korda.
Väike viga näites… see oleks 50 km (mitte 100) raadiuses, kuna me vaatame oma… ruudu “raadiust”.
Fantastiline nõuanne! Ma töötasin tegelikult arendajaga, kes kirjutas funktsiooni, mis tõmbas sisemise ruudu, ja seejärel rekursiivse funktsiooni, mis moodustas perimeetri ümber ruudud, et lisada ja välja jätta ülejäänud punktid. Tulemuseks oli uskumatult kiire tulemus – ta suutis hinnata miljoneid punkte mikrosekundites.
Minu ülaltoodud lähenemisviis on kindlasti "toores", kuid võimekas. Aitäh veel kord!
taigen,
Olen proovinud kasutada mysql-i ja php-d, et hinnata, kas lati pikk punkt on hulknurga sees. Kas teate, kas teie arendaja sõber avaldas selle ülesande täitmise kohta näiteid? Või tead häid näiteid. Ette tänades.
Tere kõigile, see on minu test-SQL-lause:
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
ja Mysql ütleb mulle, et vahemaa ei eksisteeri veeruna, ma saan kasutada järjestust, saan seda teha ilma WHEREta ja see töötab, aga mitte sellega…
Asenda “WHERE distance” sõnaga “HAVING distance”.
Töötab nagu võlu, aitäh, Douglas!
See on suurepärane, kuid see on täpselt nii, nagu linnud lendavad. Oleks tore proovida google mapsi API-d sellesse kuidagi kaasata (võib-olla kasutades teid vms). Lihtsalt selleks, et anda aimu mõne teise transpordiliigi kasutamisest. Mul on veel vaja teha PHP-s simuleeritud anniilimisfunktsioon, mis suudaks pakkuda tõhusat lahendust reisiva müügimehe probleemile. Kuid arvan, et saan osa teie koodist selleks uuesti kasutada.
Tere Douglas,
tänan teid väga selle artikli eest – säästsite minu jaoks palju aega.
ole tubli,
nimrod @Iisrael
Hea artikkel! Leidsin palju artikleid, mis kirjeldavad kahe punkti vahelise kauguse arvutamist, kuid otsisin tõesti SQL-i fragmenti.
Suur tänu töötab hästi
Tänan teid selle valemi eest. See raseeris mõnda aega poe asukohaprojektiga, mis mind sõi.
Tänud kimpu. See väike koodirida säästis mulle poe asukohaprojektis märkimisväärselt aega!
#1054 – tundmatu veerg "kaugus" klauslis "kus"
heaks kiitma
Sama siin! Mis on probleemiks :-/? kuidas lahendada "kauguse" – veeru ülesanne? Aidake meid, palun!! 🙂
Proovige WHERE asemel kasutada HAVING
2 päeva uurimistööd, et lõpuks leida see leht, mis mu probleemi lahendab. Tundub, et parem võtan oma WolframAlpha välja ja teen oma matemaatikat. Muudatus väärtuselt WHERE väärtusele HAVING on minu skripti töökorras. AITÄH
WHERE-klausli asemel kasutage :
mille vahemaa on < 50
Aitäh Georgile. Sain pidevalt, et veergu "kaugus" ei leitud. Kui ma vahetan WHERE väärtuseks HAVING, see töötas nagu võlu!
Soovin, et see oleks esimene leht, mille ma selle kohta leidsin. Pärast paljude erinevate käskude proovimist oli see ainus, mis töötas korralikult ja minu enda andmebaasi sobitamiseks oli vaja minimaalseid muudatusi.
Suured tänud!
Soovin, et see oleks esimene leht, mille ma selle kohta leidsin. Pärast paljude erinevate käskude proovimist oli see ainus, mis töötas korralikult ja minu enda andmebaasi sobitamiseks oli vaja minimaalseid muudatusi.
Suured tänud!
Tänud!
Tänud!
Ma arvan, et kood ei ilmu enam. Võib-olla on see firefox?
Testisin just nii Firefoxis kui ka Chrome'is ja see ilmub. Proovi uuesti?
Tere. Tänud. See toimib nagu võlu.
Suur tänu, Douglas. See töötab ideaalselt.
Ma tean, et see valem töötab, aga ma ei näe, kus on maakera raadius arvesse võetud. Kas keegi võiks mind valgustada, palun?
Tim, Haversine'i valemi (see pole kood) täieliku selgituse saamiseks vaadake Wikipedia artiklit: http://en.wikipedia.org/wiki/Haversine_formula
Ilus! See on mind tohutult aidanud!
Suurepärane värk Douglas. Kas olete proovinud saada ristumispunkti, võttes arvesse kahe punkti pikkust / laiust / suunda?
Pole seda veel teinud, Khanh!
Aitäh, Douglas, SQL-päring on täpselt see, mida ma vajasin, ja arvasin, et pean selle ise kirjutama. Olete mind päästnud võib-olla tundidepikkusest laiuskraadi õppimiskõverast!
Ma saan pidevalt veateadet: tundmatu veerg „Distance” MySQL-päringu „kus-klauslis”.
Peeter, palun lugege läbi teised kommentaarid. Näib, et mõned inimesed pidid WHERE/HAVING jaoks kasutama teistsugust süntaksit.
Täname teid selle suurepärase artikli eest! Testisin just oma DB koodi ja töötas suurepäraselt!
Douglas, tänan teid selle hämmastava koodi eest. Murdsin pead, kuidas seda oma GPS-i kogukonna portaalis teha. Säästsid mulle tunde.
Tore kuulda, Ash!
täname selle kasuliku artikli postitamise eest,
aga millegipärast tahaks küsida
kuidas saada vahemaa mysql db-s olevate koordinaatide ja kasutaja poolt php-sse sisestatud koordinaatide vahel?
selgemaks kirjeldamiseks:
1.kasutaja peab sisestama [id] määratud andmete valimiseks andmebaasist ja kasutaja enda koordinaatidest
2. php-fail hangib sihtandmed (koordid) kasutades [id] ja arvutab seejärel kasutaja ja sihtpunkti vahelise kauguse
või saate lihtsalt allolevast koodist kauguse?
$qry = "VALI *,(((acos(sin((.$laiuskraad."*pi()/180)) * sin((`Laiuskraad`*pi()/180))+cos((". $laiuskraad.”*pi()/180)) * cos((`Laiuskraad`*pi()/180)) * cos(((.$pikkuskraad.”- `Pikkuskraad`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) kui kaugus 'Minu tabelist' WHERE vahemaa >= ".$ vahemaa." >>>>kas ma saan siit "välja võtta" kauguse?
aitäh veel kord,
Timmy S
Pole tähtis, ma olen aru saanud, kuidas funktsioon php-s töötab
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
tänud!!
ok, kõik, mida olen proovinud, ei tööta. See, mis mul on, töötab, aga vahemaad on kaugel.
Kas keegi saaks näha, mis sellel koodil viga on?
if(isset($_POST['esitatud'])){ $z = $_POST['postiindeks']; $r = $_POST['raadius']; echo "Tulemused ".$z" jaoks; $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. linn,z1.osariik FROM mrk m, zip z1, zip z2 WHERE m.sipcode = z1.zipcode JA z2.sipcode = $z JA (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 <= die ) ) ") (mysql_error()); while($row = mysql_fetch_array( $sql )) { $store1 = $row['MktName'].""; $pood = $rida['LocAddSt'].””; $store .= $row['LocAddCity'].”, ".$row['LocAddState']." “.$row['sihtnumber']; $laiuskraad1 = $rida['lat']; $pikkuskraad1 = $rida['pikk']; $laiuskraad2 = $rida['y1']; $pikkuskraad2 = $rida['x1']; $linn = $rida['linn']; $osariik = $rida['osariik']; $dis = hanki uus($laiuskraad1, $pikkuskraad1, $laiuskraad2, $pikkuskraad2, $ühik = 'Mi'); // $dis = kaugus($lat1, $lon1, $lat2, $lon2); $kinnitatud = $rida['kinnitatud']; if($verified == '1'){ echo ""; echo “”.$store.””; kaja $dis . " miile eemal"; kaja ""; } else { echo “”.$store.””; kaja $dis . " miile eemal"; kaja ""; } }}
minu funktsioonid.php kood
function getnew($laiuskraad1, $pikkuskraad1, $laiuskraad2, $pikkuskraad2, $ühik = 'Mi') { $teeta = $pikkuskraad1 – $pikkuskraad2; $kaugus = (sin(deg2rad($laiuskraad1)) * sin(deg2rad($laiuskraad2))) + (cos(deg2rad($laiuskraad1)) * cos(deg2rad($laiuskraad2)) * cos(deg2rad($teeta)) ); $kaugus = acos($kaugus); $kaugus = rad2deg($kaugus); $kaugus = $kaugus * 60 * 1.1515; switch($ unit) { case 'Mi': break; suurtäht 'Km' : $kaugus = $kaugus * 1.609344; } return (round($distance,2)); }
Tänan ette
Täname teid selle artikli eest. Töötab minu koodiga hästi. 🙂
Tere, Douglas, suurepärane artikkel. Minu arvates oli teie selgitus geograafiliste mõistete ja koodi kohta väga huvitav. Minu ainus soovitus oleks kuvamiseks koodis tühik ja taane jätta (näiteks Stackoverflow). Ma saan aru, et soovite ruumi kokku hoida, kuid tavapärased koodivahed / taanded muudaksid minu kui programmeerija lugemise ja lahkamise palju lihtsamaks. Igatahes on see väike asi. Jätkake samas vaimus.
Aitäh! Olen postitust veidi muutnud... aga võrrandid võtavad nii palju ruumi ja on nii pikad, et ma pole kindel, kas see aitab liiga palju.
Tänan sind väga.
funktsiooniga kasutades saame siin ühte tüüpi kaugust..päringut kasutades saadakse teist tüüpi kaugus
Ma ei arvuta kahe oleku vahelist kaugust
Muchas gracias por tan hermoso codigo…
Seed i head koosinuse funktsioonid. Ma ei tea matemaatikat, aga aitäh!
Suurepärane töö… 🙂 (y)
tundub kiirem (mysql 5.9) kasutada valikus kaks korda valemit ja kus:
$valem = “(((acos(sin((.$laiuskraad.”*pi()/180)) * sin((`Laiuskraad`*pi()/180))+cos((.$laiuskraad. ”*pi()/180)) * cos((`Laiuskraad`*pi()/180)) * cos(((.$pikkuskraad.- `Pikkuskraad`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'VALI *, '.$valem.' kaugusena tabelist WHERE '..$valem.' <= '.$kaugus;
aitäh ...
ei tööta, kui
"KUS kaugus"
töötab, kui
“KAUPA OLEV”
Suur tänu selle artikli lõikamise eest. See on väga kasulik.
PHP loodi algul lihtsa skriptimisplatvormina nimega "Isiklik koduleht". Tänapäeval on PHP (lühend sõnadest Hypertext Preprocessor) Microsofti Active Server Pages (ASP) tehnoloogia alternatiiv.
PHP on avatud lähtekoodiga serveripoolne keel, mida kasutatakse dünaamiliste veebilehtede loomiseks. Selle saab manustada HTML-i. PHP-d kasutatakse tavaliselt Linuxi/UNIXi veebiserverites koos MySQL-i andmebaasiga. See on ilmselt kõige populaarsem skriptikeel.
Avastasin, et ülaltoodud lahendus ei tööta korralikult.
Pean vahetama vastu:
$qqq = “SELECT *,(((acos(sin((.$laiuskraad.*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $laiuskraad . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $pikkuskraad . “- `pikkus`)*pi()/180) )))*180/pi())*60*1.1515) kui kaugus "registrist";
Aitäh Kupendra!
aitäh, härra, et tegin suurepäraselt tööd.. aga mul on üks küsimus, kui ma tahan väljastada ilma komata, siis mida teha..?
Tänud ette.
Tere, palun ma tõesti vajan teie abi.
Esitasin oma veebiserverile hankimistaotluse
53.47792 = $ laiuskraad
-2.23389 = $ pikkuskraad
ja 20 = vahemaa, mille tahan tuua
Kuid teie valemit kasutades hangib see kõik minu db read
$results = DB::select( DB::raw("SELECT *, ((acos(sin((.$laiuskraad.")pi()/180)) * sin((latpi()/180))+cos((.$ laiuskraad.pi()/180)) * cos((latpi()/180)) * cos(((.$pikkuskraad.- lng)pi()/180))))180/pi())601.1515*1.609344) kui kaugus markeritest ON kaugus >= “.$kaugus ));
[{"id":1"name":"Frankie Johnnie & Luigo Too","aadress":"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”,”aadress”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,"distance":16079.175940152},{"id":3,"name":"Kappi pitsabaar ja grill","aadress":"191 Castro St, Mountain View, CA","lat":37.393886566162, "lng":-122.07891845703,"distance":16078.381373826},{"id":4,"name":"Round Table Pizza: Mountain View","aadress":"570 N Shoreline Blvd, Mountain View, CA", ”lat”:37.402652740479,”lng”:-122.07935333252,”kaugus”:16077.420540582},{“id”:5,”nimi”:”Tony & Alba's Pizza & Pasta”,”aadress”:”619 Mountain Escuela Vaade, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”kaugus”:16078.563225154},{“id”:6,”nimi”:”Puine puuküttega pitsa”,”aadress”:”4546 El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”kaugus”:16077.937560795},{“ id":7"nimi":"Baarid ja grillid","aadress":"24 Whiteley Street, Manchester","lat":53.485118865967,"lng":-2.1828699111938,"kaugus":8038.7620112314}]
Ma tahan tuua ainult 20 miili ridu, kuid see toob kõik read. Palun, mida ma valesti teen
Otsin sarnast päringut, kuid tegin veidi hoogu – lühidalt öeldes rühmitan kõik koordinaadid igast koordinaadist 2 miili raadiuses ja seejärel loendan, mitu koordinaati igas rühmas on, ja väljastan ainult ühe rühma, millel on kõige rohkem koordinaate – isegi kui teil on rohkem kui üks rühm rühmade hulgas, millel on kõige rohkem koordinaate – lihtsalt väljastage juhuslik rühm sama arvuga rühmadest -
Tänan teid jagamise eest.