PHP և SQL. Հաշվել կամ հարցնել մեծ օղակի հեռավորությունը լայնության և երկայնքի կետերի միջև Haversine բանաձևով

Haversine Formula - Հաշվարկել շրջանագծի մեծ հեռավորությունը PHP- ի կամ MySQL- ի միջոցով

Այս ամիս ես բավականին շատ եմ ծրագրավորել PHP- ում և MySQL- ում `կապված GIS- ի հետ: Noանցը շրջելով ՝ իրականում դժվարանում էի գտնել դրանցից մի քանիսը Աշխարհագրական հաշվարկներ գտնել հեռավորությունը երկու վայրերի միջև, ուստի ես ուզում էի դրանք կիսել այստեղ:

Թռիչքների քարտեզը ՝ շրջանագծի մեծ հեռավորությամբ Եվրոպա

Երկու կետերի միջև հեռավորության հաշվարկման պարզ ձևը Պյութագորասյան բանաձևի օգտագործումն է եռանկյան հիպոթենուսի հաշվարկի համար (A² + B² = C²): Սա հայտնի է որպես Էվկլիդյան հեռավորությունը.

Դա հետաքրքիր սկիզբ է, բայց այն չի տարածվում Աշխարհագրության մեջ, քանի որ լայնության և երկայնության գծերի միջև հեռավորությունը գտնվում է ոչ հավասար հեռավորություն բացի Հասարակածին մոտենալուն պես լայնության գծերն ավելի հեռու են իրարից: Եթե ​​դուք օգտագործում եք ինչ-որ պարզ պարզ եռանկյունացման հավասարություն, այն կարող է ճշգրիտ չափել հեռավորությունը մի վայրում, և ահավոր սխալ է մյուսում, Երկրի կորության պատճառով:

Շրջանակի մեծ հեռավորություն

Երկրի շուրջ երկար տարածություններ անցած երթուղիները հայտնի են որպես Շրջանակի մեծ հեռավորություն, Դա a ոլորտի երկու կետերի միջեւ ամենակարճ հեռավորությունն այլ է, քան հարթ քարտեզի կետերը: Միացրեք դա այն փաստի հետ, որ լայնության և երկայնության գծերը հավասարաչափ հեռավորության վրա չեն…, և դուք ունեք դժվար հաշվարկ:

Ահա ֆանտաստիկ վիդեո բացատրություն, թե ինչպես են աշխատում «Մեծ շրջաններ» -ը:

Haversine բանաձևը

Երկրի կորությունը օգտագործող հեռավորությունը ներառված է Haversine- ի բանաձեւը, որն օգտագործում է եռանկյունաչափությունը ՝ երկրի կորությունը թույլ տալու համար: Երբ գտնում եք երկրի վրա 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 ՝ որոշակի հեռավորության վրա բոլոր գրառումները գտնելու համար հաշվարկ կատարելու համար: Այս օրինակում ես պատրաստվում եմ MySQL- ում հարցում կատարել MyTable- ում `գտնելու բոլոր գրառումները, որոնք պակաս կամ հավասար են փոփոխական $ հեռավորության (մղոններով) մինչև իմ գտնվելու վայրը $ լայնության և $ երկայնության վրա.

Հատուկ բոլոր գրառումները ստանալու համար հարցումը հեռավորություն լայնության և երկայնության երկու կետերի միջև մղոններով հեռավորությունը հաշվարկելով ՝

$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 Comments

  1. 1

    Շատ շնորհակալ եմ կիսվելու համար: Սա հեշտ պատճենահանման աշխատանք էր և հիանալի է աշխատում: Դուք ինձ շատ ժամանակ եք խնայել:
    Տեղեկատվական համակարգ C- ով տեղափոխվող բոլորի համար.
    կրկնակի deg2rad (կրկնակի deg) {վերադարձ deg * (3.14159265358979323846 / 180.0); }

  2. 2

    Հրապարակման շատ գեղեցիկ հատված - շատ լավ աշխատեց. Ես միայն ստիպված էի փոխել սեղանի անունը, որը պահում էր վերջին ժամանակահատվածում: Այն աշխատում է բավականին արագ մինչև .. Ես բավականին երկար թվով երկարատև երկարություններ ունեմ (<400), բայց կարծում եմ, որ դա լավ կշեռքավորվի: Հաճելի կայք նույնպես. Ես այն պարզապես ավելացրել եմ իմ del.icio.us հաշվին և պարբերաբար ստուգելու եմ այն:

  3. 4
  4. 5

    Ամբողջ օրը ես փնտրեցի հեռավորության հաշվարկները և գտա հարվերսինի ալգորիթմը ՝ շնորհակալություն ձեզ, որ օրինակ բերեցիք, թե ինչպես կարելի է այն տեղադրել sql հայտարարության մեջ: Շնորհակալություն և ողջույններ, Դանիել

  5. 8

    կարծում եմ, որ ձեր SQL- ին անհրաժեշտ է ունենալ հայտարարություն:
    փոխարեն WHERE հեռավորության <= $ հեռավորությունը, որը կարող է անհրաժեշտ լինել
    օգտագործել ՀԱVՈ distance հեռավորություն <= $ հեռավորություն

    հակառակ դեպքում շնորհակալություն ինձ մի խումբ ժամանակ և էներգիա խնայելու համար:

  6. 10
  7. 11
  8. 12

    Շատ շնորհակալ եմ այս ծածկագիրը կիսելու համար: Դա ինձ շատ ժամանակ խնայել է զարգացման համար: Նաև շնորհակալություն ձեր ընթերցողին մատնանշելու համար, որ MySQL 5.x- ի համար անհրաժեշտ է ՀԱVՈ հայտարարություն: Շատ օգտակար:

  9. 14

    Վերոնշյալ բանաձեւը շատ ժամանակ է խնայում ինձ: Շատ շնորհակալություն.
    Ես նաև պետք է փոխեմ NMEA ձևաչափի և աստիճանի միջև: Ես այս URL- ում բանաձև գտա էջի ներքևում: http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    Ինչ-որ մեկը գիտի՞, թե ինչպես դա ճշտել:

    Thank you!
    Չարչարել

  10. 15
  11. 16

    Ես նաև գտա, որ WHERE- ն ինձ համար չի աշխատում: Այն փոխեց HAVING- ի և ամեն ինչ կատարյալ է գործում: Սկզբում ես չէի կարդում մեկնաբանությունները և վերաշարադրում այն ​​՝ օգտագործելով տեղադրված ընտրյալ: Երկուսն էլ լավ կաշխատեն:

  12. 17
  13. 18

    Անհավատալիորեն օգտակար, շատ շնորհակալ եմ: Ես որոշ խնդիրներ ունեի նոր «ՈՒՆԵԼՈՒ» հետ, այլ ոչ թե «ՈՐՏԵ», բայց մի անգամ կարդացի մեկնաբանությունները այստեղ (հիասթափությունից ատամներս մանրացնելուց = կես ժամ անց = P), ես այն լավ աշխատեցի: Շնորհակալ եմ ^ _ ^

  14. 19
  15. 20

    Հիշեք, որ նման ընտրված հայտարարությունը կլինի շատ հաշվարկային ինտենսիվ և, հետեւաբար, դանդաղ: Եթե ​​դուք ունեք այդ հարցերից շատերը, ապա դրանք կարող են բավականին արագ խորտակվել:

    Շատ ավելի քիչ ինտենսիվ մոտեցում է գործարկել առաջին (հում) ընտրությունը `օգտագործելով հաշվարկված հեռավորությամբ սահմանված SQUARE տարածք, այսինքն` «ընտրեք * սեղանի անունից, որտեղ լայնությունը lat1- ի և lat2- ի և երկայնությունը lon1- ի և lon2- ի միջև»: lat1 = թիրախային լայնություն - լատդիֆ, lat2 = թիրախային + լատդիֆ, նման է լոնին: latdiff ~ = հեռավորություն / 111 (կմ), կամ հեռավորություն / 69 մղոն քանի որ լայնության 1 աստիճանը ~ 111 կմ է (չնչին փոփոխություն, քանի որ երկիրը փոքր-ինչ օվալ է, բայց բավարար է այդ նպատակի համար): londiff = հեռավորություն / (abs (կոս (deg2rad (լայնություն)) * 111)) - կամ 69 մղոն (դուք կարող եք իրականում վերցնել մի փոքր ավելի մեծ քառակուսի ՝ տատանումները հաշվի առնելու համար): Դրանից հետո վերցրեք դրա արդյունքը և կերակրեք այն ճառագայթային ընտրությամբ: Պարզապես մի մոռացեք հաշվի առնել սահմաններից դուրս կոորդինատները. Այսինքն `ընդունելի երկայնության տիրույթը -180-ից +180 է, իսկ ընդունելի լայնության միջակայքը` -90-ից +90 - այն դեպքում, երբ ձեր լատդիֆը կամ լոնդիֆը դուրս գան այս միջակայքից: , Նկատենք, որ շատ դեպքերում դա կարող է կիրառելի չլինել, քանի որ դա ազդում է միայն Խաղաղ օվկիանոսի միջով բևեռից բևեռ գծի վրա կատարվող հաշվարկների վրա, չնայած այն հատում է չուկոտկայի և Ալյասկայի մի մասը:

    Այն, ինչին մենք հասնում ենք դրանով, միավորների քանակի զգալի կրճատումն է, որի դիմաց դուք կատարում եք այս հաշվարկը: Եթե ​​տվյալների բազայում ունեք մեկ միլիոն գլոբալ միավոր բաշխված մոտավորապես հավասարաչափ և ցանկանում եք որոնել 100 կմ-ի սահմաններում, ապա ձեր առաջին (արագ) որոնումը 10000 քառակուսի կմ տարածք է և, հավանաբար, կտա մոտ 20 արդյունք (հիմնված հավասարաչափ բաշխման վրա մակերեսով մոտ 500 Մ 20 կմ), ինչը նշանակում է, որ այս հարցման համար դուք կատարում եք բարդ հեռավորության հաշվարկը XNUMX անգամ ՝ մեկ միլիոն անգամ:

    • 21
      • 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- ը ինձ ասում է, որ հեռավորությունը գոյություն չունի որպես սյունակ, ես կարող եմ ըստ պատվերի օգտագործել, ես դա կարող եմ անել առանց ՈՐՏԵ, և այն աշխատում է, բայց ոչ դրա հետ

  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

    Երանի սա լիներ այս էջի առաջին էջը: Շատ տարբեր հրահանգներ փորձելուց հետո սա միակն էր, որը ճիշտ աշխատեց, և անհրաժեշտ էր նվազագույն փոփոխություններ ՝ իմ սեփական տվյալների շտեմարանին համապատասխանելու համար:
    Thanks a lot!

  27. 40

    Երանի սա լիներ այս էջի առաջին էջը: Շատ տարբեր հրահանգներ փորձելուց հետո սա միակն էր, որը ճիշտ աշխատեց, և անհրաժեշտ էր նվազագույն փոփոխություններ ՝ իմ սեփական տվյալների շտեմարանին համապատասխանելու համար:
    Thanks a lot!

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

    Ես գիտեմ, որ այս բանաձեւը գործում է, բայց ես չեմ կարող տեսնել, թե որտեղ է հաշվի առնվում երկրի շառավիղը: Խնդրում եմ, ինչ-որ մեկը կարո՞ղ է լուսավորել ինձ:

  34. 49
  35. 50
  36. 52
  37. 53
  38. 55
  39. 56
  40. 58

    շնորհակալություն այս օգտակար հոդվածը տեղադրելու համար,  
    բայց չգիտես ինչու կուզեի հարցնել
    ինչպե՞ս ստանալ mysql db- ի ներսում կոորդինների և օգտագործողի կողմից php- ում տեղադրված կոորդինների միջև հեռավորությունը:
    ավելի հստակ նկարագրելու համար.
    1. օգտագործողը պետք է տեղադրի [id] db- ից և օգտագործողի կոորդիններից նշված տվյալներն ընտրելու համար
    2. php ֆայլը ստանում է նպատակային տվյալները (կոորդինատները) ՝ օգտագործելով [id], ապա հաշվարկում հեռավորությունը օգտագործողի և նպատակային կետի միջև

    կամ պարզապես կարող է պարզապես հեռավորություն ստանալ ներքևի ծածկագրից:

    $ qry = «SELECT *, (((acos (sin ((«. $ լայնություն. »* pi () / 180)) * sin ((« Latitude »* pi () / 180)) + cos ((«. $ լայնություն »: * pi () / 180)) * cos ((« Latitude »* pi () / 180)) * cos (((«. $ երկայնություն. »-« Երկայնություն ») * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) որպես հեռավորություն «MyTable» WHERE հեռավորությունից> = «. $ Հեռավորություն»: >>>> կարո՞ղ եմ հեռավորությունը «հանել» այստեղից:
    նորից շնորհակալություն,
    Թիմմի Ս

  41. 60

    լավ, այն ամենը, ինչ ես փորձել եմ, չի գործում: Ես նկատի ունեմ այն, ինչ ես ունեմ, աշխատում է, բայց հեռավորությունները հեռու են:

    Ինչ-որ մեկը կարո՞ղ է տեսնել, թե ինչն է սխալ այս ծածկագրում:

    if (Isset ($ _ POST ['ներկայացված']))) {$ z = $ _POST ['zipcode']; $ 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): քաղաք, 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 (մ. 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 ()); մինչդեռ ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']: ""; $ store = $ row ['LocAddSt'] ":"; $ store. = $ row ['LocAddCity']. ",". $ row ['LocAddState'] ": «. $ Row ['zipcode']; $ latitude1 = $ row ['lat']; $ longitude1 = $ row ['lon']; $ լայնություն 2 = $ տող ['y1']; $ երկայնություն 2 = $ տող ['x1']; $ քաղաք = $ տող ['քաղաք']; $ state = $ row ['state']; $ dis = getnew ($ լայնություն 1, $ երկայնություն 1, $ լայնություն 2, $ երկայնություն 2, $ միավոր = 'Մի'); // $ dis = հեռավորություն ($ lat1, $ lon1, $ lat2, $ lon2); $ verified = $ row ['վավերացված']; if ($ վավերացված == '1') {echo “”; echo "". $ խանութ. ""; արձագանք $ dis. " մղոն հեռավորության վրա"; արձագանք «»; } else {echo “”. $ store. ””; արձագանք $ dis. " մղոն հեռավորության վրա"; արձագանք «»; }}}

    իմ գործառույթները. php կոդը
    գործառույթ getnew ($ լայնություն 1, $ երկայնություն 1, $ լայնություն 2, $ երկայնություն 2, $ միավոր = 'Մի') {$ theta = $ երկայնություն 1 - $ երկայնություն 2; $ հեռավորություն = (sin (deg2rad ($ լայնություն 1)) * sin (deg2rad ($ լայնություն 2))) + + cos (deg2rad ($ լայնություն 1)) * cos (deg2rad ($ լայնություն 2)) * cos (deg2rad ($ թեթա)) ); $ հեռավորություն = ակոս ($ հեռավորություն); $ հեռավորություն = rad2deg ($ հեռավորություն); $ հեռավորություն = $ հեռավորություն * 60 * 1.1515; անջատիչ ($ միավոր) {case 'Mi': break; գործ 'Km': $ հեռավորություն = $ հեռավորություն * 1.609344; } վերադարձ (կլոր ($ հեռավորություն, 2)); }

    Կանխավ շնորհակալ ենք Ձեր

  42. 61
  43. 62

    Հեյ Դուգլաս, հիանալի հոդված: Աշխարհագրական հասկացությունների և ծածկագրի վերաբերյալ ձեր բացատրությունը իսկապես հետաքրքիր էր: Իմ միակ առաջարկը կլինի տարածությունը և ցուցադրել կոդը ցուցադրման համար (օրինակ ՝ Stackoverflow, օրինակ): Ես հասկանում եմ, որ դուք ցանկանում եք խնայել տարածությունը, բայց սովորական կոդերի միջև տարածումը / խորացումը թույլ կտա ինձ, որպես ծրագրավորողի, ընթերցել և մասնատել շատ ավելի դյուրին: Համենայն դեպս, դա փոքր բան է: Շարունակեք մեծ աշխատանքը:

  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- ի Active Server Pages (ASP) տեխնոլոգիայի այլընտրանք է:

    PHP- ը սերվերի կողմից բաց աղբյուրի լեզու է, որն օգտագործվում է դինամիկ վեբ էջեր ստեղծելու համար: Այն կարող է ներդրվել HTML- ի մեջ: PHP- ն սովորաբար օգտագործվում է Linux / UNIX վեբ սերվերների MySQL տվյալների բազայի հետ համատեղ: Դա, թերեւս, ամենատարածված սցենարական լեզուն է:

  53. 73

    Ես գտա վերը նշված լուծումը, որը ճիշտ չի աշխատում:
    Ես պետք է փոխեմ հետևյալի.

    $ qqq = "SELECT *, (((acos (sin ((". $ լայնություն. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos (("): $ լայնություն. "* pi () / 180)) * cos ((" latt "* pi () / 180)) * cos (((". $ երկայնություն. "-" longt ") * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) որպես «ռեգիստրից» հեռավորություն;

  54. 75
  55. 76

    Ողջույն, խնդրում եմ, ես իսկապես ձեր օգնության կարիքը կունենամ այս հարցում:

    Ես խնդրանքով դիմեցի իմ վեբ-սերվերին http://localhost:8000/users/findusers/53.47792/-2.23389/20/
    53.47792 = $ լայնություն
    -2.23389 = $ երկայնություն
    և 20 = հեռավորությունը, որը ես ուզում եմ ստանալ

    Այնուամենայնիվ, օգտագործելով ձեր բանաձևը, այն առբերում է իմ db- ի բոլոր տողերը

    $ արդյունքներ = 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) որպես հեռավորություն ՄԻ markՈՆԵՐԻ HA ՈՒՆԻ հեռավորություն = = ". $ Հեռավորություն));

    [{“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 East Coast Pizzeria”, ”հասցե”: ”790 Castro St, Mountain View, CA”, ”lat”: 37.387138366699, ”lng”: -122.08323669434, ”հեռավորությունը” `16079.175940152}, {“ id ”: 3,” name ”:” Kapp's Pizza Bar & Grill ”,” address ”:” 191 Castro St, Mountain View, CA ”,” lat ”: 37.393886566162, ”Lng”: - 122.07891845703, ”հեռավորությունը” `16078.381373826}, {“ id ”: 4,” name ”:” կլոր սեղան Պիցցա: Mountain View ”,” հասցե ”:” 570 N Shoreline Blvd, Mountain View, CA ”, ”Լատ” ՝ 37.402652740479, ”lng” ՝ - 122.07935333252, ”հեռավորություն” ՝ 16077.420540582}, {“id”: 5, ”անուն”: ”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 ”,” address ”:” 4546 El Camino Real, Los Altos, CA ”,” lat ”: 37.401725769043,” lng ”: - 122.11464691162,” հեռավորությունը ”: 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- ը սպամի նվազեցման համար: Իմացեք, թե ինչպես է ձեր տվյալները մշակվում.