Талдау және тестілеуCRM және деректер платформаларыМаркетинг құралдары

Haversine формуласын (PHP, JavaScript, Java, Python, MySQL, MSSQL мысалдары) пайдалана отырып, ендік пен бойлық нүктелері арасындағы үлкен шеңбер қашықтықты есептеңіз немесе сұраңыз.

Осы айда мен біршама бағдарламалаумен айналыстым PHP және MySQL құрметпен ГАЖ. Желіні ақтарып отырып, мен кейбірін табу қиынға соқты Географиялық есептеулер екі жердің арасындағы қашықтықты табу үшін осында бөліскім келді.

Еуропа ұшу картасы

Екі нүкте арасындағы қашықтықты есептеудің қарапайым әдісі - үшбұрыштың гипотенузасын есептеу үшін Пифагор формуласын қолдану (A² + B² = C²). Бұл белгілі Евклидтік қашықтық.

Бұл қызықты бастама, бірақ ол географияға қолданылмайды, өйткені ендік пен бойлық сызықтары арасындағы қашықтық бір-бірінен бірдей қашықтық емес. Экваторға жақындаған сайын ендік сызықтары бір-бірінен алшақтайды. Қарапайым триангуляция теңдеуін пайдалансаңыз, ол Жердің қисықтығына байланысты бір жерде қашықтықты дәл, ал екіншісінде қате өлшей алады.

Айналмалы арақашықтық

Жерді айналып өте ұзақ қашықтыққа жүретін жолдар Ұлы шеңбер қашықтығы деп аталады. Яғни... шардағы екі нүкте арасындағы ең қысқа қашықтық жазық картадағы нүктелерден ерекшеленеді. Мұны ендік пен бойлық сызықтарының бірдей қашықтықта еместігімен біріктіріңіз... және сізде қиын есептеу бар.

Мұнда керемет шеңберлердің қалай жұмыс істейтіні туралы фантастикалық бейне түсіндірме бар.

Гаверсин формуласы

Жердің қисаюын пайдаланатын қашықтық Жердің қисықтығына мүмкіндік беру үшін тригонометрияны пайдаланатын Гаверсин формуласына енгізілген. Жердегі 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: ендік пен бойлықты пайдаланып мильдегі қашықтықты есептеу арқылы диапазондағы барлық жазбаларды шығарып алу

Сондай-ақ, белгілі бір қашықтықтағы барлық жазбаларды есептеу үшін SQL пайдалануға болады. Бұл мысалда мен MySQL жүйесіндегі MyTable жүйесінде $latitude және $longitude орналасқан орныма дейін $distance (Милмен) айнымалы мәнінен аз немесе оған тең барлық жазбаларды табу үшін сұраймын:

Белгілі бір көлемдегі барлық жазбаларды алуға арналған сұраныс қашықтық ендік пен бойлықтың екі нүктесі арасындағы мильдегі қашықтықты есептеу арқылы:

$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 айнымалысы, онда мен нүктенің бойлығын өтіп жатырмын.
  • $ қашықтық - бұл сіз барлық жазбаларды аз немесе тең етіп тапқыңыз келетін қашықтық.
  • үстел - бұл кесте ... сіз оны кесте атауымен ауыстырғыңыз келеді.
  • ендік - бұл сіздің ендік өрісіңіз.
  • бойлық - бұл сіздің бойлық өрісіңіз.

MySQL: ендік пен бойлықты пайдаланып километрдегі қашықтықты есептеу арқылы диапазондағы барлық жазбаларды шығарып алу

Міне, 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-нан астам жері бар бөлшек сауда дүкені үшін қолданған кәсіпорынды картографиялық платформада қолдандым және ол өте жақсы жұмыс істеді.

Microsoft SQL серверінің географиялық қашықтығы: STDistance

Егер сіз Microsoft SQL серверін пайдалансаңыз, олар өз функцияларын ұсынады, STdistance География деректер түрін пайдаланып екі нүкте арасындағы қашықтықты есептеу үшін.

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

Манаш Саху, VP және сәулетшіге арналған шляпалар Highbridge.

Douglas Karr

Douglas Karr негізін қалаушы болып табылады Martech Zone және цифрлық трансформация бойынша танымал сарапшы. Дуглас бірнеше сәтті MarTech стартаптарын бастауға көмектесті, Martech сатып алулары мен инвестицияларына 5 миллиард доллардан астам қаржыны мұқият тексеруге көмектесті және өзінің жеке платформалары мен қызметтерін іске қосуды жалғастыруда. Ол негізін қалаушы Highbridge, цифрлық трансформация бойынша консалтингтік фирма. Дуглас сонымен қатар Dummie's guide және бизнес көшбасшылығы кітабының жарияланған авторы.

Қатысты Мақалалар

78 Пікірлер

  1. Бөліскеніңіз үшін көп рахмет. Бұл оңай көшірме және қою жұмысы болды және өте жақсы жұмыс істейді. Сіз мені көп уақытты үнемдедіңіз.
    C-ге көшетін кез келген адам үшін:
    қос градус (қос градус) {қайтару дәрежесі * (2 / 3.14159265358979323846); }

  2. Өте жақсы орналастыру бөлігі - өте жақсы жұмыс істеді - маған кестенің атауын тек лат-long деп өзгерту керек болды. Бұл өте жылдам жұмыс істейді. Менде ұзын саны аз (<400), бірақ менің ойымша, бұл масштаб жақсы болады. Жақсы сайт - мен оны del.icio.us аккаунтына жаңадан қостым және үнемі тексеріп отырамын.

  3. Мен sql операторына қалай қоюға мысал келтіргеніңіздің арқасында мен күндіз қашықтықтағы есептеулерді іздедім және гварверсин алгоритмін таптым. Даниял, рахмет және сәлем!

    1. Көмектескеніме қуаныштымын, досым!

      Енді мен «полигонда» PHP функциясын іздеймін, ол тізбектелген ендік пен бойлық координаттарының жиымын алады және басқа нүкте көпбұрыштың ішінде немесе сыртында орналасқанын анықтайды.

  4. менің ойымша, сіздің SQL-ге мәлімдеме керек
    WHERE арақашықтықтың орнына <= $ қашықтық қажет болуы мүмкін
    арақашықтық = = $ қашықтықты қолданыңыз

    әйтпесе маған уақыт пен энергияны үнемдегеніңіз үшін рақмет.

  5. Осы кодты бөліскеніңіз үшін көп рахмет. Бұл менің даму уақытымды үнемдеді. Сонымен, сіздің оқырмандарыңызға MySQL 5.x үшін HAVING тұжырымдамасы қажет екенін көрсеткені үшін рахмет. Өте пайдалы.

  6. Жоғарыдағы формула менің көп уақытымды үнемдейді. Көп рақмет.
    Мен NMEA форматы мен дәрежелер арасында ауысуым керек. Мен парақтың төменгі жағында осы URL мекен-жайынан формула таптым. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    Мұны қалай тексеруге болатынын біреу біле ме?

    Рақмет сізге!
    Гарри

  7. Мен сонымен бірге ҚАЙДА маған жұмыс істемейтінін анықтадым. Оны HAVING деп өзгертті және бәрі керемет жұмыс істейді. Алдымен мен түсініктемелерді оқымадым және оны ішкі таңдау арқылы қайта жаздым. Екеуі де жақсы жұмыс істейді.

  8. Керемет пайдалы, көп рахмет! Маған «ҚАЙДА» дегеннен гөрі жаңа «HAVING» -де қиындықтар болды, бірақ мен мұндағы пікірлерді оқыдым (жарты сағат ішінде тісімді қыжылдатып = P), мен оны жақсы жұмыс істедім. Рахмет ^ _ ^

  9. Ұқсас мәлімдеме өте қарқынды және сондықтан баяу болатынын ұмытпаңыз. Егер сізде көптеген сұрақтар болса, ол тез арада істі басуы мүмкін.

    Есептелген қашықтықпен анықталған SQUARE алаңын қолданып, бірінші (шикі) таңдауды жүргізу өте аз қарқынды тәсіл болып табылады, яғни «ені lat1 және lat2 арасындағы ендік және lon1 мен lon2 арасындағы бойлық» кестесінен * таңдаңыз. lat1 = targetlatitude - латдиф, lat2 = targetlatitude + latdiff, лонға ұқсас. латдифф ~ = қашықтық / 111 (км үшін), немесе қашықтық / 69 ендік дәрежесінен бастап миль үшін ~ 1 км құрайды (жер аздап сопақ болғандықтан сопақ, бірақ осы мақсат үшін жеткілікті). londiff = қашықтық / (abs (cos (deg111rad (ендік)) * 2)) - немесе 111 мильге (вариацияларды ескеру үшін сіз шынымен сәл үлкен квадрат ала аласыз). Содан кейін нәтижені алыңыз және оны радиалды таңдауға жіберіңіз. Шектен тыс координаттарды есепке алуды ұмытпаңыз, яғни сіздің латифіңіздің немесе лондифтіңіздің осы диапазоннан тыс шығуы жағдайында, яғни рұқсат етілген бойлық диапазоны -69-ден +180-ге дейін және қолайлы ендік -180-ден +90-ға дейін. . Көбінесе бұл мүмкін емес екенін ескеріңіз, өйткені ол тек мұхит арқылы полюстен полюске дейінгі сызық бойынша есептеулерге әсер етеді, бірақ ол чукотканың бөлігі мен алясканың бір бөлігін қиып өтеді.

    Біздің қолымыздан келетін нәтиже - сіз есептейтін нүктелер санының айтарлықтай азаюы. Егер сізде мәліметтер базасында миллионға жуық жаһандық ұпайлар біркелкі бөлінген болса және сіз 100 км қашықтықта іздегіңіз келсе, онда сіздің алғашқы (жылдам) іздеуіңіз 10000 шаршы км аумақты құрайды және шамамен 20 нәтиже береді (біркелкі таратуға негізделген) бұл шамамен 500 миллион шаршы км), демек, сіз бұл сұраныс үшін миллион рет емес, 20 рет күрделі қашықтықты есептейсіз.

    1. Мысалдағы кішігірім қателік ... бұл біздің 50 шаршы метрдің ішінде болады (100 емес), өйткені біз өзіміздің… квадраттың “радиусын” қарастырамыз.

      1. Керемет кеңес! Мен іс жүзінде ішкі квадратты тартатын функцияны, содан кейін периметр бойынша «квадраттар» құрған және қалған нүктелерді қосатын және шығаратын рекурсивті функцияны жазған әзірлеушімен жұмыс істедім. Нәтиже өте тез нәтиже болды - ол миллиондаған нүктелерді микросекундтарда бағалай алды.

        Менің жоғарыдағы көзқарасым «шикі», бірақ қабілетті. Тағы да рахмет!

        1. Даг,

          Lat ұзын нүктесінің көпбұрыш ішінде екенін бағалау үшін mysql және php-ді қолдануға тырыстым. Сіз өзіңіздің әзірлеуші ​​досыңыз осы тапсырманы қалай орындауға болатындығы туралы мысалдар жариялағанын білесіз бе. Немесе сіз жақсы мысалдарды білесіз бе. Алдын-ала рақмет.

  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 үзінділерін шынымен іздедім.

    1. Мен де! Қандай проблема бар: - /? «қашықтықты» қалай шешуге болады - Баған мәселесі? Бізге көмектесіңізші, өтінемін !! 🙂

  13. Менің проблемамды шешетін осы парақты табу үшін 2 күндік зерттеу. Менің WolframAlpha-ны өшіріп, математиканы тазартқан дұрыс сияқты. WHERE-ден HAVING-ге ауысу менің сценарийімнің жұмыс тәртібіне ие. РАҚМЕТ СІЗГЕ

    1. Рахмет Георгий. Мен «қашықтық» бағанын таба алмадым. Бірде мен ҚАЙЫРЫМДЫ БОЛУҒА ауыстырдым, ол очарование сияқты жұмыс жасады!

  14. Бұл менің осы жерден тапқан алғашқы бетім болғанын қалаймын. Әр түрлі командаларды қолданып көргеннен кейін, бұл дұрыс жұмыс істейтін жалғыз адам болды, ал минималды өзгертулермен менің жеке мәліметтер базасына сәйкес келуім керек болды.
    Көп рақмет!

  15. Бұл менің осы жерден тапқан алғашқы бетім болғанын қалаймын. Әр түрлі командаларды қолданып көргеннен кейін, бұл дұрыс жұмыс істейтін жалғыз адам болды, ал минималды өзгертулермен менің жеке мәліметтер базасына сәйкес келуім керек болды.
    Көп рақмет!

  16. Мен бұл формуланың жұмыс істейтінін білемін, бірақ мен жердің радиусы қай жерде ескерілетінін көре алмаймын. Мені біреу ағарта алады ма?

  17. осы пайдалы мақаланы орналастырғаныңызға рахмет,  
    бірақ мен қандай да бір себептермен сұрағым келеді
    mysql db ішіндегі координаттар мен пайдаланушының php-ге енгізген координаттар арасындағы қашықтықты қалай алуға болады?
    нақтырақ сипаттау үшін:
    1. пайдаланушыға DB және пайдаланушының координаттарынан көрсетілген деректерді таңдау үшін [id] енгізу қажет
    2. php файлы мақсатты деректерді (координаттарды) [id] көмегімен алады, содан кейін пайдаланушы мен мақсатты нүкте арасындағы қашықтықты есептейді

    немесе жай кодтан қашықтықты ала аласың ба?

    $ qry = “ТАҢДАУ *, (((acos (sin ((.. $ ендік.” * pi () / 180)) * sin ((`Latitude` * pi () / 180)) + cos ((“. $ ендік. ”* pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((“. $ longitude.” - `Longitude`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) арақашықтық ретінде 'MyTable` ҚАЙДА қашықтық> = “. $ Қашықтық.” >>>> осы жерден қашықтықты «шығарып» алсам бола ма?
    тағы да рахмет,
    Тимми С.

    1. ешқашан қарсы емеспін, мен «функцияның» php-да қалай жұмыс істейтінін білдім
      $ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
      көп рақмет!! 

  18. жарайды, мен көргендердің бәрі жұмыс істемейді. Менің айтарым, менде не бар, бірақ қашықтық алыс.

    Бұл кодтың дұрыс еместігін біреу көре ме?

    егер (isset ($ _ POST ['ұсынылған'])) {$ z = $ _POST ['индекс']; $ 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 mrk m, zip z1, zip z2 қайда m.zipcode = z1.zipcode AND z2.zipcode = $ z AND (3963 * acos (truncate (sin (z2.lat / 57.2958)) sin (m. 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 ()); while ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. «»; $ store = $ row ['LocAddSt']. ””; ”; $ store. = $ row ['LocAddCity']. ”,“. $ row ['LocAddState']. ” “. $ Row ['индекс']; $ width1 = $ row ['lat']; $ longitude1 = $ row ['lon']; $ width2 = $ row ['y1']; $ longitude2 = $ row ['x1']; $ city = $ row ['city']; $ state = $ row ['state']; $ dis = getnew ($ ендік1, $ бойлық1, $ ендік2, $ бойлық2, $ бірлік = 'Mi'); // $ dis = қашықтық ($ lat1, $ lon1, $ lat2, $ lon2); $ verified = $ row ['verified']; егер ($ verified == '1') {echo “”; echo “”. $ store. ””; echo $ dis. ”Миля (-лар) алыс”; жаңғырық “”; } else {echo “”. $ store. ””; echo $ dis. ”Миля (-лар) алыс”; жаңғырық “”; }}}

    Менің функцияларым.php коды
    getnew функциясы ($ Enlem1, $ бойлық1, $ ендік2, $ бойлық2, $ бірлік = 'Mi') {$ theta = $ бойлық1 - $ бойлық2; $ қашықтық = (sin (deg2rad ($ ендік1)) * sin (deg2rad ($ ендік2))) + (cos (deg2rad ($ ендік1)) * cos (deg2rad ($ ендік2)) * cos (deg2rad ($ тета)) ); $ қашықтық = acos ($ қашықтық); $ қашықтық = rad2deg ($ қашықтық); $ қашықтық = $ арақашықтық * 60 * 1.1515; switch ($ unit) {case 'Mi': break; іс 'Km': $ қашықтық = $ қашықтық * 1.609344; } return (дөңгелек ($ қашықтық, 2)); }

    Алдын-ала рақмет

  19. Сәлем, Дуглас, керемет мақала. Мен сізге географиялық ұғымдар мен кодтар туралы түсініктемелеріңізді өте қызықты көрдім. Менің жалғыз ұсынысым бос орынға шығару және көрсету үшін кодты шегіндіру болар еді (мысалы, Stackoverflow сияқты). Менің ойымша, сіз кеңістікті сақтағыңыз келеді, бірақ әдеттегі код аралықтары / шегіністері мен үшін бағдарламашы ретінде оқуды және бөлшектеуді жеңілдетер еді. Қалай болғанда да, бұл кішкентай нәрсе. Үлкен жұмысты жалғастырыңыз.

    1. Рахмет! Мен жазбаны сәл өзгерттім ... бірақ теңдеулер өте көп орын алады және ұзақ болғандықтан, оның тым көп көмектесетініне сенімді емеспін.

  20. Мұнда функцияны қолдану кезінде біз қашықтықтың бір түрін аламыз .. сұрау салу кезінде оның басқа қашықтық түрін аламыз

  21. таңдау кезінде екі есе формуланы қолдану жылдамырақ көрінеді (mysql 5.9):
    $ формула = “(((acos (sin ((.. $ ендік.” * pi () / 180)) * sin ((`Latitude` * pi () / 180)) + cos ((“. $ ендіктік. ”* Pi () / 180)) * cos ((` Latitude` * pi () / 180)) * cos (((“. $ Longitude.” - `Longitude`) * pi () / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) »;
    $ sql = 'SELECT *,'. $ формула. ' '.. $ формуласы ҚАДАҒЫ кестеден арақашықтық ретінде.' <= '. $ қашықтық;

  22. Осы мақаланың қырқылғанына көп рахмет, бұл өте пайдалы.
    PHP алғашында «Жеке үй беті» деп аталатын қарапайым сценарий платформасы ретінде құрылды. Қазіргі уақытта PHP (гипермәтіндік препроцессордың қысқасы) - бұл Microsoft корпорациясының Active Server Pages (ASP) технологиясының баламасы.

    PHP - бұл динамикалық веб-беттерді құру үшін қолданылатын серверге арналған ашық бастапқы тіл. Оны HTML-ге енгізуге болады. PHP әдетте Linux / UNIX веб-серверлеріндегі MySQL мәліметтер қорымен бірге қолданылады. Бұл сценарийлердің ең танымал тілі шығар.

  23. Жоғарыда шешім дұрыс жұмыс істемейтінін таптым.
    Маған өзгерту керек:

    $ qqq = “ТАҢДАУ *, (((acos (sin ((.. $ ендік.” * pi () / 180)) * sin ((`latt` * pi () / 180)) + cos ((”. $ ендік. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((”. $ longitude.“ - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) қашықтықтан FR 'regist` “;

  24. рахмет мырза өте жақсы сылап жатыр .. бірақ менде бір сұрақ бар, егер мен ондық нүктесіз шығарсам, онда не істей аламын ..?

    Алдын-ала рақмет.

  25. Сәлеметсіз бе, маған бұл мәселе бойынша сіздің көмегіңіз өте қажет болады.

    Мен веб-серверіме сұраныс жібердім
    53.47792 = $ ендік
    -2.23389 = $ бойлық
    және 20 = мен алғым келетін қашықтық

    Сіз формуланы қолдана отырып, ол менің db-дегі барлық жолдарды шығарады

    $нәтижелері = DB::select( DB::raw(“SELECT *, (((acos(sin((".$latitude."))pi()/180)) * sin((латpi()/180))+cos((“.$ ендік.”pi()/180)) * cos((латpi()/180)) * cos(((“.$бойлық.”- lng)pi()/180))))180/pi())601.1515*1.609344) қашықтығы бар маркерлерден қашықтық ретінде >= “.$дистанция ));

    [{«Id»: 1, «name»: «Frankie Johnnie & Luigo Too», «address»: «939 W El Camino Real, Mountain View, CA», «lat»: 37.386337280273, «lng»: - 122.08582305908, «Қашықтық»: 16079.294719663}, {«id»: 2, «name»: «Amici's East Coast Pizzeria», «address»: «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»: «Round Table Pizza: Mountain View», «address»: «570 N Shoreline Blvd, Mountain View, CA», «Лат»: 37.402652740479, «lng»: - 122.07935333252, «қашықтық»: 16077.420540582}, {«id»: 5, «name»: «Tony & Alba's Pizza & Pasta», «address»: «Escuela авеню, 619 View, CA «,» lat «: 37.394012451172,» lng «: - 122.09552764893,» қашықтық «: 16078.563225154}, {» id «: 6,» name «:» Oregano's Wood-Fire Pizza «,» address «:» 4546 El Camino Real, Los Altos, CA «,» lat «: 37.401725769043,» lng «: - 122.11464691162,» қашықтық «: 16077.937560795}, {» id «: 7,» name «:» Bars and grills «,» address «:» Уайтли көшесі, 24, Манчестер «,» лат «: 53.485118865967,» lng «: - 2.1828699111938,» арақашықтық «: 8038.7620112314}]

    Мен 20 мильдік жолдарды алғым келеді, бірақ ол барлық жолдарды алып келеді. Өтінемін, мен не істеп жатырмын?

  26. Мен ұқсас сұрауды іздеймін, бірақ біраз күшейе түстім - бұл әр координатадан 2 миль қашықтықта барлық координаттарды топтастыру, содан кейін әр топта қанша координат санау және координаттары бар бір топты шығару - тіпті Сізде координаттары көп топтар арасында бірнеше топ бар - кездейсоқ топты ең үлкен саны бар топтардан шығарыңыз -

Сен не ойлайсың?

Бұл сайт спамның төмендеуі үшін Akismet пайдаланады. Деректеріңіздің қалай өңделетінін біліңіз.