Այս ամիս ես բավականին շատ եմ ծրագրավորել PHP- ում և MySQL- ում `GIS- ի հետ կապված: Noանցը շրջելով ՝ ես իրականում դժվարանում էի գտնել աշխարհագրական որոշ հաշվարկներ ՝ գտնելու երկու վայրերի միջև հեռավորությունը, ուստի ուզում էի դրանք այստեղ տարածել:
Երկու կետերի միջև հեռավորության հաշվարկման պարզ ձևը Պյութագորասյան բանաձևի օգտագործումն է եռանկյան հիպոթենուսի հաշվարկի համար (A² + B² = C²): Սա հայտնի է որպես Էվկլիդյան հեռավորությունը.
Դա հետաքրքիր սկիզբ է, բայց այն չի տարածվում Աշխարհագրության մեջ, քանի որ լայնության և երկայնության գծերի միջև հեռավորությունը գտնվում է ոչ հավասար հեռավորություն բացի Հասարակածին մոտենալուն պես լայնության գծերն ավելի հեռու են իրարից: Եթե դուք օգտագործում եք ինչ-որ պարզ պարզ եռանկյունացման հավասարություն, այն կարող է ճշգրիտ չափել հեռավորությունը մի վայրում, և ահավոր սխալ է մյուսում, Երկրի կորության պատճառով:
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 ՝ որոշակի հեռավորության վրա բոլոր գրառումները գտնելու համար հաշվարկ կատարելու համար: Այս օրինակում ես հարցնելու եմ 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 տեղակայված մանրածախ խանութի համար և այն շատ լավ է աշխատել:
Շատ շնորհակալ եմ կիսվելու համար: Սա հեշտ պատճենահանման աշխատանք էր և հիանալի է աշխատում: Դուք ինձ շատ ժամանակ եք խնայել:
Տեղեկատվական համակարգ C- ով տեղափոխվող բոլորի համար.
կրկնակի deg2rad (կրկնակի deg) {վերադարձ deg * (3.14159265358979323846 / 180.0); }
Հրապարակման շատ գեղեցիկ հատված - շատ լավ աշխատեց. Ես միայն ստիպված էի փոխել սեղանի անունը, որը պահում էր վերջին ժամանակահատվածում: Այն աշխատում է բավականին արագ մինչև .. Ես բավականին երկար թվով երկարատև երկարություններ ունեմ (<400), բայց կարծում եմ, որ դա լավ կշեռքավորվի: Հաճելի կայք նույնպես. Ես այն պարզապես ավելացրել եմ իմ del.icio.us հաշվին և պարբերաբար ստուգելու եմ այն:
Շատ շնորհակալություն Peter և Kerry: Եթե ցանկանում եք աշխատել GIS նախագծերի վրա, խորհուրդ կտամ հետևյալը.
Շատ շնորհակալ եմ
Ամբողջ օրը ես փնտրեցի հեռավորության հաշվարկները և գտա հարվերսինի ալգորիթմը ՝ շնորհակալություն ձեզ, որ օրինակ բերեցիք, թե ինչպես կարելի է այն տեղադրել sql հայտարարության մեջ: Շնորհակալություն և ողջույններ, Դանիել
Ուրախ եմ օգնել, ռելսեր ընկեր:
Այժմ ես փնտրում եմ «Պոլիգոնում» PHP ֆունկցիա, որը կտանի լայնության և երկայնության հաջորդական կոորդինատների զանգված և պարզելու, թե արդյոք այլ կետ պոլիգոնի ներսում է կամ դրսում:
Ես գտա այն հավասարումը ՝ պարզելու համար, արդյոք կետը բազմանկյունում է!
կարծում եմ, որ ձեր SQL- ին անհրաժեշտ է ունենալ հայտարարություն:
փոխարեն WHERE հեռավորության <= $ հեռավորությունը, որը կարող է անհրաժեշտ լինել
օգտագործել ՀԱVՈ distance հեռավորություն <= $ հեռավորություն
հակառակ դեպքում շնորհակալություն ինձ մի խումբ ժամանակ և էներգիա խնայելու համար:
Hi David,
Եթե դուք անում եք ցանկացած տիպի GROUP BY հայտարարություն, ձեզ հարկավոր է ՀԱՎԵԼ: Ես դա չեմ անում վերը նշված օրինակում:
Doug
MySQL 5.x- ի դրությամբ դուք չեք կարող օգտագործել մականունը WHERE կետում http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
Վերոնշյալ հարցումների մեջ ՈՒՄ-ի փոխարեն օգտագործեք HAVING
Շատ շնորհակալություն. Դուք մեծ աշխատանք եք կատարել: Դա այն է, ինչ ես իրականում ուզում եմ: Շատ շնորհակալություն.
Շատ շնորհակալ եմ այս ծածկագիրը կիսելու համար: Դա ինձ շատ ժամանակ խնայել է զարգացման համար: Նաև շնորհակալություն ձեր ընթերցողին մատնանշելու համար, որ MySQL 5.x- ի համար անհրաժեշտ է ՀԱVՈING հայտարարություն: Շատ օգտակար:
Ես երջանիկ եմ, որ ունեմ ընթերցողներ շատ ավելի խելացի, քան ես:
🙂
Վերոնշյալ բանաձևն ինձ շատ ժամանակ է խնայում: Շատ շնորհակալություն.
Ես նաև պետք է փոխեմ NMEA ձևաչափի և աստիճանի միջև: Ես այս URL- ում բանաձև գտա էջի ներքևում: http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
Ինչ-որ մեկը գիտի՞, թե ինչպես դա ճշտել:
Thank you!
Չարչարել
Բարեւ,
Մեկ այլ հարց. Կա՞ NMEA տողերի բանաձև, ինչպիսին է ստորև ներկայացվածը:
1342.7500, N, 10052.2287, Ե
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
Thanks,
Չարչարել
Նաև գտա, որ WHERE- ն ինձ համար չի աշխատում: Այն փոխեց HAVING- ի և ամեն ինչ կատարյալ է գործում: Սկզբում ես չէի կարդում մեկնաբանությունները և վերաշարադրում այն ՝ օգտագործելով տեղադրված ընտրյալ: Երկուսն էլ լավ կաշխատեն:
Շատ շնորհակալ եմ mysql- ով գրված սցենարի համար, պարզապես ստիպված եղա մի քանի աննշան ճշգրտումներ կատարել (ՈՒՆԵԼՈՒ)
Մեծ աշխատանք
Անհավատալիորեն օգտակար, շատ շնորհակալ եմ: Ես որոշ խնդիրներ ունեի նոր «ՈՒՆԵԼՈՒ» հետ, այլ ոչ թե «ՈՐՏԵ», բայց մի անգամ կարդացի մեկնաբանությունները այստեղ (հիասթափությունից ատամներս մանրացնելուց = կես ժամ անց = P), ես այն լավ աշխատեցի: Շնորհակալ եմ ^ _ ^
շնորհակալություն շատ լավ է աշխատում
Հիշեք, որ նման ընտրված հայտարարությունը կլինի շատ հաշվարկային ինտենսիվ և, հետեւաբար, դանդաղ: Եթե դուք ունեք այդ հարցերից շատերը, ապա դրանք կարող են բավականին արագ խորտակվել:
Շատ ավելի քիչ ինտենսիվ մոտեցում է գործարկել առաջին (հում) ընտրությունը `օգտագործելով հաշվարկված հեռավորությամբ սահմանված 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 անգամ ՝ մեկ միլիոն անգամ:
Փոքր սխալ օրինակում… դա կլինի 50 կմ-ի սահմաններում (ոչ 100), քանի որ մենք նայում ենք մեր… հրապարակի «շառավղին»:
Ֆանտաստիկ խորհուրդ! Ես իրականում աշխատել եմ մի մշակողի հետ, որը գրել է մի ֆունկցիա, որը ձգում է ներսի քառակուսին, այնուհետև ռեկուրսիվ ֆունկցիա, որը ստիպում է «քառակուսիները» պարագծի շուրջ ներառել և բացառել մնացած կետերը: Արդյունքն անհավատալիորեն արագ արդյունք էր. Նա կարող էր գնահատել միլիոնավոր միավորներ միկրովայրկյանում:
Վերևում իմ մոտեցումը, անկասկած, «կոպիտ» է, բայց ունակ: Նորից շնորհակալություն!
Դուգ,
Ես փորձում էի օգտագործել mysql և php ՝ գնահատելու համար, թե արդյոք երկար երկար կետը բազմանկյունի մեջ է: Գիտե՞ք, արդյոք ձեր մշակող ընկերը օրինակներ է հրապարակել, թե ինչպես կատարել այս առաջադրանքը: Թե՞ գիտեք լավ օրինակներ: Նախապես շնորհակալություն.
Ողջույն բոլորին, սա իմ թեստային 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- ը ինձ ասում է, որ հեռավորությունը գոյություն չունի որպես սյունակ, ես կարող եմ ըստ պատվերի օգտագործել, ես դա կարող եմ անել առանց ՈՐՏԵ, և այն աշխատում է, բայց ոչ դրա հետ
«ՈՐՏԵ distance հեռավորությունը» փոխարինեք «ՈՒՆԵԼՈՒ հեռավորությամբ»:
Հմայքի պես է աշխատում, շնորհակալություն, Դուգլաս:
Սա հիանալի է, բայց ճիշտ այնպես, ինչպես թռչուններն են թռչում: Հիանալի կլիներ փորձել և ինչ-որ կերպ ներառել դրանում google maps API (գուցե օգտագործելով ճանապարհներ և այլն): Ես դեռ պետք է կատարեմ PHP- ում նմանակված կաղապարման գործառույթ, որը կկարողանա արդյունավետ լուծում առաջարկել ճանապարհորդող վաճառքի խնդրին: Բայց ես կարծում եմ, որ ես կարող եմ ի վիճակի լինել նորից օգտագործել ձեր որոշ կոդեր դա անելու համար:
Բարև Դուգլաս,
շատ շնորհակալ եմ այս հոդվածի համար. Դուք պարզապես շատ ժամանակ եք խնայել ինձ:
խնամել,
nimrod @ Իսրայել
Լավ հոդված Ես գտա շատ հոդվածներ, որտեղ նկարագրվում էր, թե ինչպես կարելի է հաշվարկել հեռավորությունը երկու կետերի միջև, բայց ես իսկապես փնտրում էի SQL հատված:
Շնորհակալություն շատ լավ է աշխատում
Շատ շնորհակալ եմ այս բանաձեւի համար: Որոշ ժամանակ սափրվեց խանութի տեղակայման նախագծի վրա, որն ինձ ուտում էր:
Շնորհակալություն մի կապոց: Կոդի այս փոքրիկ տողը զգալի ժամանակ խնայել է ինձ խանութի տեղակայման նախագծում:
# 1054 - Անհայտ սյունակի «հեռավորությունը» «որտեղ կետում»
հաստատում
Նույնը այստեղ! Ինչումն է խնդիրը :-/? ինչպե՞ս լուծել «հեռավորությունը». սյունակի խնդիրը: Օգնեք մեզ, խնդրում եմ !! 🙂
Փորձեք օգտագործել HAVING- ը WHERE- ի փոխարեն
2 օր հետազոտություն ՝ վերջապես գտնելու այս էջը, որը լուծում է իմ խնդիրը: Կարծես թե ավելի լավ է դուրս գամ իմ WolframAlpha- ից և մաքրեմ իմ մաթեմատիկան: WHERE- ից HAVING փոփոխությունը իմ սցենարը գործում է: ՇՆՈՐՀԱԿԱԼՈՒԹՅՈՒՆ
փոխարեն ՝ ՈՒՐ կետի օգտագործումը ՝
Հեռավորություն <50
Շնորհակալություն Գեորգի: Ես անընդհատ ստանում էի սյունակի «հեռավորությունը» չգտնված: Հենց որ փոխեմ ՈՐՏԵ to ունենալը, դա հմայքի պես աշխատեց:
Երանի սա լիներ այս էջի առաջին էջը: Շատ տարբեր հրահանգներ փորձելուց հետո սա միակն էր, որը ճիշտ աշխատեց, և անհրաժեշտ էր նվազագույն փոփոխություններ ՝ իմ սեփական տվյալների շտեմարանին համապատասխանելու համար:
Thanks a lot!
Երանի սա լիներ այս էջի առաջին էջը: Շատ տարբեր հրահանգներ փորձելուց հետո սա միակն էր, որը ճիշտ աշխատեց, և անհրաժեշտ էր նվազագույն փոփոխություններ ՝ իմ սեփական տվյալների շտեմարանին համապատասխանելու համար:
Thanks a lot!
Շատ շնորհակալություն!
Շատ շնորհակալություն!
Չեմ կարծում, որ ծածկագիրն այլևս չի ցուցադրվում: Գուցե Firefox- ն է:
Ես պարզապես փորձարկեցի թե Firefox- ում, թե Chrome- ում, և այն հայտնվում է: Նորից փորձե՞ք:
Ողջու՜յն. Շատ շնորհակալություն. Սա հմայքի պես է գործում:
Շատ շնորհակալ եմ Դուգլասից: Սա կատարյալ է աշխատում:
Ես գիտեմ, որ այս բանաձեւը գործում է, բայց ես չեմ կարող տեսնել, թե որտեղ է հաշվի առնվում երկրի շառավիղը: Խնդրում եմ, ինչ-որ մեկը կարո՞ղ է լուսավորել ինձ:
Թիմ, Haversine բանաձևի ամբողջական բացատրության համար (դա կոդ չէ), ստուգեք Վիքիպեդիայի հոդվածը. http://en.wikipedia.org/wiki/Haversine_formula
Գեղեցիկ Սա անչափ օգնել է ինձ:
Հիանալի իրեր Դուգլասը: Փորձե՞լ եք խաչմերուկի կետը ստանալ ՝ հաշվի առնելով երկու կետի Երկար / Լատ / Առանցք:
Դեռ դա չարած ես, Խանհ:
Շնորհակալություն Դուգլաս, SQL հարցումը հենց այն է, ինչ ինձ պետք էր, և ես մտածեցի, որ ինքս պետք է այն գրեի: Դուք ինձ փրկեցիք լայնության երկայնության ուսման հնարավոր ժամերի կորից:
Ես անընդհատ սխալ եմ ստանում. MySQL հարցման «Անհայտ» սյունակը «Որտեղ կետում»:
Պիտեր, խնդրում եմ կարդա մյուս մեկնաբանությունները: Պարզվում է, որ որոշ մարդիկ ստիպված են եղել օգտագործել այլ շարահյուսություն ՝ ՈՐՏԵ / ՈՒՆԻ:
Շնորհակալություն այս հիանալի հոդվածի համար: Պարզապես փորձարկեց կոդը իմ DB- ի վրա և հիանալի աշխատեց:
Դուգլաս, շնորհակալություն այս զարմանալի ծածկագրի համար: Իմ գլուխը կոտրել են, թե ինչպես դա անել իմ GPS համայնքի պորտալում: Դուք ինձ ժամեր եք խնայել:
Հիանալի է լսել, Ash!
շնորհակալություն այս օգտակար հոդվածը տեղադրելու համար,
բայց չգիտես ինչու կուզեի հարցնել
ինչպե՞ս ստանալ 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 հեռավորությունից> = «. $ Հեռավորություն»: >>>> կարո՞ղ եմ հեռավորությունը «հանել» այստեղից:
նորից շնորհակալություն,
Թիմմի Ս
դեմ չեմ, ես հասկացա, թե ինչպես է գործում «ֆունկցիան» php- ում
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
շատ շնորհակալություն!!
լավ, այն ամենը, ինչ ես փորձել եմ, չի գործում: Ես նկատի ունեմ այն, ինչ ես ունեմ, աշխատում է, բայց հեռավորությունները հեռու են:
Ինչ-որ մեկը կարո՞ղ է տեսնել, թե ինչն է սխալ այս ծածկագրում:
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)); }
Կանխավ շնորհակալ ենք Ձեր
Շնորհակալություն այս հոդվածի համար: Լավ աշխատում է իմ կոդով: 🙂
Հեյ Դուգլաս, հիանալի հոդված: Աշխարհագրական հասկացությունների և ծածկագրի վերաբերյալ ձեր բացատրությունը իսկապես հետաքրքիր էր: Իմ միակ առաջարկը կլինի տարածությունը և ցուցադրել կոդը ցուցադրման համար (օրինակ ՝ Stackoverflow, օրինակ): Ես հասկանում եմ, որ դուք ցանկանում եք խնայել տարածությունը, բայց սովորական կոդերի միջև տարածումը / խորացումը թույլ կտա ինձ, որպես ծրագրավորողի, ընթերցել և մասնատել շատ ավելի դյուրին: Համենայն դեպս, դա փոքր բան է: Շարունակեք մեծ աշխատանքը:
Շնորհակալություն Մի փոքր փոփոխել եմ գրառումը ... բայց հավասարումները շատ տեղ են զբաղեցնում և այնքան երկար են, որ համոզված չեմ, որ դա շատ է օգնում:
Շատ շնորհակալություն.
այստեղ ֆունկցիայի օգտագործման ժամանակ մենք ստանում ենք մեկ տիպի հեռավորություն ... միևնույն ժամանակ հարցումն օգտագործելով `գալիս է նաև դրա մյուս տիպի հեռավորությունը
Չեմ հաշվարկի հեռավորությունը երկու վիճակների միջև
Muchas gracias por tan hermoso codigo
Սա լավ կոսինուսի գործառույթներ է: Ես մաթեմատիկա չգիտեմ, բայց շնորհակալություն:
Մեծ աշխատանք y 🙂 (y)
ավելի արագ է թվում (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: ' որպես հեռավորություն սեղանից, ՈՒՐ ՝ «.. $ բանաձև»: <= '. $ հեռավորությունը;
շնորհակալություն
չի աշխատում, եթե
«ՈՐՏԵ distance հեռավորություն»
աշխատում է, եթե
«ՈՒՆԵԼԻ հեռավորություն»
Շատ շնորհակալություն այս հոդվածը կտրելու համար: այն շատ օգտակար է:
PHP- ն սկզբում ստեղծվել է որպես սցենարների պարզ պլատֆորմ, որը կոչվում է «Անհատական գլխավոր էջ»: Ներկայումս PHP- ը (Hypertext Preprocessor- ի համառոտումը) Microsoft- ի Active Server Pages (ASP) տեխնոլոգիայի այլընտրանք է:
PHP- ը սերվերի կողմից բաց աղբյուրի լեզու է, որն օգտագործվում է դինամիկ վեբ էջեր ստեղծելու համար: Այն կարող է ներդրվել HTML- ի մեջ: PHP- ն սովորաբար օգտագործվում է Linux / UNIX վեբ սերվերների MySQL տվյալների բազայի հետ համատեղ: Դա, թերեւս, ամենատարածված սցենարական լեզուն է:
Ես գտա վերը նշված լուծումը, որը ճիշտ չի աշխատում:
Ես պետք է փոխեմ հետևյալի.
$ 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) որպես «ռեգիստրից» հեռավորություն;
Շնորհակալություն Kupendra!
Շնորհակալություն, սըր հոյակապ ընթանալով ... բայց ես ունեմ մեկ հարց, եթե ուզում եմ թողարկել առանց տասնորդական կետի, ապա ի՞նչ կարող եմ անել:
Thanks in advance.
Ողջույն, խնդրում եմ, ես իսկապես ձեր օգնության կարիքը կունենամ այս հարցում:
Ես խնդրանքով դիմեցի իմ վեբ-սերվերին 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 մղոնով, բայց դրանք բերում են բոլոր շարքերը: Խնդրում եմ, ինչ եմ սխալ անում