Bu oy men PHP va MySQL-larda GIS bo'yicha dasturlash ishlarini olib bordim. To'r atrofida ko'z yugurtirib, aslida ba'zilarini topishda qiynaldim Geografik hisob-kitoblar ikki joy orasidagi masofani topish uchun shu erda bo'lishishni istadim.
Ikki nuqta orasidagi masofani hisoblashning oddiy usuli - uchburchakning gipotenuzasini (A² + B² = C²) hisoblash uchun Pifagor formulasidan foydalanish. Bu sifatida tanilgan Evklid masofasi.
Bu qiziqarli boshlanish, ammo geografiya bilan bog'liq emas, chunki kenglik va uzunlik chiziqlari orasidagi masofa teng masofa emas alohida. Ekvatorga yaqinlashganda, kenglik chiziqlari bir-biridan uzoqlashadi. Agar siz oddiy uchburchak tenglamasidan foydalansangiz, u Yerning egriligi tufayli masofani bir joyda aniq, ikkinchisida juda noto'g'ri bo'lishi mumkin.
Katta doiradagi masofa
Yer atrofida uzoq masofalarga sayohat qilingan marshrutlar sifatida tanilgan Katta doiradagi masofa. Ya'ni ... sharning ikki nuqtasi orasidagi eng qisqa masofa tekis xaritadagi nuqtalardan farq qiladi. Kenglik va uzunlik chiziqlari teng masofada emasligi bilan buni birlashtiring ... va siz qiyin hisoblashni boshladingiz.
Buyuk doiralar qanday ishlashini fantastik video tushuntirish.
Haversine formulasi
Erning egriligini ishlatadigan masofa Haversin formulasi, bu yerning egriligini ta'minlash uchun trigonometriyadan foydalanadi. Erdagi 2 ta joy orasidagi masofani topayotganda (qarg'a uchib ketgandek), to'g'ri chiziq haqiqatan ham yoydir.
Bu havo parvozlarida qo'llaniladi - siz hech qachon parvozlarning haqiqiy xaritasini ko'rib chiqdingizmi va ularning kemerli ekanligini payqadingizmi? Buning sababi shundaki, to'g'ridan-to'g'ri joyga emas, balki ikki nuqta orasidagi kamonda uchish qisqa.
PHP: Kenglik va uzunlikning 2 punkti orasidagi masofani hisoblang
Qanday bo'lmasin, mana shu ikkita nuqta orasidagi masofani hisoblash uchun PHP formulasi (Mil va Kilometr konversiyalari bilan bir qatorda) ikki kasrga yaxlitlangan.
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));
}
SQL: kenglik va uzunlik yordamida millardagi masofani hisoblab, barcha yozuvlarni oraliqda olish
Barcha yozuvlarni ma'lum masofada topish uchun hisob-kitob qilish uchun SQL-dan foydalanish ham mumkin. Ushbu misolda MyTQL-ga o'zgaruvchan $ masofadan kam yoki teng bo'lgan barcha yozuvlarni topish uchun MySQL-da so'rayman (Milda) mening joylashuvimga $ Enlem va $ longitude:
Muayyan doiradagi barcha yozuvlarni olish uchun so'rov masofa uzunlik va uzunlikning ikki nuqtasi orasidagi masofani mil bilan hisoblash orqali quyidagilar:
$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."
Siz buni sozlashingiz kerak bo'ladi:
- uzunlik - bu PHP o'zgaruvchisi, u erda men nuqta uzunligini o'tayapman.
- $ kenglik - bu PHP o'zgaruvchisi, u erda men nuqta uzunligini o'tayapman.
- $ masofa - bu barcha yozuvlarni kamroq yoki teng topmoqchi bo'lgan masofa.
- stol - bu jadval ... uni jadval nomingiz bilan almashtirishni xohlaysiz.
- kenglik - bu sizning kengligingiz sohasi.
- uzunlik - bu sizning uzunligingiz sohasi.
SQL: kenglik va uzunlik yordamida masofani hisoblab, oralig'idagi barcha yozuvlarni olish
Va MySQL-da kilometrlardan foydalangan holda SQL so'rovi:
$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."
Siz buni sozlashingiz kerak bo'ladi:
- uzunlik - bu PHP o'zgaruvchisi, u erda men nuqta uzunligini o'tayapman.
- $ kenglik - bu PHP o'zgaruvchisi, u erda men nuqta uzunligini o'tayapman.
- $ masofa - bu barcha yozuvlarni kamroq yoki teng topmoqchi bo'lgan masofa.
- stol - bu jadval ... uni jadval nomingiz bilan almashtirishni xohlaysiz.
- kenglik - bu sizning kengligingiz sohasi.
- uzunlik - bu sizning uzunligingiz sohasi.
Men ushbu kodni Shimoliy Amerika bo'ylab 1,000 dan ortiq joylarga ega bo'lgan chakana savdo do'konida foydalangan korporativ xaritalash platformasida ishlatdim va u juda yaxshi ishladi.
Baham ko'rganingiz uchun katta rahmat. Bu nusxa ko'chirish oson edi va juda yaxshi ishlaydi. Siz meni ko'p vaqtni tejab oldingiz.
C-ga ko'chiradigan har bir kishi uchun ma'lumot:
er-xotin deg2rad (er-xotin deg) {qaytish deg * (3.14159265358979323846 / 180.0); }
Juda chiroyli postlar - juda yaxshi ishladi - men faqat stolning uzunligini ushlab stol nomini o'zgartirishim kerak edi. Bu juda tez ishlaydi .. Menda juda oz sonli lat (<400) bor, lekin menimcha bu juda yaxshi miqyosga ega bo'ladi. Yaxshi sayt - men uni del.icio.us hisobimga qo'shganman va muntazam ravishda tekshirib turaman.
Piter va Kerriga katta rahmat! Agar siz GIS loyihalarida ishlashni xohlasangiz, men sizga quyidagilarni tavsiya qilaman:
Katta rahmat ... 😀
Men kun bo'yi masofani hisoblashni qidirib topdim va harversin algoritmini topdim, chunki uni sql bayonotiga qanday qo'yish haqida misol keltirganingiz uchun tashakkur. Rahmat va salom, Doniyor
Yordam berganimdan xursandman, relslar do'stim!
Endi men "Poligonda" PHP funktsiyasini qidirmoqdaman, u ketma-ketlikdagi kenglik va uzunlik koordinatalarini qatorini oladi va boshqa nuqta ko'pburchak ichida yoki tashqarisida ekanligini aniqlaydi.
Men topdim ko'pburchakdagi nuqta ekanligini aniqlash uchun tenglama!
Sizning SQL-ga ega bo'lgan bayonot kerak deb o'ylayman.
WHERE masofa o'rniga <= $ masofa kerak bo'lishi mumkin
masofadan HAVING <= $ masofadan foydalaning
aks holda menga ko'p vaqt va kuch sarflaganingiz uchun tashakkur.
Salom David,
Agar siz biron bir turdagi GROUP BY bayonotini bajarayotgan bo'lsangiz, sizga HAVING kerak bo'ladi. Men buni yuqoridagi misolda qilmayapman.
Doug
MySQL 5.x dan boshlab, "WHERE" bandidagi taxallusdan foydalana olmaysiz http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Yuqoridagi so'rovlarda WHERE o'rniga HAVING dan foydalaning
Kattakon rahmat. Siz juda zo'r ish qildingiz, bu men xohlagan narsadir. Katta rahmat.
Ushbu kodni baham ko'rganingiz uchun katta rahmat. Bu menga rivojlanish vaqtini tejadi. Bundan tashqari, MySQL 5.x uchun HAVING bayonoti zarurligini ta'kidlaganligi uchun o'quvchilaringizga rahmat. Juda foydali.
O'quvchilarim mendan ancha aqlli ekanligi menga muborak!
🙂
Yuqoridagi formula menga ko'p vaqtni tejashga yordam beradi. Kattakon rahmat.
Bundan tashqari, NMEA formati va Degrees o'rtasida o'tishim kerak. Sahifaning pastki qismida ushbu URL manzilidan formulani topdim. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Buni qanday tekshirishni biladimi?
Rahmat!
Garri
Salom,
Yana bir savol. Quyidagi kabi NMEA satrlari uchun formula bormi?
1342.7500, N, 10052.2287, E.
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Thanks,
Garri
Shuningdek, Qaerda men uchun ishlamaganligini aniqladim. HAVING-ga o'zgartirdi va hamma narsa mukammal ishlaydi. Avvaliga sharhlarni o'qimadim va ichki tanlov yordamida qayta yozdim. Ikkalasi ham yaxshi ishlaydi.
Mysql-da yozilgan stsenariy uchun katta rahmat, shunchaki ozgina o'zgartirishlar kiritishga to'g'ri keldi (HAVING) 🙂
Gret ish
Ajablanarlisi foydali, katta rahmat! Menda "QAYERDA" emas, balki yangi "HAVING" bilan bog'liq muammolar bor edi, lekin bir marta bu erda sharhlarni o'qidim (umidsizlik bilan tishimni tishlaganimdan yarim soat keyin = P), men uni yaxshi ishladim. Rahmat ^ _ ^
katta rahmat juda yaxshi ishlaydi
Shuni yodda tutingki, shunga o'xshash tanlangan bayonot juda kuchli va shuning uchun sekin bo'ladi. Agar sizda bunday so'rovlar ko'p bo'lsa, u bu ishni tezda tezda hal qilishi mumkin.
Hisoblangan masofa bilan aniqlangan SQUARE maydonidan foydalangan holda birinchi (xom) tanlovni o'tkazish juda kam intensiv yondashuv, ya'ni "tab1 nomidan * ni tanlang, bu erda lat2 va lat1 orasidagi kenglik va lon2 va lon1 orasidagi uzunlik uchun". lat2 = targetlatitude - latdiff, lat111 = targetlatitude + latdiff, lon bilan o'xshash. latdiff ~ = masofa / 69 (km uchun) yoki masofa / 1 milya uchun 111 daraja kenglik ~ 2 km (yer biroz oval bo'lgani uchun ozgina o'zgarish, lekin bu maqsad uchun etarli). londiff = masofa / (abs (cos (deg111rad (kenglik)) * 69)) - yoki 180 milya (farqlarni hisobga olish uchun aslida biroz kattaroq kvadrat olish mumkin). Keyin natijani oling va uni radial tanlovga o'tkazing. Faqat chegaradan tashqaridagi koordinatalarni hisobga olishni unutmang - ya'ni qabul qilinadigan uzunlik oralig'i -180 dan +90 gacha va qabul qilinadigan kenglik oralig'i -90 dan +XNUMX gacha - agar sizning latdiff yoki londiff ushbu diapazondan tashqarida bo'lsa. . E'tibor bering, aksariyat hollarda bu qo'llanilishi mumkin emas, chunki u faqat tinch okean orqali qutbdan qutbgacha bo'lgan chiziq bo'ylab hisob-kitoblarga ta'sir qiladi, garchi u chukotka va Alyaskaning bir qismi bilan kesishadi.
Bunga erishganimiz, siz ushbu hisob-kitobni amalga oshiradigan ball sonining sezilarli darajada kamayishi. Agar sizda ma'lumotlar bazasida millionga teng global nuqta teng ravishda taqsimlangan bo'lsa va siz 100 km ichida qidirishni xohlasangiz, unda sizning birinchi (tezkor) qidiruvingiz 10000 kv km maydonni tashkil etadi va ehtimol 20 ga yaqin natijani beradi (teng taqsimot asosida yuzasi 500 million kv. km), demak, siz ushbu so'rov uchun million marta emas, balki 20 marta murakkab masofani hisoblab chiqasiz.
Misoldagi kichik xato ... bu bizning 50 kvadrat (100 emas) masofada bo'lishi kerak edi, chunki biz… kvadratimizning “radiusi” ga qarab turibmiz.
Ajoyib maslahat! Men aslida ichki kvadratni tortadigan funktsiyani yozgan ishlab chiquvchi bilan ishladim, so'ngra qolgan nuqtalarni qo'shish va chiqarib tashlash uchun perimetr atrofida "kvadratchalar" yasagan rekursiv funktsiya. Natijada nihoyatda tez natija bo'ldi - u mikrosaniyadagi millionlab fikrlarni baholay oldi.
Yuqoridagi yondashuvim, albatta, "qo'pol", ammo qobiliyatli. Yana bir bor rahmat!
Dag,
Lat uzun nuqtasi ko'pburchak ichida ekanligini tekshirish uchun mysql va php dan foydalanishga harakat qilyapman. Bilasizmi, ishlab chiquvchi do'stingiz ushbu vazifani qanday bajarish haqida biron bir misol nashr etgan. Yoki yaxshi misollarni bilasizmi. Oldindan rahmat.
Barchalarga salom, bu mening test SQL bayonotim:
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
va Mysql menga bu masofani aytadiki, ustun sifatida mavjud emas, men buyurtma bo'yicha foydalanishingiz mumkin, buni QAYERNI qilmasdan qila olaman va u ishlaydi, lekin u bilan emas ...
"WHERE masofasi" ni "HAVING masofasi" bilan almashtiring.
Jozibasi kabi ishlaydi, rahmat, Duglas!
Bu juda yaxshi, ammo xuddi qushlar uchib ketgandek. Buning uchun google maps API-ni qandaydir tarzda kiritish (ehtimol yo'llar va h.k.) uchun harakat qilish juda yaxshi bo'lardi (boshqa yo'llar bilan transport vositasi yordamida fikr bildirish uchun). Men hali ham PHP-da sayohat qiladigan sotuvchi muammosiga samarali echim topishga qodir bo'lgan simulyatsiya qilingan tavlanish funktsiyasini bajarganim yo'q. Ammo buning uchun sizning kodingizning bir qismini qayta ishlata olaman deb o'ylayman.
Salom Duglas,
ushbu maqola uchun sizga katta rahmat - siz meni ko'p vaqtni tejab oldingiz.
qayg'urmoq; o'zini ehtiyot qilmoq,
nimrod @Isroil
Yaxshi maqola! Ikki nuqta orasidagi masofani qanday hisoblashni tavsiflovchi ko'plab maqolalarni topdim, lekin men SQL parchasini qidirib topdim.
Rahmat juda yaxshi ishlaydi
Ushbu formula uchun sizga katta rahmat. Menga ovqat yeyayotgan do'konning joylashuvi loyihasida bir oz vaqt soqol oldi.
Bir to'plam uchun rahmat. Ushbu kichik kod satri do'konni joylashtirish loyihasida ancha vaqtni tejab qoldi!
# 1054 - noma'lum ustun "masofa" "qaerda band"
tasdiqlang
Bu ham xuddi o'sha! Muammo nimada :-/? "masofa" ni qanday hal qilish kerak - Ustun muammosi? Bizga yordam bering, iltimos !! 🙂
WHERE o'rniga HAVING dan foydalanib ko'ring
Nihoyat mening muammomni hal qiladigan ushbu sahifani topish uchun 2 kunlik izlanishlar. Men WolframAlpha-ni o'chirib tashlaganim va matematikani yaxshilaganim ma'qul. WHERE-dan HAVING-ga o'tish mening skriptimni ish tartibida. RAHMAT
WHERE bandining o'rniga:
Masofa <50
Rahmat Georgi. Men "masofa" ustunini topolmadim Bir marta QAYERNI HAVINGga o'zgartirgan bo'lsam, u joziba kabi ishladi!
Men bu erda topgan birinchi sahifam bo'lishini xohlayman. Turli xil buyruqlarni sinab ko'rgandan so'ng, bu to'g'ri ishlaydigan yagona narsa edi va minimal ma'lumotlar bilan mening ma'lumotlar bazamga mos kelishim kerak edi.
Katta rahmat!
Men bu erda topgan birinchi sahifam bo'lishini xohlayman. Turli xil buyruqlarni sinab ko'rgandan so'ng, bu to'g'ri ishlaydigan yagona narsa edi va minimal ma'lumotlar bilan mening ma'lumotlar bazamga mos kelishim kerak edi.
Katta rahmat!
Katta rahmat!
Katta rahmat!
Kod endi paydo bo'lmaydi deb o'ylayman. Ehtimol, bu firefoxdir?
Men faqat Firefox va Chrome-da sinab ko'rdim va u paydo bo'ldi. Qayta urinib ko'ring?
Salom. Katta rahmat. Bu joziba kabi ishlaydi.
Duglasga katta rahmat. Bu juda yaxshi ishlamoqda.
Men ushbu formulaning ishlashini bilaman, lekin erning radiusi qaerda hisobga olinishini ko'ra olmayapman. Iltimos, kimdir meni yoritib bera oladimi?
Tim, Haversine formulasini to'liq tushuntirish uchun (bu kod emas), Vikipediyaning maqolasini tekshiring: http://en.wikipedia.org/wiki/Haversine_formula
Chiroyli! Bu menga juda katta yordam berdi!
Duglas ajoyib narsalar. Ikkala nuqtaning uzun / lat / rulmani berilgan kesishish nuqtasini olishga harakat qildingizmi?
Hali buni qilmaganmisiz, Xanx!
Duglasga rahmat, SQL so'rovi aynan menga kerak edi va men uni o'zim yozishim kerak deb o'yladim. Siz meni kenglik uzunligini o'rganish egri chizig'idan saqladingiz!
Men "Errormessage" ni olishni davom ettirmoqdaman: MySQL so'rovidagi "qaerda" bandidagi "masofa" noma'lum ustun.
Piter, iltimos, boshqa sharhlarni o'qing. Ko'rinib turibdiki, ba'zi odamlar WHERE / HAVING uchun boshqa sintaksisdan foydalanishlari kerak edi.
Ushbu ajoyib maqola uchun tashakkur! Kodni mening JB-da sinab ko'rdim va juda yaxshi ishladim!
Duglas, ushbu ajoyib kod uchun tashakkur. Buni qanday qilish kerakligi haqida mening GPS jamoat portalimda boshimni qirib tashladim. Meni soatlab tejab oldingiz.
Eshitish juda yaxshi, Esh!
ushbu foydali maqolani joylashtirganingiz uchun tashakkur,
lekin negadir so'ramoqchiman
mysql db ichidagi koordinatalar va foydalanuvchi tomonidan php-ga kiritilgan koordinatlar orasidagi masofani qanday olish kerak?
aniqroq ta'riflash uchun:
1. foydalanuvchi JB va foydalanuvchining o'zi koordinatalaridan ma'lum ma'lumotlarni tanlash uchun [id] qo'shishi kerak
2. php fayli [id] yordamida maqsadli ma'lumotlarni (koordinatalarni) oladi va undan keyin foydalanuvchi va maqsad nuqtasi orasidagi masofani hisoblaydi
yoki shunchaki quyidagi koddan masofani bosib o'tishi mumkinmi?
$ qry = “SELECT *, (((acos (sin ((.. $ Enlem." * pi () / 180)) * sin ((`Latitude` * pi () / 180)) + cos ((". $ kenglik. ”* pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((". $ longitude." - "Boylam") * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) masofa sifatida "MyTable` QAYERDA masofa> =“. $ Masofa. " >>>> bu erdan masofani "olib chiqib" olsam bo'ladimi?
yana bir bor rahmat,
Timmi S
Hechqisi yo'q, men "funktsiya" ning php-da qanday ishlashini aniqladim
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
katta rahmat!!
ok, sinab ko'rganlarimning barchasi ishlamayapti Aytmoqchimanki, menda nima bor, lekin masofalar juda uzoq.
Ehtimol, kimdir ushbu kodda nima noto'g'ri ekanligini ko'rishi mumkinmi?
agar (isset ($ _ POST ['topshirilgan'])) {$ z = $ _POST ['zipcode']; $ r = $ _POST ['radius']; echo "" uchun natijalar. $ 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. shahar, z1.state mrk m, zip z1, zip z2 QAYERDA 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 ") yoki die (mysql_error ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. ""; $ store = $ row ['LocAddSt']. ””; $ store. = $ row ['LocAddCity']. ",". $ row ['LocAddState']. " “. $ Row ['zipcode']; $ Enlem1 = $ qator ['lat']; $ longitude1 = $ row ['lon']; $ Enlem2 = $ qator ['y1']; $ longitude2 = $ row ['x1']; $ city = $ row ['city']; $ state = $ row ['state']; $ dis = getnew ($ Enlem1, $ uzunlik1, $ kenglik2, $ uzunlik2, $ birlik = 'Mi'); // $ dis = masofa ($ lat1, $ lon1, $ lat2, $ lon2); $ verified = $ qator ['tasdiqlangan']; if ($ verified == '1') {echo “”; echo “”. $ store. ””; echo $ dis. ”Mil (lar) uzoqlikda”; echo “”; } else {echo "". $ store. ""; echo $ dis. ”Mil (lar) uzoqlikda”; echo “”; }}}
mening functions.php kodi
getnew funktsiyasi ($ Enlem1, $ uzunlik1, $ kenglik2, $ uzunlik2, $ birlik = 'Mi') {$ theta = $ uzunlik1 - $ uzunlik2; $ masofa = (sin (deg2rad ($ Enlem1)) * sin (deg2rad ($ Enlem2)))) + (cos (deg2rad ($ Enlem1))) * cos (deg2rad ($ Enlem2))) * cos (deg2rad ($ theta)) ); $ masofa = acos ($ masofa); $ masofa = rad2deg ($ masofa); $ masofa = $ masofa * 60 * 1.1515; switch ($ unit) {case 'Mi': break; ish 'Km': $ masofa = $ masofa * 1.609344; } return (round ($ masofa, 2)); }
Oldindan rahmat
Ushbu maqola uchun tashakkur. Mening kodim bilan yaxshi ishlash. 🙂
Hey Duglas, ajoyib maqola. Sizning geografik tushunchalaringiz va kodingiz haqidagi tushuntirishlaringiz juda qiziq tuyuldi. Mening yagona taklifim bo'sh joyni ko'rsatish va kodni indentatsiya qilish (masalan, Stackoverflow kabi). Siz bo'sh joyni tejashni xohlayotganingizni tushunaman, lekin odatdagi kodlar oralig'i / chuqurchasi men uchun dasturchi sifatida o'qish va ajratishni ancha osonlashtirar edi. Qanday bo'lmasin, bu kichik narsa. Katta ishni davom ettiring.
Rahmat! Men xabarni biroz o'zgartirdim ... lekin tenglamalar shunchalik ko'p joy egallaydi va shu qadar uzunki, bu juda ko'p yordam berishiga amin emasman.
Sizga katta rahmat.
Bu erda funktsiyadan foydalanishda biz masofaning bir turini olamiz ... so'rovdan foydalanganda boshqa masofadagi masofani so'raymiz
Men ikki holat orasidagi masofani hisoblamayman
Muchas gracias por tan hermoso codigo…
Bu kosinusning yaxshi funktsiyalari. Men matematikani bilmayman, lekin rahmat!
Ajoyib ish ... 🙂 (y)
ni tanlang va qaerda ikki marta formuladan foydalanish tezroq ko'rinadi (mysql 5.9):
$ formula = "(((acos (sin ((.. $ Enlem." * pi () / 180)) * sin ((`Latitude` * pi () / 180)) + cos ((". $ Enlem. ”* Pi () / 180)) * cos ((" Latitude` * pi () / 180)) * cos (((". $ Boylam." - "Boylam") * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) »;
$ sql = 'SELECT *,'. $ formula. ' 'WHERE' jadvalidan masofa sifatida '.. $ formulasi.' <= '. $ masofa;
rahmat ...
agar ishlamasa
"Qaerda masofa"
agar ishlasa
"Masofani bosib o'tish"
Ushbu maqolani qirqganingiz uchun katta rahmat, bu juda foydali.
Dastlab PHP "Shaxsiy uy sahifasi" deb nomlangan oddiy skript platformasi sifatida yaratilgan. Hozirgi kunda PHP (gipermatnli protsessor uchun qisqartma) Microsoft-ning Active Server Pages (ASP) texnologiyasining alternativasi hisoblanadi.
PHP - bu dinamik veb-sahifalarni yaratish uchun ishlatiladigan ochiq manba server tilidir. U HTML-ga joylashtirilishi mumkin. PHP odatda Linux / UNIX veb-serverlarida MySQL ma'lumotlar bazasi bilan birgalikda qo'llaniladi. Bu, ehtimol, eng mashhur skript tilidir.
Yuqoridagi echimni to'g'ri ishlamayotganligini topdim.
Menga o'zgartirish kerak:
$ qqq = "SELECT *, (((acos (sin ((.. $ Enlem." * pi () / 180)) * sin ((`latt` * pi () / 180)) + cos (("). $ kenglik. "* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((". $ longitude." - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) masofa sifatida 'registr` “;
Rahmat Kupendra!
rahmat janob juda yaxshi silamoqdalar .. lekin bitta savolim bor, agar men kasrsiz chiqarishni xohlasam, nima qilsam bo'ladi ..?
Oldindan rahmat.
Assalomu alaykum, iltimos, bu borada sizning yordamingizga juda muhtojman.
Men veb-serverimga kirishni so'radim http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $ kenglik
-2.23389 = uzunlik
va 20 = men olishni istagan masofa
Ammo siz formuladan foydalangan holda, u mening db-dagi barcha qatorlarni oladi
$ natijalar = DB :: tanlang (DB :: xom ("SELECT *, (((acos (sin ((.. $ Enlem." * pi () / 180)) * sin ((lat * pi () / 180) )) + cos ((“. $ Enlem.” * pi () / 180)) * cos ((lat * pi () / 180)) * cos (((“. $ longitude.” - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) masofadan FROM markerlardan HAVING masofa> = “. $ Masofa));
[{"Id": 1, "ism": "Frankie Johnnie & Luigo Too", "manzil": "939 Vt El Camino Real, Mountain View, CA", "lat": 37.386337280273, "lng": - 122.08582305908, "Masofa": 16079.294719663}, {"id": 2, "name": "Amici's East Coast Pizzeria", "address": "790 Castro St, Mountain View, CA", "lat": 37.387138366699, "lng": -122.08323669434, "masofa": 16079.175940152}, {"id": 3, "name": "Kapp's Pizza Bar & Grill", "address": "191 Castro St, Mountain View, CA", "lat": 37.393886566162, "Lng": - 122.07891845703, "masofa": 16078.381373826}, {"id": 4, "name": "Round Table Pizza: Mountain View", "address": "570 N Shoreline Blvd, Mountain View, CA", "Lat": 37.402652740479, "lng": - 122.07935333252, "masofa": 16077.420540582}, {"id": 5, "name": "Tony & Alba's Pizza & Pasta", "manzil": "Escuela xiyoboni, 619 View, CA "," lat ": 37.394012451172," lng ": - 122.09552764893," masofa ": 16078.563225154}, {" id ": 6," name ":" Oregano's Wood-Fired Pizza "," address ":" 4546 El Camino Real, Los Altos, Kaliforniya "," lat ": 37.401725769043," lng ": - 122.11464691162," masofa ": 16077.937560795}, {" id ": 7," ism ":" Barlar va panjaralar "," manzil ":" Uaytli ko'chasi, 24-uy "," lat ": 53.485118865967," lng ": - 2.1828699111938," masofa ": 8038.7620112314}]
Men faqat 20 millik qatorlarni olmoqchiman, lekin u barcha qatorlarni olib keladi. Iltimos, men nima qilyapman?