Վերլուծություն և թեստավորումCRM և տվյալների պլատֆորմներՇուկայավարման գործիքներ

Հաշվեք կամ հարցում կատարեք լայնության և երկայնության կետերի միջև մեծ շրջանի հեռավորությունը՝ օգտագործելով 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 բանաձևը. Այս մոտարկումը հարմար է շատ գործնական նպատակների համար, բայց կարող է փոքր անճշտություններ առաջացնել շատ մեծ հեռավորությունների համար:

Ահա, թե ինչպես կարող եք հաշվարկել հեռավորությունները երկու կետերի միջև՝ օգտագործելով Տարածական տվյալների տեսակները.

  1. Ստեղծեք աղյուսակ՝ տարածական տվյալների տեսակովՍկզբում ստեղծեք աղյուսակ 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
  1. Հաշվեք հեռավորությունը՝ օգտագործելով 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-ներով, որոնց միջև դուք ցանկանում եք հաշվարկել հեռավորությունը:

  1. ԱրդյունքՀարցումը կվերադարձնի երկու կետերի միջև հեռավորությունը մղոններով:

Օգտագործելով տարածական տվյալների տեսակները և 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.

Douglas Karr

Douglas Karr հիմնադիրն է Martech Zone և թվային փոխակերպման ճանաչված փորձագետ: Դուգլասը օգնել է հիմնել մի քանի հաջողակ MarTech ստարտափներ, օգնել է ավելի քան 5 միլիարդ ԱՄՆ դոլարի չափով ուսումնասիրություն կատարել Martech-ի ձեռքբերումների և ներդրումների համար և շարունակում է գործարկել իր սեփական հարթակներն ու ծառայությունները: Նա համահիմնադիր է Highbridge, թվային փոխակերպման խորհրդատվական ընկերություն։ Դուգլասը նաև հրատարակված է Dummie's ուղեցույցի և բիզնեսի առաջնորդության գրքի հեղինակ:

Առնչվող հոդվածներ

78 Comments

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

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

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

    1. Ուրախ եմ օգնել, ռելսեր ընկեր:

      Այժմ ես փնտրում եմ «Պոլիգոնում» PHP ֆունկցիա, որը կտանի լայնության և երկայնության հաջորդական կոորդինատների զանգված և պարզելու, թե արդյոք այլ կետ պոլիգոնի ներսում է կամ դրսում:

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

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

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

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

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

    Thank you!
    Չարչարել

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

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

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

    Շատ ավելի քիչ ինտենսիվ մոտեցում է գործարկել առաջին (հում) ընտրությունը `օգտագործելով հաշվարկված հեռավորությամբ սահմանված 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 անգամ ՝ մեկ միլիոն անգամ:

      1. Ֆանտաստիկ խորհուրդ! Ես իրականում աշխատել եմ մի մշակողի հետ, որը գրել է մի ֆունկցիա, որը ձգում է ներսի քառակուսին և այնուհետև ռեկուրսիվ ֆունկցիա, որը ստիպում է «քառակուսիները» պարագծի շուրջ ներառել և բացառել մնացած կետերը: Արդյունքն անհավանական արագ արդյունք էր. Նա կարող էր գնահատել միլիոնավոր միավորներ միկրովայրկյանում:

        Վերևում իմ մոտեցումը, անկասկած, «կոպիտ» է, բայց ունակ: Նորից շնորհակալություն!

        1. Դուգ,

          Ես փորձում էի օգտագործել mysql և php ՝ գնահատելու համար, արդյոք lat երկար կետը բազմանկյունի մեջ է: Գիտե՞ք, արդյոք ձեր մշակող ընկերը օրինակներ է հրապարակել, թե ինչպես կատարել այս առաջադրանքը: Թե՞ գիտեք լավ օրինակներ: Շնորհակալ եմ նախապես.

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

  11. Սա հիանալի է, բայց ճիշտ այնպես, ինչպես թռչուններն են թռչում: Հիանալի կլիներ փորձել և ինչ-որ կերպ ներառել դրանում google maps API (գուցե օգտագործելով ճանապարհներ և այլն): Ես դեռ պետք է կատարեմ PHP- ում նմանակված կաղապարման գործառույթ, որը կկարողանա արդյունավետ լուծում առաջարկել ճանապարհորդող վաճառքի խնդրին: Բայց ես կարծում եմ, որ ես կարող եմ ի վիճակի լինել նորից օգտագործել ձեր որոշ կոդեր դա անելու համար:

  12. Լավ հոդված Ես գտա շատ հոդվածներ, որտեղ նկարագրվում էր, թե ինչպես կարելի է հաշվարկել հեռավորությունը երկու կետերի միջև, բայց ես իսկապես փնտրում էի SQL հատված:

  13. 2 օր հետազոտություն ՝ վերջապես գտնելու այս էջը, որը լուծում է իմ խնդիրը: Կարծես թե ավելի լավ է դուրս գամ իմ WolframAlpha- ից և մաքրեմ իմ մաթեմատիկան: WHERE- ից HAVING փոփոխությունը իմ սցենարը գործում է: ՇՆՈՐՀԱԿԱԼՈՒԹՅՈՒՆ

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

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

  16. շնորհակալություն այս օգտակար հոդվածը տեղադրելու համար,  
    բայց չգիտես ինչու կուզեի հարցնել
    ինչպե՞ս ստանալ 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 հեռավորությունից> = «. $ Հեռավորություն»: >>>> կարո՞ղ եմ հեռավորությունը «հանել» այստեղից:
    նորից շնորհակալություն,
    Թիմմի Ս

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

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

    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)); }

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

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

  19. այստեղ ֆունկցիայի օգտագործման ժամանակ մենք ստանում ենք մեկ տիպի հեռավորություն ... միևնույն ժամանակ հարցումն օգտագործելով `գալիս է նաև դրա մյուս տիպի հեռավորությունը

  20. ավելի արագ է թվում (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: ' որպես հեռավորություն սեղանից, ՈՒՐ ՝ «.. $ բանաձև»: <= '. $ հեռավորությունը;

  21. Շատ շնորհակալություն այս հոդվածը կտրելու համար: այն շատ օգտակար է:
    PHP- ն սկզբում ստեղծվել է որպես սցենարների պարզ պլատֆորմ, որը կոչվում է «Անհատական ​​գլխավոր էջ»: Ներկայումս PHP- ը (Hypertext Preprocessor- ի համառոտումը) Microsoft- ի Active Server Pages (ASP) տեխնոլոգիայի այլընտրանք է:

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

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

    $ 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) որպես «ռեգիստրից» հեռավորություն;

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

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

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

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

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

փակել

Հայտնաբերվել է Adblock

Martech Zone կարող է անվճար տրամադրել ձեզ այս բովանդակությունը, քանի որ մենք դրամայնացնում ենք մեր կայքը գովազդից ստացված եկամուտների, փոխկապակցված հղումների և հովանավորությունների միջոցով: Մենք երախտապարտ կլինենք, եթե մեր կայքը դիտելիս հեռացնեիք ձեր գովազդային արգելափակիչը: