PHP و SQL: محاسبه یا پرسش از فاصله بزرگ دایره بین نقاط عرض و طول با فرمول Haversine

Haversine Formula - محاسبه فاصله بزرگ دایره با PHP یا MySQL

این ماه من با توجه به GIS در PHP و MySQL کاملاً برنامه نویسی کرده ام. با گشتن در اطراف شبکه ، در واقع پیدا کردن برخی از شبکه ها مشکل داشتم محاسبات جغرافیایی برای پیدا کردن فاصله بین دو مکان بنابراین من می خواستم آنها را در اینجا به اشتراک بگذارم.

نقشه پرواز اروپا با فاصله دایره ای بزرگ

روش ساده محاسبه فاصله بین دو نقطه استفاده از فرمول فیثاغورث برای محاسبه هیپوتنوز مثلث است (A² + B² = C²). این به عنوان شناخته می شود فاصله ی اقلیدسی.

این یک شروع جالب است اما از آنجا که فاصله بین خطوط عرض و طول جغرافیایی است ، در مورد جغرافیا کاربردی ندارد فاصله مساوی نیست جدا از هم. هرچه به خط استوا نزدیک می شوید ، خطوط عرض بیشتر از هم فاصله می گیرند. اگر از نوعی معادله مثلث بندی ساده استفاده می کنید ، ممکن است به دلیل انحنای زمین ، فاصله را در یک مکان دقیق اندازه بگیرد و در مکان دیگر بسیار اشتباه باشد.

فاصله دایره بزرگ

مسیرهایی که در مسافت های طولانی در اطراف زمین طی می شوند به عنوان شناخته می شوند فاصله دایره بزرگ. یعنی ... کوتاهترین فاصله بین دو نقطه روی کره با نقاط موجود در یک نقشه مسطح متفاوت است. این را با این واقعیت ترکیب کنید که خطوط عرض و طول جغرافیایی مساوی نیستند ... و شما یک محاسبه دشوار دارید.

در اینجا یک توضیح ویدیویی خارق العاده از نحوه کار Great Circles آورده شده است.

فرمول هاورسین

فاصله با استفاده از انحنای زمین در ترکیب شده است فرمول هاورسین، که از مثلثات برای ایجاد انحنای زمین استفاده می کند. وقتی فاصله بین 2 مکان روی زمین را پیدا می کنید (وقتی کلاغ پرواز می کند) ، یک خط مستقیم واقعاً یک قوس است.

این در پروازهای هوایی قابل استفاده است - آیا تا به حال به نقشه واقعی پروازها نگاه کرده اید و متوجه قوس بودن آنها شده اید؟ دلیل آن این است که پرواز در یک طاق بین دو نقطه کوتاه تر از مستقیم به مکان است.

PHP: فاصله بین 2 نقطه از طول و عرض را محاسبه کنید

به هر حال ، در اینجا فرمول PHP برای محاسبه فاصله بین دو نقطه وجود دارد (همراه با تبدیل مایل در برابر کیلومتر) که به دو رقم اعشار گرد شده است.

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: با محاسبه فاصله در مایل ها با استفاده از طول و عرض جغرافیایی ، همه رکوردها را در یک محدوده بازیابی می کنیم

همچنین می توان با استفاده از SQL یک محاسبه را پیدا کرد تا تمام رکوردها را در یک فاصله خاص پیدا کنید. در این مثال ، من می خواهم MyTable را در MySQL جستجو کنم تا تمام سوابق کمتر یا مساوی با فاصله متغیر $ (در مایل) تا موقعیت مکانی خود را در $ عرض و طول جغرافیایی $ پیدا کنم:

پرسش برای بازیابی تمام سوابق موجود در یک مورد خاص فاصله با محاسبه فاصله در مایل بین دو نقطه از طول و عرض جغرافیایی عبارتند از:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."

شما باید این را سفارشی کنید:

  • طول جغرافیایی $ - این یک متغیر PHP است که در آن از طول نقطه عبور می کنم.
  • عرض جغرافیایی $ - این یک متغیر PHP است که در آن از طول نقطه عبور می کنم.
  • فاصله $ - این مسافتی است که شما می خواهید همه رکوردها را کمتر یا برابر آن پیدا کنید.
  • جدول - این جدول است ... شما می خواهید آن را با نام جدول خود جایگزین کنید.
  • عرض جغرافیایی - این قسمت از عرض جغرافیایی شما است.
  • طول جغرافیایی - این میدان طول شماست.

SQL: با محاسبه فاصله در کیلومتر با استفاده از طول و عرض جغرافیایی ، کلیه رکوردها را در یک محدوده بازیابی می کنیم

و در اینجا پرس و جو SQL با استفاده از کیلومتر در MySQL وجود دارد:

$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."

شما باید این را سفارشی کنید:

  • طول جغرافیایی $ - این یک متغیر PHP است که در آن از طول نقطه عبور می کنم.
  • عرض جغرافیایی $ - این یک متغیر PHP است که در آن از طول نقطه عبور می کنم.
  • فاصله $ - این مسافتی است که شما می خواهید همه رکوردها را کمتر یا برابر آن پیدا کنید.
  • جدول - این جدول است ... شما می خواهید آن را با نام جدول خود جایگزین کنید.
  • عرض جغرافیایی - این قسمت از عرض جغرافیایی شما است.
  • طول جغرافیایی - این میدان طول شماست.

من از این کد در یک پلت فرم نقشه برداری سازمانی استفاده کردم که ما برای یک فروشگاه خرده فروشی با بیش از 1,000 مکان در سراسر آمریکای شمالی استفاده کردیم و به زیبایی کار کرد.

76 نظرات

  1. 1

    از شما بسیار سپاسگزارم برای به اشتراک گذاری. این یک کار آسان کپی و چسباندن بود و عالی کار می کند. خیلی وقت منو پس انداز کردی
    اطلاعات مالی برای هر کسی که به C منتقل می شود:
    Double deg2rad (Double deg) {return deg * (3.14159265358979323846 / 180.0)؛ }

  2. 2

    قسمت بسیار خوبی از ارسال - بسیار خوب کار کرد - من فقط مجبور شدم نام میز نگهدارنده طولانی مدت را تغییر دهم. خیلی سریع کار می کند تا .. من تعداد معدودی طول طولانی دارم (<400) اما فکر می کنم این مقیاس خوبی داشته باشد. سایت بسیار خوبی نیز هست - من به تازگی آن را به حساب del.icio.us خود اضافه کرده ام و مرتباً بررسی می کنم.

  3. 4
  4. 5

    من کل روز را برای محاسبه مسافت جستجو کردم و الگوریتم harversine را پیدا کردم ، با تشکر از شما برای ارائه مثال در مورد نحوه قرار دادن آن در یک دستور sql ، متشکرم. با تشکر و سلام ، دانیل

  5. 8

    من فکر می کنم SQL شما به یک عبارت داشتن نیاز دارد.
    به جای WHERE فاصله <= $ مسافتی که ممکن است لازم داشته باشید
    استفاده از فاصله HAVING <= $ فاصله

    در غیر این صورت متشکرم که یک مقدار وقت و انرژی برای من صرفه جویی کردید.

  6. 10
  7. 11
  8. 12

    از اشتراک گذاری این کد بسیار سپاسگزارم این باعث صرفه جویی زیادی در زمان توسعه من شد. همچنین ، از خوانندگان خود برای اشاره به اینکه بیانیه HAVING برای MySQL 5.x لازم است تشکر می کنم. بسیار مفید.

  9. 14

    فرمول فوق باعث صرفه جویی در وقت من می شود. بسیار از شما متشکرم.
    همچنین باید بین فرمت NMEA و Degrees جابجا شوم. من یک فرمول در این URL در پایین صفحه پیدا کردم. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    آیا کسی می داند چگونه این را تأیید کند؟

    متشکرم!
    لخت کردن

  10. 15

    سلام،

    سوال دیگه آیا فرمولی برای رشته های NMEA مانند فرم زیر وجود دارد؟

    1342.7500، N، 10052.2287، E

    $GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B

    با تشکر،
    لخت کردن

  11. 16

    من همچنین متوجه شدم که WHERE برای من کار نمی کند. آن را به HAVING تغییر داده و همه چیز عالی عمل می کند. در ابتدا من نظرات را نخواندم و با استفاده از یک انتخاب تو در تو آن را بازنویسی کردم. هر دو بسیار خوب کار خواهند کرد.

  12. 17
  13. 18

    فوق العاده مفید ، بسیار ممنون! من به جای "WHERE" با "HAVING" جدیدی مشکل داشتم ، اما یک بار که نظرات را اینجا خواندم (بعد از حدود نیم ساعت دندانهایم را با ناراحتی = P) ، خوب کار کردم. ممنونم ^ _ ^

  14. 19
  15. 20

    به خاطر داشته باشید که یک عبارت انتخابی مانند آن از نظر محاسباتی بسیار شدید و بنابراین کند خواهد بود. اگر تعداد زیادی از این سeriesالات را داشته باشید ، می تواند خیلی سریع مسائل را خراب کند.

    یک روش بسیار کم شدت ، اجرای اولین انتخاب (خام) با استفاده از یک منطقه SQUARE است که با فاصله محاسبه شده تعریف شده است ، یعنی "انتخاب * از نام جدول که عرض بین lat1 و lat2 و طول جغرافیایی بین lon1 و lon2". lat1 = هدف جغرافیایی - latdiff ، lat2 = targetlatitude + latdiff ، مشابه با lon. latdiff ~ = فاصله / 111 (برای کیلومتر) ، یا فاصله / 69 برای مایل از آنجا که 1 درجه عرض جغرافیایی 111 کیلومتر است (تغییر جزئی از آنجا که زمین کمی بیضی شکل است ، اما برای این منظور کافی است). londiff = فاصله / (abs (cos (deg2rad (عرض جغرافیایی)) * 111)) - یا 69 مایل (برای در نظر گرفتن تغییرات می توانید یک مربع کمی بزرگتر بگیرید). سپس نتیجه آن را بگیرید و آن را در شعاع انتخاب کنید. فقط فراموش نکنید که مختصات خارج از محدوده را حساب کنید - یعنی محدوده طول جغرافیایی قابل قبول -180 تا +180 و دامنه عرض جغرافیایی قابل قبول -90 تا +90 است - درصورتی که Latdiff یا Londiff شما خارج از این محدوده باشد . توجه داشته باشید که در بیشتر موارد این ممکن است قابل اجرا نباشد زیرا فقط بر محاسبات یک خط از طریق اقیانوس آرام از قطب به قطب تأثیر می گذارد ، اگرچه بخشی از چوکوتکا و بخشی از آلاسکا را قطع می کند.

    آنچه که ما با این کار به دست می آوریم کاهش قابل توجه تعداد نقاطی است که شما در برابر آن محاسبه می کنید. اگر یک میلیون امتیاز جهانی در پایگاه داده دارید که تقریباً به طور مساوی توزیع شده است و می خواهید در 100 کیلومتری جستجو کنید ، اولین جستجوی شما (سریع) در مساحت 10000 کیلومتر مربع است و احتمالاً حدود 20 نتیجه (بر اساس توزیع مساوی در یک مساحت حدود 500M کیلومتر مربع) ، به این معنی که شما به جای یک میلیون بار ، محاسبه فاصله پیچیده را برای این پرسش 20 بار انجام می دهید.

    • 21

      یک اشتباه کوچک در مثال ... که برای 50 کیلومتر خواهد بود (نه 100) زیرا ما به "شعاع" میدان. خود نگاه می کنیم.

      • 22

        مشاوره خارق العاده! من در واقع با توسعه دهنده ای کار کردم که تابعی را نوشت که مربع داخلی را کشیده و سپس یک عملکرد بازگشتی را ایجاد می کند که "مربع ها" را در اطراف محیط قرار می دهد تا نقاط باقی مانده را شامل و حذف کند. نتیجه یک نتیجه فوق العاده سریع بود - او می توانست میلیون ها امتیاز را در میکرو ثانیه ارزیابی کند.

        رویکرد من در بالا قطعاً "خام" است اما قادر است. بازم ممنون

        • 23

          داگ ،

          من سعی کرده ام از mysql و php برای ارزیابی اینکه آیا یک نقطه طول lat درون چند ضلعی قرار دارد استفاده کنم. آیا می دانید دوست توسعه دهنده شما نمونه هایی از نحوه انجام این کار را منتشر کرده است. یا مثال خوبی می شناسید. پیشاپیش متشکرم

  16. 24

    سلام به همه ، این عبارت SQL آزمون من است:

    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

    و Mysql به من می گوید که فاصله ، به عنوان یک ستون وجود ندارد ، من می توانم از دستور استفاده کنم ، من می توانم آن را بدون WHERE انجام دهم ، و این کار می کند ، اما نه با آن ...

  17. 26

    این عالی است ، اما درست همانطور که پرندگان پرواز می کنند. بسیار خوب است که سعی کنید API google maps را به نوعی در این مورد بگنجانید (شاید با استفاده از جاده ها و غیره) فقط برای ارائه ایده با استفاده از شکل دیگری از حمل و نقل. من هنوز نتوانسته ام عملکرد بازپخت شبیه سازی شده ای در PHP ایجاد کنم که بتواند یک راه حل کارآمد برای مشکل فروشنده در سفر ارائه دهد. اما من فکر می کنم که ممکن است بتوانم از برخی از کد شما برای این کار مجدداً استفاده کنم.

  18. 27

    سلام داگلاس ،
    از این مقاله بسیار متشکرم - شما فقط در وقت من صرفه جویی کردید.
    مراقب باش،
    نمرود @ اسرائیل

  19. 28

    مقاله خوب! من مقالات زیادی پیدا کردم که نحوه محاسبه فاصله بین دو نقطه را توصیف می کردند اما من واقعاً به دنبال قطعه SQL بودم.

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

    2 روز تحقیق برای پیدا کردن سرانجام این صفحه که مشکل من را حل می کند. به نظر می رسد که من بهتر است WolframAlpha خود را شکست داده و ریاضیات خود را بالا بکشم. تغییر از WHERE به HAVING اسکریپت من در دستور کار قرار دارد. متشکرم

  25. 37
    • 38

      ممنون جورجی. مرتباً "فاصله" ستون پیدا نمی شد. هنگامی که من WHERE را به HAVING تغییر دادم مانند جذابیت کار می کرد!

  26. 39

    کاش این اولین صفحه ای بود که در این صفحه پیدا کردم. بعد از امتحان کردن دستورات مختلف ، این تنها کسی است که به درستی کار می کند ، و حداقل تغییرات لازم برای قرار دادن پایگاه داده خودم است.
    خیلی ممنون!

  27. 40

    کاش این اولین صفحه ای بود که در این صفحه پیدا کردم. بعد از امتحان کردن دستورات مختلف ، این تنها کسی است که به درستی کار می کند ، و حداقل تغییرات لازم برای قرار دادن پایگاه داده خودم است.
    خیلی ممنون!

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

    من می دانم که این فرمول جواب می دهد ، اما نمی توانم ببینم شعاع زمین در کجا مورد توجه قرار گرفته است. لطفاً کسی می تواند مرا روشن کند؟

  34. 49
  35. 50
  36. 52

    از داگلاس متشکرم ، SQL Query دقیقاً همان چیزی است که من به آن احتیاج داشتم و فکر کردم که باید خودم آن را بنویسم. شما من را از احتمال ساعتها منحنی یادگیری طول جغرافیایی نجات داده اید!

  37. 53
  38. 55
  39. 56

    داگلاس ، از این کد شگفت آور متشکرم. سر من در مورد چگونگی انجام این کار در پورتال انجمن GPS من شکسته شده است. تو ساعتها صرفه جویی کردی

  40. 58

    با تشکر برای ارسال این مقاله مفید ،  
    اما به دلایلی دوست دارم بپرسم
    چگونه می توان بین مختصات داخل mysql db و مختصات درج شده توسط php به کاربر فاصله گرفت؟
    برای توضیح بیشتر:
    1. کاربر باید [id] را برای انتخاب داده های مشخص شده از db و مختصات خود کاربر وارد کند
    2. فایل php با استفاده از [id] داده های هدف (مختصات) را دریافت کرده و سپس فاصله بین کاربر و نقطه هدف را محاسبه می کند

    یا فقط می تواند از کد زیر فاصله بگیرد؟

    $ qry = "SELECT *، (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((" Latitude "* pi () / 180)) + cos ((". عرض جغرافیایی $. "* pi () / 180)) * cos ((" Latitude "* pi () / 180)) * cos (((". "طول جغرافیایی $." - "طول") * pi () / 180) ))) * 180 / پی ()) * 60 * 1.1515 * 1.609344) به عنوان فاصله FROM از "MyTable" WHERE فاصله> = ". $ فاصله". >>>> آیا می توانم از اینجا فاصله بگیرم؟
    بازم متشکرم
    تیمی اس

    • 59

      مهم نیست ، من فهمیدم که "عملکرد" ​​در PHP چگونه کار می کند
      $ dis = getDistanceBetweenPointsNew ($ userLati ، $ userLongi ، $ lati ، $ longi ، $ unit = 'Km')
      خیلی ممنون!! 

  41. 60

    خوب ، همه آنچه که من امتحان کردم مفید نیست. منظورم این است که آنچه دارم کار می کند ، اما مسافت دور است.

    آیا کسی ممکن است ببیند این کد چه مشکلی دارد؟

    if (Isset ($ _ POST ['ارسال شده']))) {$ z = $ _POST ['کد پستی']؛ $ r = $ _POST ['شعاع']؛ echo "نتایج برای". $ 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. city، z1.state FROM mrk m، zip z1، zip z2 WHERE m.zipcode = z1.zipcode AND z2.zipcode = $ z AND (3963 * acos (cuncate (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 ") یا بمیرید (mysql_error ())؛ while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. ""؛ $ store = $ row ['LocAddSt']. ""؛ $ store. = $ row ['LocAddCity']. "،". $ row ['LocAddState']. " ". $ row ['کد پستی"]؛ $ latitude1 = $ row ['lat']؛ $ longitude1 = $ row ['lon']؛ $ latitude2 = $ row ['y1']؛ $ longitude2 = $ row ['x1']؛ $ city = $ row ['city']؛ $ state = $ row ['state']؛ $ dis = getnew ($ latitude1، $ longitude1، $ latitude2، $ longitude2، $ unit = 'Mi')؛ // $ dis = فاصله ($ lat1 ، $ lon1 ، $ lat2 ، $ lon2)؛ $ verified = $ row ['verified']؛ if ($ verified == '1') {echo ””؛ echo "". $ store. ""؛ echo $ dis. " خیلی دور"؛ پژواک ""؛ } else {echo "". $ store. ""؛ echo $ dis. " خیلی دور"؛ پژواک ""؛ }}}

    کد توابع my.php
    تابع getnew ($ latitude1، $ longitude1، $ latitude2، $ longitude2، $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2؛ فاصله $ = (گناه (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ) $ distance = acos ($ فاصله)؛ فاصله $ = rad2deg ($ فاصله) ؛ فاصله $ = فاصله $ * 60 * 1.1515 ؛ سوئیچ ($ unit) {case 'Mi': break؛ مورد 'Km': فاصله $ = $ فاصله * 1.609344؛ } Return (دور (فاصله $ ، 2))؛ }

    با تشکر از شما در پیشبرد

  42. 61
  43. 62

    سلام داگلاس ، مقاله عالی. به نظر من توضیح شما درباره مفاهیم جغرافیایی و کد واقعاً جالب است. تنها پیشنهاد من این است که کد را برای نمایش فاصله و تورفتگی قرار دهید (مثلاً Stackoverflow). من درک می کنم که شما می خواهید فضا را حفظ کنید ، اما فاصله / تورفتگی کد متداول خواندن و تشریح را برای من ، به عنوان یک برنامه نویس ، بسیار آسان می کند. به هر حال ، این یک چیز کوچک است. ادامه کار بزرگ

    • 63

      با تشکر! من پست را کمی اصلاح کرده ام ... اما معادلات فضای زیادی را اشغال می کنند و آنقدر طولانی هستند که مطمئن نیستم خیلی به آن کمک کند.

  44. 64
  45. 65

    در اینجا با استفاده از تابع یک نوع فاصله بدست می آوریم ... در حالی که از query نوع دیگر فاصله استفاده می شود

  46. 66
  47. 67
  48. 68
  49. 69
  50. 70

    استفاده از دو برابر فرمول در انتخاب و مکان: سریعتر به نظر می رسد (mysql 5.9):
    $ formula = "(((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((" Latitude "* pi () / 180)) + cos ((". $ عرض جغرافیایی. "* pi () / 180)) * cos ((" Latitude "* pi () / 180)) * cos (((". $ طول جغرافیایی. "-" طول ") * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) "؛
    $ sql = 'SELECT *،'. $ formula. ' به عنوان فاصله از جدول WHERE '.. $ formula.' <= '. $ فاصله؛

  51. 71
  52. 72

    با تشکر فراوان برای برش این مقاله. بسیار مفید است.
    PHP در ابتدا به عنوان یک پلت فرم اسکریپت نویسی ساده به نام "صفحه اصلی شخصی" ایجاد شد. امروزه PHP (مخفف Hypertext Preprocessor) جایگزینی برای فناوری Active Server Pages (ASP) مایکروسافت است.

    PHP یک زبان سمت سرور منبع باز است که برای ایجاد صفحات وب پویا استفاده می شود. می تواند در HTML جاسازی شود. PHP معمولاً همراه با یک پایگاه داده MySQL در وب سرورهای Linux / UNIX استفاده می شود. این احتمالاً محبوب ترین زبان فیلمنامه است.

  53. 73

    من راه حل فوق را پیدا کردم که به درستی کار نمی کند.
    من نیاز به تغییر به:

    qqq $ = "SELECT *، (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((" latt "* pi () / 180)) + cos ((". عرض جغرافیایی $. "* pi () / 180)) * cos ((" latt "* pi () / 180)) * cos (((". $ longitude. "-" longt ") * pi () / 180) ))) * 180 / پی ()) * 60 * 1.1515) به عنوان فاصله از "ثبت" "؛

  54. 75

    متشکرم آقا که کاملاً بچرخید .. اما اگر بخواهم بدون علامت اعشاری خروجی بگیرم یک سوال دارم که چه کاری می توانم انجام دهم؟

    پیشاپیش سپاسگزاریم.

  55. 76

    سلام ، لطفاً من در این مورد واقعا به کمک شما نیاز دارم.

    من از وب سرور خود درخواست در خواست کردم http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = عرض جغرافیایی $
    -2.23389 = طول جغرافیایی $
    و 20 = فاصله ای که می خواهم بازیابی کنم

    با این حال با استفاده از فرمول شما ، تمام ردیف های db من را بازیابی می کند

    $ results = DB :: select (DB :: raw ("SELECT *، (((acos (sin ((". $ latitude. "* pi () / 180)) * sin ((lat * pi () / 180 )) + cos ((". $ عرض جغرافیایی." * pi () / 180)) * cos ((lat * pi () / 180)) * cos (((". $ طول جغرافیایی." - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) به عنوان فاصله از نشانگرهای دارای فاصله> = ". $ فاصله)))؛

    [{“id”: 1، ”name”: ”Frankie Johnnie & Luigo Too”، ”address”: ”939 W El Camino Real، Mountain View، CA”، ”lat”: 37.386337280273، ”lng”: - 122.08582305908، ”distance”: 16079.294719663} ، {“id”: 2 ، ”name”: ”Piczeria East Coast Amici” ، ”آدرس”: ”790 Castro St، Mountain View، CA”، ”lat”: 37.387138366699، ”lng”: -122.08323669434 ، "distance": 16079.175940152} ، "" id ": 3 ،" name ":" Kapp's Pizza Bar & Grill "،" آدرس ":" 191 Castro St، Mountain View، CA "،" lat ": 37.393886566162، ”lng”: - 122.07891845703، ”distance”: 16078.381373826}، {“id”: 4، ”name”: ”Round Table Pizza: Mountain View”، ”address”: ”570 N Shoreline Blvd، Mountain View، CA”، ”lat”: 37.402652740479، ”lng”: - 122.07935333252، ”distance”: 16077.420540582}، {“id”: 5، ”name”: ”Tony & Alba's Pizza & Pasta”، ”address”: ”619 Escuela Ave، Mountain View، CA ”،” lat ”: 37.394012451172،” lng ”: - 122.09552764893،” distance ”: 16078.563225154}، {“ id ”: 6،” name ”:” Oregano's Wood-Fired Pizza ”،” address ”:” 4546 El Camino Real ، لس آلتوس ، کالیفرنیا ”،” lat ”: 37.401725769043،” lng ”: - 122.11464691162،” distance ”: 16077.937560795}، {“ id ”: 7،” name ”:” The bars and grills ”،” address ”:” 24 Whiteley Street، Manchester ”،” lat ”: 53.485118865967،” lng ”: - 2.1828699111938،” distance ”: 8038.7620112314}]

    من می خواهم فقط ردیف های 20 مایل را بازیابی کنم اما همه ردیف ها را به ارمغان می آورد. لطفاً من چه غلطی می کنم

شما چه فکر میکنید؟

این سایت از Akismet برای کاهش هرزنامه استفاده می کند. بدانید که چگونه نظر شما پردازش می شود.