Haversine formulasidan foydalanib, kenglik va uzunlik nuqtalari orasidagi katta doira masofasini hisoblang yoki so'rang (PHP, Python, MySQL, MSSQL misollari)

Haversine formulasi - Katta doira masofasi - PHP, Python, MySQL

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.

Buyuk doirali masofa bilan Evropaga parvoz xaritasi

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.

77 Comments

  1. 1

    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); }

  2. 2

    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.

  3. 4
  4. 5
  5. 8

    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.

  6. 10
  7. 11
  8. 12

    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.

  9. 14
  10. 15

    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

  11. 16

    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.

  12. 17
  13. 18

    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 ^_^

  14. 19
  15. 20

    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.

    • 21

      Misoldagi kichik xatolik ... bu 50 km (100 emas) uchun bo'ladi, chunki biz ... kvadratimizning "radiusiga" qaraymiz.

      • 22

        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!

        • 23

          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.

  16. 24

    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 ...

  17. 26

    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.

  18. 27

    Salom Duglas,
    ushbu maqola uchun katta rahmat - siz menga juda ko'p vaqtni tejadingiz.
    qayg'urmoq; o'zini ehtiyot qilmoq,
    nimrod @Isroel

  19. 28

    Yaxshi maqola! Ikki nuqta orasidagi masofani qanday hisoblashni tavsiflovchi ko'plab maqolalarni topdim, lekin men haqiqatan ham SQL parchasini qidirdim.

  20. 29
  21. 30
  22. 31
  23. 32
  24. 36

    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

  25. 37
    • 38

      Rahmat Georgi. Menga "masofa" ustuni topilmadi. Bir marta men QAYER ni HAVINGga o'zgartirsam, u jozibali ishladi!

  26. 39

    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!

  27. 40

    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!

  28. 41
  29. 42
  30. 43
  31. 45
  32. 46
  33. 47

    Men bu formula ishlayotganini bilaman, lekin yerning radiusi qayerda hisobga olinayotganini ko‘ra olmayapman. Iltimos, kimdir meni yoritib bera oladimi?

  34. 49
  35. 50
  36. 52

    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!

  37. 53
  38. 55

    Ushbu ajoyib maqola uchun rahmat! Kodni faqat ma'lumotlar bazasida sinab ko'rdim va juda yaxshi ishladim! 

  39. 56
  40. 58

    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

  41. 60

    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

  42. 61
  43. 62

    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.

  44. 64
  45. 65
  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    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;

  51. 71
  52. 72

    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.

  53. 73

    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 “;

  54. 75
  55. 76

    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

  56. 77

    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 -

Siz nima deb o'ylaysiz?

Ushbu sayt spamni kamaytirish uchun Akismet-dan foydalanadi. Fikringiz ma'lumotlarining qanday ishlashini bilib oling.