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 masofalar 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 ... shardagi ikkita nuqta orasidagi eng qisqa masofa tekis xaritadagi nuqtalardan farq qiladi. Buni kenglik va uzunlik chiziqlari bir xil masofada emasligi bilan birlashtiring... va sizda qiyin hisob bor.
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
Mana ikki nuqta orasidagi masofani hisoblash uchun PHP formulasi (Mile va Kilometrga aylantirish bilan birga) ikkita 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));
}
O'zgaruvchilar quyidagilardir:
- $Latitude1 – birinchi joylashuvingizning kengligi uchun o‘zgaruvchi.
- $ Longitude1 – birinchi joylashuvingizning uzunligi uchun o‘zgaruvchi
- $Latitude2 – ikkinchi joylashuvingizning kengligi uchun oʻzgaruvchi.
- $ Longitude2 – ikkinchi joylashuvingizning uzunligi uchun oʻzgaruvchi.
- $ birlik – standart mavjudlik milya. Bu yangilanishi yoki o'tkazilishi mumkin kilometr.
Python: 2 kenglik va uzunlik nuqtasi orasidagi masofani hisoblang
Qanday bo'lmasin, bu erda ikkita nuqta orasidagi masofani hisoblash uchun Python formulasi (Mile va Kilometrga aylantirish bilan birga) ikkita kasrga yaxlitlangan. Ma'lumot olimi bo'lgan o'g'lim Bill Karrga kredit OpenINSIGHTS, kod uchun.
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)
O'zgaruvchilar quyidagilardir:
- kenglik1 – birinchi joylashuvingiz uchun o‘zgaruvchi kenglik.
- uzunlik 1 – birinchi joylashuvingiz uchun o‘zgaruvchi uzunlik
- kenglik2 – ikkinchi joylashuvingiz uchun oʻzgaruvchi kenglik.
- uzunlik 2 – ikkinchi joylashuvingiz uchun oʻzgaruvchi uzunlik.
- birlik – standart mavjudlik milya. Bu yangilanishi yoki o'tkazilishi mumkin kilometr.
MySQL: kenglik va uzunlikdan foydalangan holda millardagi masofani hisoblash orqali barcha yozuvlarni diapazonda 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.
MySQL: kenglik va uzunlikdan foydalanib, kilometrlarda masofani hisoblash orqali barcha yozuvlarni diapazonda 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.
Microsoft SQL Server geografik masofa: STDistance
Agar siz Microsoft SQL Server dan foydalansangiz, ular o'z funksiyalarini taklif qiladilar, ST masofa Geografiya ma'lumotlar turidan foydalangan holda ikki nuqta orasidagi masofani hisoblash uchun.
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);
VP va arxitektori Manash Sahooga shapka uchi Highbridge.
Baham ko'rganingiz uchun katta rahmat. Bu oson nusxa ko'chirish va joylashtirish ishi va ajoyib ishlaydi. Siz menga ko'p vaqtni tejadingiz.
C ga o'tadigan har bir kishi uchun ma'lumot:
double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }
Juda yaxshi nashr - juda yaxshi ishladi - men faqat uzunlikni ushlab turgan stol nomini o'zgartirishim kerak edi. Bu juda tez ishlaydi.. Menda juda oz sonli lat-longs bor (<400), lekin menimcha, bu yaxshi miqyosda bo'ladi. Yaxshi sayt - men uni hozirgina del.icio.us akkauntimga qo'shdim va muntazam ravishda tekshirib turaman.
Piter va Kerriga katta rahmat! Agar siz GIS loyihalarida ishlashni yoqtirsangiz, men tavsiya qilaman:
Katta rahmat... 😀
Men kun bo'yi masofaviy hisob-kitoblarni qidirdim va uni sql bayonotiga qanday qo'yish haqida misol keltirganingiz uchun rahmat, harversine algoritmini topdim. Rahmat va salom, Daniel
Yordam berganimdan xursandman, do'stim!
Endi men kenglik va uzunlik koordinatalarining ketma-ketligini oladigan va boshqa nuqta ko‘pburchak ichida yoki tashqarisida ekanligini aniqlaydigan “Polygonda” PHP funksiyasini qidiryapman.
Men topdim ko'pburchakdagi nuqta borligini aniqlash uchun tenglama!
Menimcha, sizning SQL-ga ega bo'lgan bayonot kerak.
o'rniga WHERE masofa <= $distance kerak bo'lishi mumkin
HAVING masofasidan foydalaning <= $distance
aks holda menga ko'p vaqt va energiyani tejaganingiz uchun rahmat.
Salom David,
Agar siz GROUP BY iborasining har qanday turini bajarayotgan bo'lsangiz, sizga HAVING kerak bo'ladi. Yuqoridagi misolda men buni qilmayapman.
Doug
MySQL 5.x dan boshlab, WHERE bandida taxallusdan foydalana olmaysiz, qarang http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Yuqoridagi soʻrovlarda WHERE oʻrniga HAVING dan foydalaning
Sizga katta rahmat. Siz juda yaxshi ish qildingiz, men shuni xohlayman. Katta rahmat.
Ushbu kodni baham ko'rganingiz uchun katta rahmat. Bu menga rivojlanish uchun ko'p vaqtni tejaydi. Shuningdek, MySQL 5.x uchun HAVING bayonoti zarurligini ta'kidlagan o'quvchilaringizga rahmat. Juda foydali.
Mendan ko'ra aqlliroq o'quvchilarim borligidan baxtiyorman!
🙂
Yuqoridagi formula menga ko'p vaqtni tejaydi. Sizga katta rahmat.
Shuningdek, NMEA formati va darajalar o'rtasida o'tishim kerak. Men sahifaning pastki qismidagi ushbu URL manzilida formula topdim. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Buni qanday tekshirishni kimdir 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, WHERE men uchun ishlamaganligini ham topdim. Uni HAVING ga o'zgartirdi va hamma narsa mukammal ishlaydi. Avvaliga men sharhlarni o'qimadim va uni ichki tanlov yordamida qayta yozdim. Ikkalasi ham yaxshi ishlaydi.
MySQL-da yozilgan skript uchun katta rahmat, ozgina o'zgartirishlar kiritish kerak edi (BO'LADI) 🙂
Assalomu alaykum
Ajablanarli darajada foydali, sizga katta rahmat! Menda “QAYER” emas, balki yangi “HAVING” bilan bog‘liq muammolar bor edi, lekin bir marta bu yerda sharhlarni o‘qib chiqdim (taxminan yarim soatlik umidsizlikdan tishlarimni g‘ijirlaganimdan keyin =P), men uni yaxshi ishladim. Rahmat ^_^
ko'p rahmat ajoyib ishlaydi
Shuni yodda tutingki, bunday tanlangan bayonot juda zich va shuning uchun sekin bo'ladi. Agar sizda bunday so'rovlar juda ko'p bo'lsa, u narsalarni tezda buzishi mumkin.
Ancha intensiv yondashuv hisoblangan masofa bilan aniqlangan Kvadrat maydoni yordamida birinchi (xom) tanlashni o‘tkazishdir, ya’ni “jadval nomidan * ni tanlang, bu erda kenglik lat1 va lat2 oralig‘ida, uzunlik esa lon1 va uzun2 orasida bo‘ladi”. lat1 = nishon kenglik - latdiff, lat2 = nishon kenglik + latdiff, lon bilan o'xshash. latdiff ~= masofa / 111 (km uchun) yoki masofa/69 mil uchun, chunki 1 daraja kenglik ~ 111 km (bir oz o'zgarish, chunki yer biroz oval, ammo bu maqsad uchun etarli). londiff = masofa / (abs(cos(deg2rad(kenglik))*111)) - yoki mil uchun 69 (aslida farqlarni hisobga olish uchun biroz kattaroq kvadrat olishingiz mumkin). Keyin natijani oling va uni radial tanlovga kiriting. Chegaradan tashqaridagi koordinatalarni hisobga olishni unutmang - ya'ni qabul qilinadigan uzunlik diapazoni -180 dan +180 gacha va qabul qilinadigan kenglik diapazoni -90 dan +90 gacha - agar sizning latdiffingiz yoki londiffingiz ushbu diapazondan tashqarida bo'lsa. . E'tibor bering, ko'p hollarda bu qo'llanilmasligi mumkin, chunki u faqat Tinch okeani orqali qutbdan qutbgacha bo'lgan chiziq bo'ylab hisob-kitoblarga ta'sir qiladi, garchi u Chukotkaning bir qismi va Alyaskaning bir qismini kesib o'tsa ham.
Bu bilan biz erishgan narsa bu hisob-kitoblarni amalga oshiradigan ballar sonini sezilarli darajada kamaytirishdir. Agar sizda ma'lumotlar bazasida millionlab global nuqtalar taxminan teng taqsimlangan bo'lsa va siz 100 km ichida qidirmoqchi bo'lsangiz, sizning birinchi (tezkor) qidiruvingiz 10000 kv.km maydonni egallaydi va ehtimol 20 ga yaqin natija beradi (bir tekis taqsimlanish asosida). sirt maydoni taxminan 500M sq km), ya'ni siz ushbu so'rov uchun murakkab masofa hisobini million marta o'rniga 20 marta bajarasiz.
Misoldagi kichik xatolik ... bu 50 km (100 emas) uchun bo'ladi, chunki biz ... kvadratimizning "radiusiga" qaraymiz.
Ajoyib maslahat! Men aslida ichki kvadratni tortuvchi funktsiyani va keyin qolgan nuqtalarni kiritish va chiqarib tashlash uchun perimetr atrofida "kvadratchalar" hosil qiluvchi rekursiv funktsiyani yozgan ishlab chiquvchi bilan ishladim. Natija nihoyatda tez natija bo'ldi - u mikrosoniyalarda millionlab balllarni baholay oldi.
Yuqoridagi yondashuvim, albatta, "qo'pol", ammo qobiliyatli. Yana bir bor rahmat!
Dag,
Men lat uzun nuqta ko'pburchak ichida ekanligini baholash uchun MySQL va PHP dan foydalanishga harakat qildim. Sizning ishlab chiquvchi do'stingiz ushbu vazifani qanday bajarish bo'yicha biron bir misolni nashr etganligini bilasizmi? Yoki yaxshi misollarni bilasizmi? Oldindan rahmat.
Hammaga 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 aytadi, ustun sifatida mavjud emas, men buyurtmani ishlatishim mumkin, men buni WHERE holda qila olaman va u ishlaydi, lekin u bilan emas ...
“QAYERDAN masofa” so‘zini “HAVING masofa” bilan almashtiring.
Jozibasi kabi ishlaydi, rahmat, Duglas!
Bu juda zo'r, ammo qushlar uchayotgandek. Boshqa transport turidan foydalanish haqida fikr bildirish uchun Google Maps API-ni qandaydir tarzda (ehtimol yo'llardan foydalanish va h.k.) sinab ko'rish va qo'shish ajoyib bo'lar edi. Men hali ham PHP-da sayohatchi sotuvchi muammosiga samarali yechim taklif qila oladigan simulyatsiya qilingan yumshatish funktsiyasini yaratmadim. Lekin o'ylaymanki, buning uchun kodingizning bir qismini qayta ishlatishim mumkin.
Salom Duglas,
ushbu maqola uchun katta rahmat - siz menga juda ko'p vaqtni tejadingiz.
qayg'urmoq; o'zini ehtiyot qilmoq,
nimrod @Isroel
Yaxshi maqola! Ikki nuqta orasidagi masofani qanday hisoblashni tavsiflovchi ko'plab maqolalarni topdim, lekin men haqiqatan ham SQL parchasini qidirdim.
Ko'p rahmat yaxshi ishlaydi
Ushbu formula uchun sizga katta rahmat. Bu menga ovqat edi bir do'kon joy loyihasi ustida bir oz vaqt soqolini.
Bir to'plamga rahmat. Ushbu kichik kod qatori menga do'konni joylashtirish loyihasida ancha vaqtni tejab qoldi!
№1054 – “qaerda” bandidagi “masofa” noma’lum ustuni
tasdiqlang
Bu ham xuddi o'sha! Muammo nimada :-/? "masofa" ni qanday hal qilish mumkin - 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 tadqiqot. Men WolframAlpha-ni o'chirib, matematikani chuqurroq o'rganganim ma'qul. WHERE dan HAVING ga o'zgartirish mening skriptim ish tartibiga ega. RAHMAT
WHERE bandi o'rniga:
Masofa <50
Rahmat Georgi. Menga "masofa" ustuni topilmadi. Bir marta men QAYER ni HAVINGga o'zgartirsam, u jozibali ishladi!
Bu men topgan birinchi sahifa boʻlishini istardim. Ko'p turli xil buyruqlarni sinab ko'rganimdan so'ng, bu yagona to'g'ri ishladi va o'z ma'lumotlar bazasiga mos kelishi uchun minimal o'zgarishlar kerak edi.
Katta rahmat!
Bu men topgan birinchi sahifa boʻlishini istardim. Ko'p turli xil buyruqlarni sinab ko'rganimdan so'ng, bu yagona to'g'ri ishladi va o'z ma'lumotlar bazasiga mos kelishi uchun minimal o'zgarishlar kerak edi.
Katta rahmat!
Katta rahmat!
Katta rahmat!
Kod endi ko'rinmaydi deb o'ylamayman. Balki bu Firefoxdir?
Men Firefox va Chrome-da sinab ko'rdim va u paydo bo'ldi. Qayta urinib ko'ring?
Salom. Katta rahmat. Bu joziba kabi ishlaydi.
Katta rahmat Duglas. Bu mukammal ishlaydi.
Men bu formula ishlayotganini bilaman, lekin yerning radiusi qayerda hisobga olinayotganini ko‘ra olmayapman. Iltimos, kimdir meni yoritib bera oladimi?
Tim, Haversine formulasini to'liq tushuntirish uchun (bu kod emas), Vikipediya maqolasiga qarang: http://en.wikipedia.org/wiki/Haversine_formula
Chiroyli! Bu menga juda yordam berdi!
Ajoyib narsa Duglas. Ikki nuqtaning uzun/kechikligi/rulmanini hisobga olgan holda kesishish nuqtasini olishga harakat qildingizmi?
Hali buni qilmaganman, Khanh!
Rahmat Duglas, SQL so'rovi aynan menga kerak bo'lgan narsa va men buni o'zim yozishim kerak deb o'yladim. Siz meni bir necha soatlik kenglik uzunliklarini o'rganish egri chizig'idan qutqardingiz!
Men xato xabarini olishda davom etaman: MySQL so'rovidagi "qaerda" bandidagi "Masofa" noma'lum ustuni.
Piter, iltimos, boshqa sharhlarni o'qing. Ko'rinishidan, ba'zi odamlar WHERE/HAVING uchun boshqa sintaksisdan foydalanishlari kerak edi.
Ushbu ajoyib maqola uchun rahmat! Kodni faqat ma'lumotlar bazasida sinab ko'rdim va juda yaxshi ishladim!
Duglas, ushbu ajoyib kod uchun rahmat. GPS hamjamiyat portalida buni qanday qilish kerakligi haqida boshimni yirtib tashladim. Siz menga soatlarni tejadingiz.
Eshitganim ajoyib, Ash!
ushbu foydali maqolani joylashtirganingiz uchun tashakkur,
lekin negadir so'ramoqchiman
mysql db ichidagi koordinatalar va foydalanuvchi tomonidan PHP ga kiritilgan koordinatalar orasidagi masofani qanday olish mumkin?
aniqroq tavsiflash uchun:
1.foydalanuvchi JB va foydalanuvchining oʻzi koordinatalaridan belgilangan maʼlumotlarni tanlash uchun [id] ni kiritishi kerak
2.PHP fayli [id] yordamida maqsadli maʼlumotlarni (koordlarni) oladi, soʻngra foydalanuvchi va maqsadli nuqta orasidagi masofani hisoblab chiqadi.
yoki shunchaki quyidagi koddan masofani olish mumkinmi?
$qry = “SELECT *,(((acos(sin((“.$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((". $kenglik.”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos(((“.$uzunlik.”- `Boylik`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) `Mening jadvalim` dan masofa sifatida WHERE masofa >= “.$distance”. >>>>Bu yerdan masofani "olib tashlasam" bo'ladimi?
yana bir bor rahmat,
Timmi S
Hechqisi yo'q, men "funksiya" PHP da qanday ishlashini tushundim
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
katta rahmat!!
OK, men sinab ko'rgan hamma narsa ishlamayapti. Aytmoqchimanki, menda bor narsa ishlaydi, lekin masofalar juda uzoqda.
Kimdir bu kod bilan nima noto'g'ri ekanligini ko'rishi mumkinmi?
if(isset($_POST['submitted'])){ $z = $_POST['post kodi']; $r = $_POST['radius']; echo ““.$z uchun natijalar; $sql = mysql_query(“Tanlash 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 FROM mrk m, zip z1, zip z2 QAYERDA m.zipcode = z1.zipcode VA z2.zipcode = $z VA (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 ) = oʻlim yoki $ )) " (mysql_error()); while($row = mysql_fetch_array( $sql )) { $store1 = $row['MktName']."”; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$satr['pochta indeksi']; $latitude1 = $row['lat']; $longitude1 = $satr['lon']; $latitude2 = $row['y1']; $longitude2 = $satr['x1']; $city = $row['city']; $state = $row['state']; $dis = getnew($kenglik1, $uzunlik1, $kenglik2, $uzunlik2, $birlik = 'Mi'); // $dis = masofa($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo “”; echo “”.$store.””; echo $dis . “mil(lar) uzoqlikda”; echo ""; } else { echo “”.$store.””; echo $dis . “mil(lar) uzoqlikda”; echo ""; } }}
mening functions.php kodim
funksiya getnew($kenglik1, $uzunlik1, $kenglik2, $uzunlik2, $birlik = 'Mi') { $theta = $uzunlik1 – $uzunlik2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $ masofa = acos ($ masofa); $ masofa = rad2deg ($ masofa); $ masofa = $ masofa * 60 * 1.1515; switch($unit) { case 'Mi': break; hol 'Km' : $masofa = $masofa * 1.609344; } qaytish (round($distance,2)); }
Oldindan rahmat
Ushbu maqola uchun rahmat. Mening kodim bilan yaxshi ishlayapman. 🙂
Salom Duglas, ajoyib maqola. Men sizning geografik tushunchalar va kodni tushuntirishingizni juda qiziqarli deb topdim. Mening yagona taklifim bo'sh joy va displey uchun kodni cheklash bo'ladi (masalan, Stackoverflow kabi). Men siz bo'sh joyni tejashni xohlayotganingizni tushunaman, lekin odatiy kod oralig'i/chizma men uchun dasturchi sifatida o'qish va ajratishni ancha osonlashtiradi. Qanday bo'lmasin, bu kichik narsa. Ishda davom eting.
rahmat! Men postni biroz o'zgartirdim... lekin tenglamalar juda ko'p joy egallaydi va shunchalik uzunki, bu juda ko'p yordam berishiga ishonchim komil emas.
Sizga katta rahmat.
Bu yerda funktsiyadan foydalanganda biz bir turdagi masofani olamiz..so'rovdan foydalanganda uning boshqa turdagi masofa keladi
Men ikki davlat orasidagi masofani hisoblamayman
Tan germoso uchun juda yaxshi ...
Bu yaxshi kosinus funktsiyalari. Men matematikani bilmayman, lekin rahmat!
Ajoyib ish... 🙂 (y)
Tanlashda formuladan ikki marta foydalanish tezroq (mysql 5.9) ko'rinadi va bu erda:
$formula = "(((acos(sin((".$keng."*pi()/180)) * sin((`Kenlik`*pi()/180))+cos((".$kenglik. ”*pi()/180)) * cos((`Kenlik`*pi()/180)) * cos(((“.$uzunlik.”- `Boylik`)*pi()/180)))) *180/pi())*60*1.1515*1.609344)”;
$sql = 'SELECT *, '.$formula.' kabi masofa FROM jadval WHERE '..$formula.' <= '.$distance;
rahmat ...
ishlamaydi, agar
“QAYERDA masofa”
agar ishlaydi
"masofaga ega"
Ushbu maqolani ko'rib chiqqaningiz uchun katta rahmat. Bu juda foydali.
PHP dastlab “Shaxsiy bosh sahifa” deb nomlangan oddiy skript platformasi sifatida yaratilgan. Hozirgi vaqtda PHP (gipermatnni oldindan protsessorning qisqartmasi) Microsoft kompaniyasining Active Server Pages (ASP) texnologiyasiga muqobildir.
PHP - bu dinamik veb-sahifalarni yaratish uchun ishlatiladigan ochiq manbali server tili. U HTML-ga kiritilishi mumkin. PHP odatda Linux/UNIX veb-serverlarida MySQL ma'lumotlar bazasi bilan birgalikda ishlatiladi. Bu, ehtimol, eng mashhur skript tilidir.
Yuqoridagi yechim to'g'ri ishlamayapti.
Menga o'zgartirish kerak:
$qqq = “SELECT *,(((acos(sin((“.$latitude.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $uzunlik . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) `register` dan masofa sifatida “;
Rahmat Kupendra!
Rahmat janob a'lo darajada ishladingiz .. lekin menda bitta savol bor agar kasrsiz chiqarmoqchi bo'lsam nima qilishim mumkin ..?
Oldindan rahmat.
Salom, iltimos, menga bu borada sizning yordamingiz kerak bo'ladi.
Men veb-serverimga get so'rovini yubordim http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $ kenglik
-2.23389 = $uzunlik
va 20 = men olmoqchi bo'lgan masofa
Ammo siz formuladan foydalanib, u mening JB-dagi barcha qatorlarni oladi
$results = DB::select( DB::raw(“SELECT *, (((acos(sin((“.$latitude."*pi()/180)) * sin((lat*pi()/180) ))+cos((“.$kenglik.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$uzunlik.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) masofa sifatida HAVING markerlardan masofa >= “.$distance ));
[{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”manzil”:”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”,”manzil”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”manzil”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162 ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”manzil”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”manzil”:”lave Escu View, CA”,”lat”:619,”lng”:-37.394012451172,”distance”:122.09552764893},{“id”:16078.563225154,”name”:”Oregano's Wood-Fired Pizza”,”6” manzili El Camino Real, Los Altos, CA”,”lat”:4546,”lng”:-37.401725769043,”distance”:122.11464691162},{“ id”:16077.937560795,”name”:“The bars and grills”,”address”:”7 Whiteley Street, Manchester”,”lat”:24,”lng”:-53.485118865967,”distance”:2.1828699111938}]
Men 20 milyalik qatorlarni olishni xohlayman, lekin u barcha qatorlarni olib keladi. Iltimos, men nima noto'g'ri qilyapman
Men shunga o'xshash so'rovni qidiryapman, lekin biroz kuchaytirdim - qisqasi, bu har bir koordinatadan 2 milya masofadagi barcha koordinatalarni guruhlash va keyin har bir guruhda qancha koordinatalarni hisoblash va eng ko'p koordinatalarga ega bo'lgan faqat bitta guruhni chiqarishdir - hattoki Sizda koordinatalar soni ko'p bo'lgan guruhlar orasida bir nechta guruhlar mavjud - shunchaki bir xil raqamga ega bo'lgan guruhlardan tasodifiy guruhni chiqaring -