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 տեղակայված մանրածախ խանութի համար և այն շատ լավ է աշխատել:

77 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ՈING հայտարարություն: Շատ օգտակար:

  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 = թիրախային լայնություն - latdiff, lat2 = targetlatitude + latdiff, նման է lon- ին: 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 ՝ գնահատելու համար, թե արդյոք երկար երկար կետը բազմանկյունի մեջ է: Գիտե՞ք, արդյոք ձեր մշակող ընկերը օրինակներ է հրապարակել, թե ինչպես կատարել այս առաջադրանքը: Թե՞ գիտեք լավ օրինակներ: Նախապես շնորհակալություն.

  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 մղոնով, բայց դրանք բերում են բոլոր շարքերը: Խնդրում եմ, ինչ եմ սխալ անում

  56. 77

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

Ինչ եք կարծում?

Այս կայքը օգտագործում է Akismet- ը սպամի նվազեցման համար: Իմացեք, թե ինչպես է ձեր տվյալները մշակվում.