PHP და SQL: გამოთვალეთ ან იკითხეთ დიდი წრის მანძილი გრძედის და გრძედის წერტილებს შორის Haversine ფორმულის საშუალებით

Haversine ფორმულა - გამოთვალეთ დიდი წრის მანძილი PHP ან MySQL– ით

ამ თვეში მე საკმაოდ ვპროგრამირებდი PHP- სა და MySQL- ში, GIS- ის მიმართ. ქსელის თვალიერებისას, მე ნამდვილად გამიჭირდა ზოგიერთი მათგანის მოძებნა გეოგრაფიული გათვლები იპოვონ მანძილი ორ ადგილს შორის, ამიტომ მსურდა აქ მათი გაზიარება.

ფრენის რუკა ევროპაში დიდი წრის მანძილით

ორ წერტილს შორის მანძილის გამოთვლის მარტივი გზაა პითაგორას ფორმულის გამოყენებით სამკუთხედის ჰიპოტენუზის გამოსათვლელად (A² + B² = C²). ეს ცნობილია როგორც ევკლიდური მანძილი.

ეს საინტერესო დასაწყისია, მაგრამ ის არ ეხება გეოგრაფიას, რადგან მანძილი გრძედის და გრძედის ხაზებს შორის არის არ არის თანაბარი მანძილი გარდა. ეკვატორთან მიახლოებისთანავე გრძედის ხაზები უფრო დაშორებულია. თუ თქვენ იყენებთ ერთგვარ სამკუთხა მარტივ განტოლებას, მან დედამიწის მრუდის გამო შეიძლება ზუსტად განსაზღვროს მანძილი ერთ ადგილას, ხოლო მეორეში საშინლად არასწორი.

დიდი წრის მანძილი

მარშრუტები, რომლებსაც დედამიწის გარშემო გრძელი მანძილი აქვს გავლილი, ცნობილია როგორც დიდი წრის მანძილი. ეს არის sphere სფეროზე ორ წერტილს შორის ყველაზე მოკლე მანძილი განსხვავდება ბრტყელი რუკის წერტილებისგან. შეუთავსეთ ამას ის ფაქტი, რომ გრძედი და გრძედი ხაზები არ არის თანაბრად დაშორებული… და რთული გაანგარიშება გაქვთ.

გთავაზობთ ფანტასტიკურ ვიდეორგოლს, თუ როგორ მუშაობს დიდი წრეები.

ჰავერსის ფორმულა

მანძილი დედამიწის მრუდის გამოყენებით არის ჩართული ჰავერსის ფორმულა, რომელიც იყენებს ტრიგონომეტრიას, რათა მოხდეს მიწის გამრუდება. როდესაც დედამიწაზე 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-ზე მეტი ადგილმდებარეობა მდებარეობს ჩრდილოეთ ამერიკაში და ის მშვენივრად მუშაობდა.

77 კომენტარები

  1. 1

    დიდი მადლობა გაზიარებისთვის. ეს იყო მარტივი ასლის და ჩასმა სამუშაო და შესანიშნავად მუშაობს. ბევრი დრო დაზოგე.
    FYI ნებისმიერი ადამიანისთვის, ვინც C- ს პორტირებს:
    ორმაგი deg2rad (ორმაგი deg) {დაბრუნების deg * (3.14159265358979323846 / 180.0); }

  2. 2

    გამოქვეყნების ძალიან ლამაზი ნაწილი - ძალიან კარგად მუშაობდა - მე მხოლოდ მაგიდის სახელის შეცვლა მომიწია, რომელიც ბოლო ხნის განმავლობაში იკავებს. ეს მუშაობს საკმაოდ სწრაფად. მე მაქვს საკმაოდ მცირე რაოდენობის ლატ-სიგრძე (<400), მაგრამ ვფიქრობ, რომ ეს მასშტაბური იქნება. ლამაზი საიტიც - ახლახან დავამატე ის ჩემს del.icio.us ანგარიშში და რეგულარულად გადავამოწმებ.

  3. 4
  4. 5

    მთელი დღის განმავლობაში ვეძებდი მანძილის გამოთვლებს და ვპოულობ ჰარვერინის ალგორითმს, მადლობა, რომ მოგეცით მაგალითი იმის შესახებ, თუ როგორ უნდა დააყენოთ იგი sql განცხადებაში. მადლობა და მოგესალმებით, დანიელ

  5. 8

    მე ვფიქრობ, რომ თქვენს SQL– ს დებულება სჭირდება.
    ნაცვლად WHERE მანძილი <= $ მანძილი შეიძლება დაგჭირდეთ
    გამოიყენეთ HAVING მანძილი <= $ მანძილი

    წინააღმდეგ შემთხვევაში მადლობა რომ დაზოგე ბევრი დრო და ენერგია.

  6. 10
  7. 11
  8. 12

    დიდი მადლობა ამ კოდის გასაზიარებლად. ამან დაზოგა განვითარების დიდი დრო. ასევე, მადლობა თქვენს მკითხველს იმისთვის, რომ აღნიშნეს, რომ აუცილებელია განაცხადი MySQL 5.x- სთვის. Ძალიან დამხმარე.

  9. 14

    ზემოთ მოცემული ფორმულა დიდ დროს ზოგავს. Ძალიან დიდი მადლობა.
    მე ასევე უნდა გადავიდე NMEA ფორმატსა და ხარისხებზე. ამ URL- ზე ფორმულა ვიპოვე გვერდის ბოლოში. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    ვინმემ იცის ამის გადამოწმება?

    გმადლობთ!
    ჰარი

  10. 15
  11. 16

    მე ასევე მივხვდი, რომ WHERE არ მუშაობდა ჩემთვის. შეიცვალა HAVING– ით და ყველაფერი შესანიშნავად მუშაობს. თავდაპირველად, მე არ წავიკითხე კომენტარები და გადავწერე ის ჩასმული არჩევის გამოყენებით. ორივე კარგად იმუშავებს.

  12. 17
  13. 18

    წარმოუდგენლად გამოსადეგი, დიდი მადლობა! მე პრობლემები შემექმნა ახალ "HAVING" - სთან დაკავშირებით, ვიდრე "WHERE" - სთან დაკავშირებით, მაგრამ ერთხელ წავიკითხე აქ კომენტარი (იმედგაცრუებისგან კბილების გახეხვის შემდეგ დაახლოებით ნახევარი საათის შემდეგ = P), ეს კარგად გამომივიდა. მადლობა ^ _ ^

  14. 19
  15. 20

    გაითვალისწინეთ, რომ მსგავსი ფრაზა იქნება გამოთვლითი ინტენსიური და, შესაბამისად, ნელი. თუ ამ კითხვებით ბევრი გაქვთ, მას შეუძლია საკმაოდ სწრაფად გაანადგუროს ყველაფერი.

    ნაკლებად ინტენსიური მიდგომაა პირველი (ნედლი) სელექციის გამოყენება SQUARE ფართობის გამოყენებით, რომელიც განისაზღვრება გაანგარიშებული მანძილით, ანუ "აირჩიეთ * მაგიდის სახელიდან, სადაც გრძედი lat1- სა და lat2- ს შორის და გრძედი long1- ს და lon2- ს შორის". lat1 = სამიზნე გრძედი - latdiff, lat2 = სამიზნე გრძედი + latdiff, მსგავსია lon. latdiff ~ = მანძილი / 111 (კმ-ისთვის), ან მანძილი / 69 მილის მანძილზე, რადგან 1 გრადუსიანი გრძედია ~ 111 კმ (მცირე ცვლილება, რადგან დედამიწა ოდნავ ოვალურია, მაგრამ ამ მიზნისთვის საკმარისია). ლონდიფი = მანძილი / (აბს (კოს (deg2rad (გრძედი)) * 111)) - ან 69 მილი (თქვენ შეგიძლიათ ოდნავ უფრო დიდი მოედანი აიღოთ, რომ ვარიაციები გავითვალისწინოთ). შემდეგ მიიღე ამის შედეგი და მიადე რადიალურ სელექციაში. უბრალოდ არ უნდა დაგვავიწყდეს საზღვარგარეთ მდებარე კოორდინატების აღრიცხვა - ანუ მისაღები გრძედის დიაპაზონი -180-დან +180-მდეა და მისაღები გრძედის დიაპაზონი -90-დან +90-მდე - იმ შემთხვევაში, თუ თქვენი ლატდიფი ან ლონდიფი გადის ამ დიაპაზონის ფარგლებს გარეთ . გაითვალისწინეთ, რომ უმეტეს შემთხვევაში ეს შეიძლება არ იყოს გამოყენებული, რადგან იგი მხოლოდ წყნარ ოკეანეზე ხაზის პოლუსიდან პოლუსზე გაანგარიშებებზე ახდენს გავლენას, თუმცა ის კვეთს ჩუკოტკის ნაწილს და ალასკის ნაწილს.

    რასაც ამით ვაღწევთ, არის მნიშვნელოვნად შემცირებული ქულების რაოდენობა, რომლის მიხედვითაც აკეთებთ ამ გაანგარიშებას. თუ თქვენ გაქვთ მილიონი გლობალური ქულა მონაცემთა ბაზაში, რომელიც თანაბრად გადანაწილებულია და გსურთ მოძებნოთ 100 კმ – ზე, მაშინ თქვენი პირველი (სწრაფი) ძებნა არის 10000 კვ.კმ – ის ფართობი და, სავარაუდოდ, დაახლოებით 20 შედეგს მოგცემთ ( დაახლოებით 500 მილიონი კვ.კმ.), რაც ნიშნავს, რომ ამ მოთხოვნისთვის 20-ჯერ აწარმოებთ რთული მანძილის გაანგარიშებას, მილიონჯერ ნაცვლად.

    • 21
      • 22

        ფანტასტიკური რჩევა! მე რეალურად ვმუშაობდი დეველოპერთან, რომელმაც დაწერა ფუნქცია, რომელიც გამოჰყავდა შიგნით კვადრატს, შემდეგ კი რეკურსიული ფუნქცია, რომელიც ქმნიდა "კვადრატებს" პერიმეტრის გარშემო, დარჩენილი წერტილების ჩათვლით და გამორიცხვით. შედეგი წარმოუდგენლად სწრაფი შედეგი იყო - მას შეეძლო მილიონ წამებში მილიონობით ქულის შეფასება.

        ჩემი ზემოთ მოყვანილი მიდგომა ნამდვილად არის "უხეში", მაგრამ შეუძლია. Გმადლობთ კიდევ ერთხელ!

        • 23

          დაგ,

          მე ვცდილობდი გამომეყენებინა mysql და php იმის შესაფასებლად, არის თუ არა გრძელი გრძელი წერტილი მრავალკუთხედში. იცით, გამოაქვეყნა თუ არა თქვენსმა დეველოპერმა მეგობრის მიერ ამ ამოცანის შესრულების მაგალითები. ან რამე კარგი მაგალითი იცით? Წინასწარ მადლობა.

  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

    ეს შესანიშნავია, თუმცა ისევე, როგორც ფრინველები დაფრინავენ. კარგი იქნებოდა შეეცადეთ Google- ის რუკების API როგორმე ჩართოთ მასში (იქნებ გამოიყენეთ გზები და ა.შ.) უბრალოდ სხვა იდეის ტრანსპორტირების იდეის შესაქმნელად. PHP– ში ჯერ კიდევ არ გამიკეთებია იმიტირებული ანელური ფუნქცია, რომლის საშუალებითაც შესაძლებელი იქნება მოგზაური გამყიდველის პრობლემის ეფექტური გადაწყვეტა. მე ვფიქრობ, რომ შეიძლება შევძლო თქვენი ზოგიერთი კოდის ხელახლა გამოყენება ამისათვის.

  18. 27
  19. 28

    კარგი სტატია! უამრავი სტატია ვიპოვნე, სადაც აღწერილი იყო, თუ როგორ უნდა გამოვთვალოთ მანძილი ორ წერტილს შორის, მაგრამ ნამდვილად ვეძებდი SQL ფრაგმენტს.

  20. 29
  21. 30

    დიდი მადლობა ამ ფორმულისთვის. ეს გარკვეულ დროს გადაპარსეს მაღაზიის ადგილმდებარეობის პროექტზე, რომელიც ჩემთვის ჭამდა.

  22. 31

    მადლობა შეკვრას. კოდის ამ მცირე ხაზმა დაზოგა მნიშვნელოვანი დრო მაღაზიის მდებარეობის პროექტში!

  23. 32
  24. 36

    2 დღიანი კვლევა, რომ საბოლოოდ ვიპოვნოთ ეს გვერდი, რომელიც წყვეტს ჩემს პრობლემას. როგორც ჩანს, უკეთესად ვუსწორებ ჩემს WolframAlpha- ს და ვუვარცხნი მათემატიკას. WHERE– დან HAVING– ის შეცვლას ჩემი სკრიპტი მუშაობს. ᲒᲛᲐᲓᲚᲝᲑᲗ

  25. 37
  26. 39

    ვისურვებდი რომ ეს პირველი გვერდი ყოფილიყო, რომელზეც ვხვდებოდი. მრავალი სხვადასხვა ბრძანების მცდელობის შემდეგ, ეს მხოლოდ ერთი მუშაობდა სწორად და მინიმალური ცვლილებებით სჭირდებოდა საკუთარი მონაცემთა ბაზა.
    გმადლობთ ბევრი!

  27. 40

    ვისურვებდი რომ ეს პირველი გვერდი ყოფილიყო, რომელზეც ვხვდებოდი. მრავალი სხვადასხვა ბრძანების მცდელობის შემდეგ, ეს მხოლოდ ერთი მუშაობდა სწორად და მინიმალური ცვლილებებით სჭირდებოდა საკუთარი მონაცემთა ბაზა.
    გმადლობთ ბევრი!

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

    მე ვიცი, რომ ეს ფორმულა მუშაობს, მაგრამ ვერ ვხედავ, თუ სად არის გათვალისწინებული დედამიწის რადიუსი. ვინმეს შეუძლია გამანათლოს, გთხოვთ?

  34. 49
  35. 50
  36. 52

    გმადლობთ დუგლას, SQL მოთხოვნა ზუსტად ისაა, რაც მჭირდებოდა და მეგონა, რომ მე თვითონ უნდა დამეწერა. თქვენ გადაარჩინეთ გრძედის გრძედის სწავლის მრუდისგან!

  37. 53
  38. 55
  39. 56
  40. 58

    მადლობა ამ სასარგებლო სტატიის გამოქვეყნებისათვის,  
    მაგრამ რატომღაც მინდა ვკითხო
    როგორ მივიღოთ მანძილი mysql db– ის კოორდინაციებსა და მომხმარებლის მიერ php– ში ჩასმულ კოორდინატებს შორის?
    უფრო მკაფიოდ აღწერს:
    1. მომხმარებელმა უნდა ჩასვას [id] db– დან და მომხმარებლის თავად კოორდინატებიდან მითითებული მონაცემების ასარჩევად
    2. php ფაილი იღებს სამიზნე მონაცემებს (კოორდინატებს) [id] - ის გამოყენებით და შემდეგ გამოითვლის მომხმარებელსა და სამიზნე წერტილს შორის მანძილი

    ან უბრალოდ შეგიძლიათ მოშორდეთ ქვემოთ მოცემულ კოდს?

    $ qry = "SELECT *, (((acos (sin ((". $ გრძედი. "* pi () / 180)) * sin ((" გრძედი "* pi () / 180)) + cos ((". $ გრძედი. "* pi () / 180)) * cos ((" გრძედი "* pi () / 180)) * cos (((". $ გრძედი. "-" განედი ") * pi () / 180) ))) * 180 / პი ()) * 60 * 1.1515 * 1.609344) როგორც მანძილი "MyTable" WHERE მანძილიდან> = ". $ მანძილი". >>>> შემიძლია "ამოვიღო" მანძილი აქედან?
    გმადლობთ კიდევ ერთხელ,
    ტიმი ს

  41. 60

    კარგი, ყველაფერი რაც ვცადე არ მუშაობს. ვგულისხმობ იმას, რაც მაქვს, მუშაობს, მაგრამ მანძილი აშორებს.

    შეიძლება ვინმემ დაინახოს, რა არის ამ კოდის შეცდომა?

    if (Isset ($ _ POST ['წარმოდგენილი'])) {$ z = $ _POST ['საფოსტო კოდი']; $ r = $ _POST ['რადიუსი']; echo "შედეგები". $ z; $ sql = mysql_query ("აირჩიეთ DISTINCT m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m.verified, z1.lat, z2.lon, z1. ქალაქი, z1.state mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode AND z2.zipcode = $ z AND (3963 * acos (truncate (sin (z2.lat / 57.2958)) * sin (მ.) 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 ['zipcode']; $ latitude1 = $ row ['lat']; $ გრძედი 1 = $ მწკრივი ['გრძელი']; $ latitude2 = $ row ['y1']; $ გრძედი 2 = $ მწკრივი ['x1']; $ ქალაქი = $ row ['ქალაქი']; $ სახელმწიფო = $ row ['state']; $ dis = getnew ($ გრძედი 1, $ გრძედი 1, $ გრძედი 2, $ გრძედი 2, $ ერთეული = 'Mi'); // $ dis = მანძილი ($ lat1, $ lon1, $ lat2, $ lon2); $ დამოწმებული = $ row ['დამოწმებული']; if ($ დამოწმებულია == '1') {echo “”; ექო "". $ მაღაზია. ""; ექო $ dis. ”მილი” (დაშორებულია); ექო ""; } else {echo “”. $ store. ””; ექო $ dis. ”მილი” (დაშორებულია); ექო ""; }}}

    ჩემი ფუნქციები. php კოდი
    ფუნქცია getnew ($ გრძედი 1, $ გრძედი 1, $ გრძედი 2, $ გრძედი 2, $ ერთეული = 'Mi') {$ თეტა = $ გრძედი 1 - $ გრძედი 2; $ მანძილი = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + + cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ) $ მანძილი = acos ($ მანძილი); $ მანძილი = rad2deg ($ მანძილი); $ მანძილი = $ მანძილი * 60 * 1.1515; გადართვა ($ ერთეული) {case 'Mi': break; შემთხვევაში 'Km': $ მანძილი = $ მანძილი * 1.609344; } დაბრუნება (მრგვალი ($ მანძილი, 2)); }

    წინასწარ გიხდით მადლობას

  42. 61
  43. 62

    Hey Douglas, შესანიშნავი სტატია. მართლა საინტერესო აღმოჩნდა თქვენი განმარტება გეოგრაფიული ცნებებისა და კოდის შესახებ. ჩემი ერთადერთი წინადადება იქნება სივრცის განთავსება და კოდის ჩასმა ეკრანზე (მაგალითად, Stackoverflow). მესმის, რომ გსურთ სივრცის დაზოგვა, მაგრამ ჩვეულებრივი კოდის დაშორება / ჩაღრმავება ბევრად უფრო გამიადვილებს კითხვას და დანაწევრებას, როგორც პროგრამისტს. ყოველ შემთხვევაში, ეს მცირე რამეა. გააგრძელეთ დიდი საქმე.

    • 63

      მადლობა! პოსტი ცოტათი შევცვალე… მაგრამ განტოლებები იმდენ ადგილს იკავებს და იმდენად გრძელია, რომ არ ვარ დარწმუნებული, რომ ძალიან მეხმარება.

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

    როგორც ჩანს, უფრო სწრაფია (mysql 5.9) ორჯერ ფორმულის გამოყენება შერჩევაში და სად:
    $ formula = "(((acos (sin ((". $ გრძედი. "* pi () / 180)) * sin ((" გრძედი "* pi () / 180)) + cos ((". $ გრძედი. "* Pi () / 180)) * cos ((" გრძედი "* pi () / 180)) * cos (((". $ გრძედი. "-" განედი ") * pi () / 180)))) * 180 / პი ()) * 60 * 1.1515 * 1.609344) ”;
    $ sql = 'SELECT *,'. $ formula. ' როგორც მანძილი ცხრილიდან WHERE WHERE '.. $ formula.' <= ". $ მანძილი;

  51. 71
  52. 72

    დიდი მადლობა ამ სტატიის გადასაჭრელად. ძალიან გამოსადეგია.
    თავიდან შეიქმნა PHP, როგორც მარტივი სკრიფტინგის პლატფორმა, სახელწოდებით "პირადი საწყისი გვერდი". დღესდღეობით PHP (მოკლე სიტყვა Hypertext Preprocessor) წარმოადგენს Microsoft- ის Active Server Pages (ASP) ტექნოლოგიის ალტერნატივას.

    PHP არის სერვერის ღია წყაროს ენა, რომელიც გამოიყენება დინამიური ვებ – გვერდების შესაქმნელად. ის შეიძლება ჩაირთოს HTML– ში. PHP ჩვეულებრივ გამოიყენება MySQL მონაცემთა ბაზასთან ერთად Linux / UNIX სერვერებზე. ეს, ალბათ, ყველაზე პოპულარული სკრიპტული ენაა.

  53. 73

    მე აღმოვაჩინე, რომ გამოსავალი არ მუშაობს სწორად.
    უნდა შევცვალო:

    $ qqq = "SELECT *, (((acos (sin ((". $ გრძედი. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((". $ გრძედი. ”* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((”. $ გრძედი.” - ”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 :: აირჩიეთ (DB :: ნედლეული ("SELECT *, (((acos (sin ((". $ გრძედი. "* 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”, ”მისამართი”: ”939 W El Camino Real, Mountain View, CA”, ”lat”: 37.386337280273, ”lng”: - 122.08582305908, ”მანძილი”: 16079.294719663}, {“id”: 2, ”სახელი”: ”Amici East Coast Pizzeria”, ”მისამართი”: ”790 Castro St, Mountain View, CA”, ”lat”: 37.387138366699, ”lng”: -122.08323669434, ”მანძილი”: 16079.175940152}, {“id”: 3, ”სახელი”: ”Kapp's Pizza Bar & Grill”, ”მისამართი”: ”Castro St 191, Mountain View, CA”, ”lat”: 37.393886566162, ”Lng”: - 122.07891845703, ”მანძილი”: 16078.381373826}, {“id”: 4, ”სახელი”: ”მრგვალი მაგიდა პიცა: Mountain View”, ”მისამართი”: ”570 N Shoreline Blvd, Mountain View, CA”, ”Lat”: 37.402652740479, ”lng”: - 122.07935333252, ”მანძილი”: 16077.420540582}, {”id”: 5, ”name”: ”Tony & Alba's Pizza & Pasta”, ”მისამართი”: ”Escuela Ave 619, Mountain View, CA ”,” lat ”: 37.394012451172,” lng ”: - 122.09552764893,” მანძილი ”: 16078.563225154}, {“ id ”: 6,” name ”:” Oregano's Wood-Fired Pizza ”,” მისამართი ”:” 4546 El Camino Real, Los Altos, CA ”,” lat ”: 37.401725769043,” lng ”: - 122.11464691162,” მანძილი ”: 16077.937560795}, {“ id ”: 7,” name ”:” The bars and grills ”,” მისამართი ”:” 24 Whiteley Street, Manchester ”,” lat ”: 53.485118865967,” lng ”: - 2.1828699111938,” distance ”: 8038.7620112314}]

    მე მინდა მივიღო უბრალოდ რიგები 20 მილით, მაგრამ მას ყველა რიგი მოაქვს. გთხოვ, რას ვაკეთებ არასწორად

  56. 77

    მე ვეძებ მსგავს შეკითხვას, მაგრამ ცოტათი გავაძლიერე - მოკლედ ეს არის ყველა კოორდინატის დაჯგუფება თითოეული კოორდინატიდან 2 მილის მანძილზე და შემდეგ გამოვთვალოთ რამდენი კოორდინატი თითოეულ ჯგუფში და გამოვყოთ მხოლოდ ერთი ჯგუფი რომელსაც აქვს ყველაზე მეტი კოორდინატი - თუნდაც თქვენ გაქვთ ერთზე მეტი ჯგუფი იმ ჯგუფებს შორის, რომლებსაც აქვთ ყველაზე მეტი კოორდინატი - უბრალოდ გამოყავით შემთხვევითი ჯგუფი იმავე უდიდესი ჯგუფის ჯგუფებიდან -

რას ფიქრობთ?

ეს საიტი იყენებს Akismet- ს, რათა შეამციროს სპამი. შეისწავლეთ თქვენი კომენტარის მონაცემები დამუშავებული.