
Հաշվեք կամ հարցում կատարեք լայնության և երկայնության կետերի միջև մեծ շրջանի հեռավորությունը՝ օգտագործելով Haversine բանաձևը (PHP, JavaScript, Java, Python, MySQL, MSSQL օրինակներ)
Այս ամիս ես բավականին շատ եմ ծրագրավորել PHP և MySQL համար GIS. Թեման ուսումնասիրելիս ես դժվարանում էի գտնել դրանցից մի քանիսը Աշխարհագրական հաշվարկներ երկու վայրերի միջև հեռավորությունը գտնելու համար, ուստի ես ուզում էի դրանք կիսել այստեղ:

Երկու կետերի միջև հեռավորության հաշվարկման պարզ ձևը Պյութագորասյան բանաձևի օգտագործումն է եռանկյան հիպոթենուսի հաշվարկի համար (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));
}
Փոփոխականներն են.
- $Latitude1 – փոփոխական ձեր առաջին գտնվելու վայրի լայնության համար:
- $Երկայնություն1 – փոփոխական ձեր առաջին գտնվելու վայրի երկայնության համար
- $Latitude2 – փոփոխական ձեր երկրորդ տեղանքի լայնության համար:
- $Երկայնություն2 – փոփոխական ձեր երկրորդ տեղանքի երկայնության համար:
- $ միավոր - լռելյայն լինելը մղոն. Սա կարող է թարմացվել կամ փոխանցվել որպես կիլոմետր.
Java. Հաշվեք տարածությունը լայնության և երկայնության 2 կետի միջև
public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
double theta = longitude1 - longitude2;
double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit.equals("miles")) {
return Math.round(distance, 2);
} else if (unit.equals("kilometers")) {
return Math.round(distance * 1.609344, 2);
} else {
return 0;
}
}
Փոփոխականներն են.
- լայնություն 1 – փոփոխական ձեր առաջին գտնվելու վայրի լայնության համար:
- երկայնություն 1 – փոփոխական ձեր առաջին գտնվելու վայրի երկայնության համար
- լայնություն 2 – փոփոխական ձեր երկրորդ տեղանքի լայնության համար:
- երկայնություն 2 – փոփոխական ձեր երկրորդ տեղանքի երկայնության համար:
- միավոր - լռելյայն լինելը մղոն. Սա կարող է թարմացվել կամ փոխանցվել որպես կիլոմետր.
Javascript. Հաշվեք տարածությունը լայնության և երկայնության 2 կետի միջև
function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
let theta = longitude1 - longitude2;
let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit == 'miles') {
return Math.round(distance, 2);
} else if (unit == 'kilometers') {
return Math.round(distance * 1.609344, 2);
}
}
Փոփոխականներն են.
- լայնություն 1 – փոփոխական ձեր առաջին գտնվելու վայրի լայնության համար:
- երկայնություն 1 – փոփոխական ձեր առաջին գտնվելու վայրի երկայնության համար
- լայնություն 2 – փոփոխական ձեր երկրորդ տեղանքի լայնության համար:
- երկայնություն 2 – փոփոխական ձեր երկրորդ տեղանքի երկայնության համար:
- միավոր - լռելյայն լինելը մղոն. Սա կարող է թարմացվել կամ փոխանցվել որպես կիլոմետր.
Python. Հաշվեք տարածությունը լայնության և երկայնության 2 կետի միջև
Ահա Python-ի բանաձևը երկու կետերի միջև հեռավորությունը հաշվարկելու համար (մղոնի ընդդեմ կիլոմետրի փոխարկման հետ միասին) կլորացված երկու տասնորդական թվերի: Շնորհավորում եմ իմ որդուն՝ Բիլ Կարին, որը տվյալների գիտնական է 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. Բոլոր գրառումների առբերումը որոշակի միջակայքում՝ հաշվարկելով հեռավորությունը մղոններով՝ օգտագործելով լայնությունը և երկայնությունը
MySQL-ում տարածական տվյալների տեսակների օգտագործումը աշխարհագրական տվյալների հետ աշխատելու ավելի արդյունավետ և հարմար միջոց է, ներառյալ կետերի միջև հեռավորությունները հաշվարկելը: MySQL-ն աջակցում է Տարածական տվյալների տեսակներին, ինչպիսիք են POINT
, LINESTRING
, եւ POLYGON
, ինչպես նաև տարածական գործառույթների հետ միասին ST_Distance
.
Երբ օգտագործում ես ST_Distance
գործառույթը MySQL-ում աշխարհագրական տվյալներով ներկայացված որպես POINT
կոորդինատները, այն հաշվի է առնում Երկրի մակերեսի կորությունը։ Օգտագործված գնդաձև մոդելը ST_Distance
օգտագործում է Haversine բանաձևը. Այս մոտարկումը հարմար է շատ գործնական նպատակների համար, բայց կարող է փոքր անճշտություններ առաջացնել շատ մեծ հեռավորությունների համար:
Ահա, թե ինչպես կարող եք հաշվարկել հեռավորությունները երկու կետերի միջև՝ օգտագործելով Տարածական տվյալների տեսակները.
- Ստեղծեք աղյուսակ՝ տարածական տվյալների տեսակովՍկզբում ստեղծեք աղյուսակ a
POINT
սյունակ՝ աշխարհագրական կետերը պահելու համար: Օրինակ:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Տեղադրեք ձեր աշխարհագրական կետերը այս աղյուսակում՝ օգտագործելով POINT
կոնստրուկտոր:
INSERT INTO locations (name, coordinates)
VALUES
('Point A', POINT(40.7128, -74.0060)), -- New York City
('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
- Հաշվեք հեռավորությունը՝ օգտագործելով ST_DistanceԴուք կարող եք հաշվարկել երկու կետերի միջև եղած հեռավորությունը՝ օգտագործելով
ST_Distance
ֆունկցիան։ Ահա մի հարցման օրինակ՝ երկու կետերի միջև հեռավորությունը հաշվարկելու համար.
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Փոխարինել 1
և 2
երկու կետերի ID-ներով, որոնց միջև դուք ցանկանում եք հաշվարկել հեռավորությունը:
- ԱրդյունքՀարցումը կվերադարձնի երկու կետերի միջև հեռավորությունը մղոններով:
Օգտագործելով տարածական տվյալների տեսակները և ST_Distance
ֆունկցիան ապահովում է MySQL-ում աշխարհագրական տվյալների հետ աշխատելու ավելի արդյունավետ և ճշգրիտ եղանակ: Այն նաև պարզեցնում է կետերի միջև հեռավորությունների հաշվարկը՝ հեշտացնելով ձեր տվյալների կառավարումն ու հարցումը:
MySQL. Բոլոր գրառումների առբերումը տիրույթում` կիլոմետրերով հեռավորությունը հաշվելով` օգտագործելով լայնությունը և երկայնությունը
Ըստ նախնականի ST_Distance
վերադարձնում է հեռավորությունը մետրերով, այնպես որ դուք պարզապես պետք է թարմացնեք հարցումը կիլոմետրերով.
SELECT
id1,
id2,
(ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
SELECT
l1.id AS id1,
l2.id AS id2,
l1.coordinates AS coordinates1,
l2.coordinates AS coordinates2
FROM
locations l1,
locations l2
WHERE
l1.id = 1 AND l2.id = 2
) AS distances;
Microsoft SQL Server Աշխարհագրական հեռավորություն. STDDistance
Եթե դուք օգտագործում եք Microsoft SQL Server, նրանք առաջարկում են իրենց սեփական գործառույթը, STD հեռավորություն երկու կետերի միջև հեռավորությունը հաշվարկելու համար՝ օգտագործելով Աշխարհագրություն տվյալների տեսակը:
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);
Գլխարկի հուշում Մանաշ Սահուին, փոխնախագահ և ճարտարապետ Highbridge.
Շատ շնորհակալ եմ կիսվելու համար: Սա հեշտ պատճենահանման աշխատանք էր և հիանալի է աշխատում: Դուք ինձ շատ ժամանակ եք խնայել:
Տեղեկատվական համակարգ 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Ո հայտարարություն: Շատ օգտակար:
Ես երջանիկ եմ, որ ունեմ ընթերցողներ շատ ավելի խելացի, քան ես:
🙂
Վերոնշյալ բանաձեւը շատ ժամանակ է խնայում ինձ: Շատ շնորհակալություն.
Ես նաև պետք է փոխեմ 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 = թիրախային լայնություն - լատդիֆ, lat2 = թիրախային + լատդիֆ, նման է լոնին: latdiff ~ = հեռավորություն / 111 (կմ), կամ հեռավորություն / 69 մղոն քանի որ լայնության 1 աստիճանը ~ 111 կմ է (չնչին փոփոխություն, քանի որ երկիրը փոքր-ինչ օվալ է, բայց բավարար է այդ նպատակի համար): londiff = հեռավորություն / (abs (կոս (deg2rad (լայնություն)) * 111)) - կամ 69 մղոն (դուք կարող եք իրականում վերցնել մի փոքր ավելի մեծ քառակուսի ՝ տատանումները հաշվի առնելու համար): Դրանից հետո վերցրեք դրա արդյունքը և կերակրեք այն ճառագայթային ընտրությամբ: Պարզապես մի մոռացեք հաշվի առնել սահմաններից դուրս կոորդինատները. Այսինքն `ընդունելի երկայնության տիրույթը -180-ից +180 է, իսկ ընդունելի լայնության միջակայքը` -90-ից +90 - այն դեպքում, երբ ձեր լատդիֆը կամ լոնդիֆը դուրս գան այս միջակայքից: , Նկատենք, որ շատ դեպքերում դա կարող է կիրառելի չլինել, քանի որ դա ազդում է միայն Խաղաղ օվկիանոսի միջով բևեռից բևեռ գծի վրա կատարվող հաշվարկների վրա, չնայած այն հատում է չուկոտկայի և Ալյասկայի մի մասը:
Այն, ինչին մենք հասնում ենք դրանով, միավորների քանակի զգալի կրճատումն է, որի դիմաց դուք կատարում եք այս հաշվարկը: Եթե տվյալների բազայում ունեք մեկ միլիոն գլոբալ միավոր բաշխված մոտավորապես հավասարաչափ և ցանկանում եք որոնել 100 կմ-ի սահմաններում, ապա ձեր առաջին (արագ) որոնումը 10000 քառակուսի կմ տարածք է և, հավանաբար, կտա մոտ 20 արդյունք (հիմնված հավասարաչափ բաշխման վրա մակերեսով մոտ 500 Մ 20 կմ), ինչը նշանակում է, որ այս հարցման համար դուք կատարում եք բարդ հեռավորության հաշվարկը XNUMX անգամ ՝ մեկ միլիոն անգամ:
Փոքր սխալ օրինակում… դա կլինի 50 կմ-ի սահմաններում (ոչ 100), քանի որ մենք նայում ենք մեր… հրապարակի «շառավղին»:
Ֆանտաստիկ խորհուրդ! Ես իրականում աշխատել եմ մի մշակողի հետ, որը գրել է մի ֆունկցիա, որը ձգում է ներսի քառակուսին և այնուհետև ռեկուրսիվ ֆունկցիա, որը ստիպում է «քառակուսիները» պարագծի շուրջ ներառել և բացառել մնացած կետերը: Արդյունքն անհավանական արագ արդյունք էր. Նա կարող էր գնահատել միլիոնավոր միավորներ միկրովայրկյանում:
Վերևում իմ մոտեցումը, անկասկած, «կոպիտ» է, բայց ունակ: Նորից շնորհակալություն!
Դուգ,
Ես փորձում էի օգտագործել mysql և php ՝ գնահատելու համար, արդյոք lat երկար կետը բազմանկյունի մեջ է: Գիտե՞ք, արդյոք ձեր մշակող ընկերը օրինակներ է հրապարակել, թե ինչպես կատարել այս առաջադրանքը: Թե՞ գիտեք լավ օրինակներ: Շնորհակալ եմ նախապես.
Ողջույն բոլորին, սա իմ թեստային 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.
Ողջույն, խնդրում եմ, ես իսկապես ձեր օգնության կարիքը կունենամ այս հարցում:
Ես խնդրանքով դիմեցի իմ վեբ-սերվերին
53.47792 = $ լայնություն
-2.23389 = $ երկայնություն
և 20 = հեռավորությունը, որը ես ուզում եմ ստանալ
Այնուամենայնիվ, օգտագործելով ձեր բանաձևը, այն առբերում է իմ db- ի բոլոր տողերը
$results = DB::select( DB::raw("SELECT *, ((acos(sin((".$ լայնություն."pi()/180)) * sin((latpi()/180))+cos((."$ լայնություն."pi()/180)) * cos((լատpi()/180)) * cos(((."$ երկայնություն."- lng)pi()/180))))180/pi ())601.1515*1.609344) որպես հեռավորություն FROM markers HAVING distance >= “.$distance ));
[{“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 մղոնով, բայց դրանք բերում են բոլոր շարքերը: Խնդրում եմ, ինչ եմ սխալ անում
Ես փնտրում եմ նմանատիպ հարց, բայց մի փոքր ավելացա: կարճ ասած ՝ սա յուրաքանչյուր կոորդինատից 2 մղոն հեռավորության վրա բոլոր կոորդինատների խմբավորումն է, այնուհետև հաշվել, թե քանի կոորդինատ յուրաքանչյուր խմբում և թողնել միայն մեկ խումբ, որն ունի ամենաշատ կոորդինատները, նույնիսկ եթե Դուք ունեք մեկից ավելի խումբ այն խմբերի մեջ, որոնք ունեն ամենաշատ կոորդինատները. պարզապես դուրս բերեք պատահական խումբը նույն ամենամեծ թվով խմբերից,
Շնորհակալություն բաժինների համար: