გამოთვალეთ ან გამოთვალეთ დიდი წრის მანძილი გრძედისა და განედის წერტილებს შორის Haversine ფორმულის გამოყენებით (PHP, Python, MySQL, MSSQL მაგალითები)

Haversine Formula - დიდი წრის მანძილი - PHP, Python, MySQL

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

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

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

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

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

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

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

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

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

ცვლადებია:

  • $Latitude1 – ცვლადი თქვენი პირველი მდებარეობის გრძედისთვის.
  • გრძედი $1 – ცვლადი თქვენი პირველი მდებარეობის გრძედისთვის
  • $Latitude2 – ცვლადი თქვენი მეორე მდებარეობის გრძედისთვის.
  • გრძედი $2 – ცვლადი თქვენი მეორე მდებარეობის გრძედისთვის.
  • $ ერთეული - ნაგულისხმევი არსება მილი. ეს შეიძლება განახლდეს ან გადაიცეს როგორც კილომეტრები.

პითონი: გამოთვალეთ მანძილი გრძედისა და განედის 2 წერტილს შორის

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

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)

ცვლადებია:

  • გრძედი 1 - ცვლადი თქვენი პირველი მდებარეობისთვის გრძედი.
  • გრძედი 1 - ცვლადი თქვენი პირველი მდებარეობისთვის გრძედი
  • გრძედი 2 – ცვლადი თქვენი მეორე მდებარეობისთვის გრძედი.
  • გრძედი 2 – ცვლადი თქვენი მეორე მდებარეობისთვის გრძედი.
  • ერთეულის - ნაგულისხმევი არსება მილი. ეს შეიძლება განახლდეს ან გადაიცეს როგორც კილომეტრები.

MySQL: ყველა ჩანაწერის მოძიება დიაპაზონში მანძილის გაანგარიშებით მილში გრძედი და გრძედი

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

MySQL: ყველა ჩანაწერის მოძიება დიაპაზონში კილომეტრებში მანძილის გამოთვლით გრძედი და განედი

აქ მოცემულია 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-ზე მეტი ადგილმდებარეობა მდებარეობს ჩრდილოეთ ამერიკაში და ის მშვენივრად მუშაობდა.

Microsoft SQL Server გეოგრაფიული მანძილი: STDistance

თუ თქვენ იყენებთ Microsoft SQL Server-ს, ისინი გთავაზობთ საკუთარ ფუნქციას, ST მანძილი გეოგრაფიის მონაცემთა ტიპის გამოყენებით ორ წერტილს შორის მანძილის გამოსათვლელად.

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 და არქიტექტორისთვის Highbridge.

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

  1. 1

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

  2. 2

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

  3. 4
  4. 5

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

  5. 8

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

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

  6. 10
  7. 11
  8. 12

    დიდი მადლობა ამ კოდის გაზიარებისთვის. ამან დამიზოგა განვითარების ბევრი დრო. ასევე, მადლობა თქვენს მკითხველებს, რომ აღნიშნეს, რომ HAVING განცხადება აუცილებელია 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-ს შორის და გრძედი lon1-სა და lon2-ს შორის“. lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, მსგავსი lon. latdiff ~= მანძილი / 111 (კმ-ისთვის), ან მანძილი/69 მილი, რადგან 1 გრადუსი გრძედი არის ~ 111 კმ (მცირე ცვალებადობა, რადგან დედამიწა ოდნავ ოვალურია, მაგრამ საკმარისია ამ მიზნისთვის). londiff = მანძილი / (abs(cos(deg2rad(გრძედი))*111)) — ან 69 მილისთვის (სინამდვილეში შეგიძლიათ აიღოთ ოდნავ უფრო დიდი კვადრატი, რათა გაითვალისწინოთ ვარიაციები). შემდეგ აიღეთ ამის შედეგი და შეიტანეთ რადიალურ არჩევანში. უბრალოდ არ დაგავიწყდეთ საზღვრებს გარეთ კოორდინატების გათვალისწინება – ანუ მისაღები გრძედის დიაპაზონი არის -180-დან +180-მდე და მისაღები განედების დიაპაზონი არის -90-დან +90-მდე - იმ შემთხვევაში, თუ თქვენი ლადიფი ან ლონდიფი გადის ამ დიაპაზონის მიღმა. . გაითვალისწინეთ, რომ უმეტეს შემთხვევაში ეს შეიძლება არ იყოს გამოყენებული, რადგან ის გავლენას ახდენს მხოლოდ წყნარი ოკეანის ხაზის გათვლებზე პოლუსიდან პოლუსამდე, თუმცა ის კვეთს ჩუკოტკას ნაწილს და ალასკას ნაწილს.

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

    • 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 maps 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 Query არის ზუსტად ის, რაც მჭირდებოდა და ვიფიქრე, რომ მე თვითონ მომიწევდა დაწერა. თქვენ გადამარჩინე გრძედი გრძედის სასწავლო მრუდის შესაძლოა საათობით!

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

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

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

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

  41. 60

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

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

    if(isset($_POST['გაგზავნილია'])){ $z = $_POST['zipcode']; $r = $_POST['რადიუსი']; echo “Results for “.$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( 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 ") ან die (mysql_error()); while($row = mysql_fetch_array($sql)) {$store1 = $row['MktName'].""; $store = $row['LocAddSt']."; $store .= $row['LocAddCity'].", ".$row ['LocAddState']." „.$row['zipcode']; $latitude1 = $row['lat']; $longitude1 = $row['lon']; $latitude2 = $row['y1']; $გრძივი2 = $რიგი['x1']; $city = $row['ქალაქი']; $state = $row['state']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = მანძილი ($lat1, $lon1, $lat2, $lon2); $დამოწმებული = $row['დამოწმებული']; if($verified == '1'){ echo ""; echo “”.$store.””; ექო $dis . ”მილი(ები) დაშორებით”; ექო ""; } else { echo "".$store.""; ექო $dis . ”მილი(ები) დაშორებით”; ექო ""; } }}

    ჩემი functions.php კოდი
    ფუნქცია getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $theta = $longitude1 – $longitude2; $მანძილი = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)) ); $დისტანცია = acos($დისტანცია); $მანძილი = rad2deg($დისტანცია); $დისტანცია = $დისტანცია * 60 * 1.1515; switch($unit) { case 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } დაბრუნება (მრგვალი($დისტანცია,2)); }

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

  42. 61
  43. 62

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

    • 63

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

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

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

  51. 71
  52. 72

    დიდი მადლობა ამ სტატიის წაკითხვისთვის. ეს ძალიან სასარგებლოა.
    PHP თავდაპირველად შეიქმნა, როგორც მარტივი სკრიპტირების პლატფორმა სახელწოდებით "პერსონალური საწყისი გვერდი". დღესდღეობით PHP (შორტი Hypertext Preprocessor-ისთვის) არის Microsoft-ის აქტიური სერვერის გვერდების (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(((" . $გრძედი . "- `longt`)*pi()/180) )))*180/pi())*60*1.1515) როგორც მანძილი FROM `რეგისტრაციიდან“;

  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) როგორც მანძილი FROM მარკერებიდან HAVING მანძილი >= „.$დისტანცია ));

    [{“id”:1,”სახელი”:”Frankie Johnnie & Luigo Too”,”მისამართი”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, ”დისტანცია”:16079.294719663},{“id”:2,”სახელი”:”Amici's East Coast Pizzeria”,”მისამართი”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”address”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, "lng":-122.07891845703,"distance":16078.381373826},{"id":4,"name":"მრგვალი მაგიდის პიცა: Mountain View","მისამართი":"570 N Shoreline Blvd, Mountain View, CA", ”lat”:37.402652740479,”lng”:-122.07935333252,”დისტანცია”:16077.420540582},{“id”:5,”სახელი”:”Tony & Alba's Pizza & Pasta”,”მისამართი 619 Escu”: ხედი, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”დისტანცია”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza:”Oregano's Wood-Fired Pizza,”4546address”37.401725769043 El Camino Real, Los Altos, CA”,”lat”:122.11464691162,”lng”:-16077.937560795,”დისტანცია”:7},{“ id”:24,”სახელი”:”ბარები და გრილები”,”მისამართი”:”უაითლის ქუჩა 53.485118865967, მანჩესტერი”,”lat”:2.1828699111938,”lng”:-8038.7620112314,”დისტანცია”:XNUMX]

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

  56. 77

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

რას ფიქრობთ?

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