تجزیه و تحلیل و آزمایشCRM و سیستم عامل های دادهابزار بازاریابی

با استفاده از فرمول Haversine (مثلاً PHP، جاوا اسکریپت، جاوا، پایتون، MySQL، MSSQL) فاصله دایره بزرگ بین نقاط طول و عرض جغرافیایی را محاسبه یا جستجو کنید.

در این ماه کمی برنامه نویسی کرده ام پی اچ پی و خروجی با توجه به سیستم اطلاعات جغرافیایی. با گشت و گذار در اطراف شبکه، در واقع به سختی توانستم برخی از آنها را پیدا کنم محاسبات جغرافیایی برای پیدا کردن فاصله بین دو مکان بنابراین من می خواستم آنها را در اینجا به اشتراک بگذارم.

نقشه پرواز اروپا با فاصله دایره ای بزرگ

روش ساده محاسبه فاصله بین دو نقطه استفاده از فرمول فیثاغورث برای محاسبه هیپوتنوز مثلث است (A² + B² = C²). این به عنوان شناخته می شود فاصله ی اقلیدسی.

این یک شروع جالب است اما در مورد جغرافیا صدق نمی کند زیرا فاصله بین خطوط طول و عرض جغرافیایی فاصله مساوی از هم ندارند. هرچه به خط استوا نزدیک می شوید، خطوط عرض جغرافیایی بیشتر از هم دور می شوند. اگر از یک معادله مثلثی ساده استفاده کنید، ممکن است به دلیل انحنای زمین، فاصله را در یک مکان به دقت و در مکان دیگر اشتباه اندازه گیری کند.

فاصله دایره بزرگ

مسیرهایی که مسافت های طولانی را در اطراف زمین طی می کنند به عنوان فاصله دایره بزرگ شناخته می شوند. یعنی... کوتاه ترین فاصله بین دو نقطه روی یک کره با نقاط روی نقشه مسطح متفاوت است. این را با این واقعیت ترکیب کنید که خطوط طول و عرض جغرافیایی با هم فاصله ندارند ... و شما یک محاسبه دشوار دارید.

در اینجا یک توضیح ویدیویی خارق العاده از نحوه کار Great Circles آورده شده است.

فرمول هاورسین

فاصله با استفاده از انحنای زمین در فرمول هاورسین گنجانده شده است که از مثلثات برای انحنای زمین استفاده می کند. وقتی فاصله بین 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 - متغیری برای طول جغرافیایی مکان دوم شما.
  • واحد $ - موجود پیش فرض مایل. این را می توان به روز کرد یا به عنوان ارسال کرد کیلومتر.

جاوا: محاسبه فاصله بین 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 - متغیری برای طول جغرافیایی مکان دوم شما.
  • واحد - موجود پیش فرض مایل. این را می توان به روز کرد یا به عنوان ارسال کرد کیلومتر.

جاوا اسکریپت: محاسبه فاصله بین 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 - متغیری برای طول جغرافیایی مکان دوم شما.
  • واحد - موجود پیش فرض مایل. این را می توان به روز کرد یا به عنوان ارسال کرد کیلومتر.

پایتون: محاسبه فاصله بین 2 نقطه عرض و طول جغرافیایی

به هر حال، در اینجا فرمول پایتون برای محاسبه فاصله بین دو نقطه (همراه با تبدیل مایل در مقابل کیلومتر) است که به دو رقم اعشار گرد شده است. به پسرم، بیل کار، که دانشمند داده است 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 برای محاسبه تمام رکوردها در یک فاصله خاص استفاده کرد. در این مثال، من قصد دارم MyTable را در MySQL پرس و جو کنم تا تمام رکوردهایی را که کمتر یا مساوی با متغیر $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 مکان در سراسر آمریکای شمالی استفاده کردیم و به زیبایی کار کرد.

فاصله جغرافیایی مایکروسافت SQL Server: STDistance

اگر از Microsoft SQL Server استفاده می کنید، آنها عملکرد خود را ارائه می دهند. فاصله ST برای محاسبه فاصله بین دو نقطه با استفاده از نوع داده جغرافیا.

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 کمک کرده است، بیش از ۵ میلیارد دلار در خرید و سرمایه‌گذاری Martech کمک کرده است و همچنان به راه‌اندازی پلتفرم‌ها و خدمات خود ادامه می‌دهد. او یکی از بنیانگذاران است Highbridge، یک شرکت مشاوره تحول دیجیتال. داگلاس همچنین نویسنده کتاب راهنمای Dummie و کتاب رهبری تجاری است.

مقالات مرتبط

78 نظرات

  1. از شما بسیار سپاسگزارم برای به اشتراک گذاری. این یک کار کپی و چسباندن آسان بود و عالی کار می کند. شما در وقت من صرفه جویی کرده اید
    FYI برای هر کسی که به C منتقل می شود:
    double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }

  2. پست بسیار خوبی بود - خیلی خوب کار کرد - فقط باید نام میزی را که lat-long را نگه می داشت تغییر دهم. خیلی سریع کار می کند. من تعداد معقولی کمی از lat-longs دارم (< 400) اما فکر می کنم این مقیاس به خوبی انجام می شود. سایت خوبی هم هست – من به تازگی آن را به حساب del.icio.us خود اضافه کردم و مرتباً آن را بررسی خواهم کرد.

    1. خوشحالم که کمک می کنم، دوست ریل!

      اکنون من در جستجوی یک تابع PHP 'in Polygon' هستم که آرایه ای از مختصات طول و عرض جغرافیایی ترتیب داده شده را می گیرد و متوجه می شود که آیا نقطه دیگری در داخل چند ضلعی است یا خارج از آن.

  3. من فکر می کنم SQL شما نیاز به یک عبارت داشتن دارد.
    به جای WHERE فاصله <= $distance ممکن است لازم باشد
    از HAVING فاصله <= $distance استفاده کنید

    در غیر این صورت از اینکه در وقت و انرژی من صرفه جویی کردید متشکرم.

  4. فرمول بالا در وقت من صرفه جویی زیادی می کند. بسیار از شما متشکرم.
    همچنین باید بین فرمت NMEA و Degrees سوئیچ کنم. من فرمولی را در این URL در پایین صفحه پیدا کردم. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html

    کسی میدونه چطوری میشه اینو تایید کرد؟

    متشکرم!
    لخت کردن

  5. همچنین متوجه شدم که WHERE برای من کار نمی کند. آن را به HAVING تغییر داد و همه چیز عالی کار می کند. در ابتدا نظرات را نخواندم و با استفاده از یک انتخاب تودرتو بازنویسی کردم. هر دو به خوبی کار خواهند کرد.

  6. فوق العاده مفید است، بسیار متشکرم! من به جای "WHERE" با "HAVING" جدید مشکل داشتم، اما وقتی نظرات اینجا را خواندم (بعد از حدود نیم ساعت ساییدن دندان هایم از ناامیدی = P)، متوجه شدم که به خوبی کار می کند. ممنون ^_^

  7. به خاطر داشته باشید که دستور انتخابی مانند آن از نظر محاسباتی بسیار شدید و در نتیجه کند خواهد بود. اگر تعداد زیادی از این سؤالات دارید، می تواند خیلی سریع همه چیز را باتلاق کند.

    یک رویکرد بسیار کم شدت این است که یک انتخاب اول (خام) را با استفاده از یک منطقه مربع تعریف شده توسط یک فاصله محاسبه شده اجرا کنید. lat1 = targetlatitude – latdiff، lat2 = targetlatitude + latdiff، مشابه با lon. latdiff ~= مسافت / 1 (برای کیلومتر)، یا مسافت / 2 برای مایل از آنجایی که 1 درجه عرض جغرافیایی ~ 2 کیلومتر است (تغییر جزئی چون زمین کمی بیضی شکل است، اما برای این منظور کافی است). londiff = فاصله / (abs(cos(deg111rad( عرض جغرافیایی))*69)) - یا 1 برای مایل (در واقع می توانید یک مربع کمی بزرگتر بگیرید تا تغییرات را در نظر بگیرید). سپس نتیجه آن را بگیرید و آن را به انتخاب شعاعی وارد کنید. فقط فراموش نکنید که مختصات خارج از محدوده را در نظر بگیرید – یعنی محدوده طول قابل قبول 111- تا 2+ و محدوده عرض جغرافیایی قابل قبول 111- تا 69+ – در صورتی که لاتدیف یا لوندیف شما خارج از این محدوده باشد. . توجه داشته باشید که در بیشتر موارد این ممکن است قابل اجرا نباشد زیرا فقط بر محاسبات روی یک خط از اقیانوس آرام از قطبی به قطب دیگر تأثیر می گذارد، اگرچه بخشی از چوکوتکا و بخشی از آلاسکا را قطع می کند.

    چیزی که ما با این کار انجام می دهیم کاهش قابل توجهی در تعداد نقاطی است که شما این محاسبه را با آنها انجام می دهید. اگر یک میلیون نقطه جهانی در پایگاه داده دارید که تقریباً به طور مساوی توزیع شده اند و می خواهید در 100 کیلومتر جستجو کنید، اولین جستجوی (سریع) شما در مساحت 10000 کیلومتر مربع است و احتمالاً حدود 20 نتیجه (بر اساس توزیع یکنواخت در یک مساحت حدود 500 میلیون کیلومتر مربع)، به این معنی که محاسبه فاصله پیچیده را به جای یک میلیون بار، 20 بار برای این پرس و جو انجام می دهید.

      1. توصیه فوق العاده! من در واقع با توسعه‌دهنده‌ای کار کردم که تابعی نوشت که مربع داخلی را می‌کشید و سپس یک تابع بازگشتی را نوشت که مربع‌هایی را در اطراف محیط ایجاد می‌کرد تا نقاط باقی‌مانده را شامل و حذف کند. نتیجه یک نتیجه فوق‌العاده سریع بود – او می‌توانست میلیون‌ها امتیاز را در میکروثانیه ارزیابی کند.

        رویکرد من در بالا قطعا "خام" اما توانا است. بازم ممنون

        1. داگ ،

          من سعی کردم از mysql و php برای ارزیابی اینکه آیا یک نقطه طولانی lat درون یک چند ضلعی قرار دارد استفاده کنم. آیا می‌دانید دوست توسعه‌دهنده شما نمونه‌هایی در مورد چگونگی انجام این کار منتشر کرده است یا خیر؟ یا نمونه های خوبی سراغ دارید. پیشاپیش ممنون

  8. سلام به همه این دستور 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 به من می گوید که فاصله، به عنوان یک ستون وجود ندارد، می توانم از order by استفاده کنم، می توانم آن را بدون WHERE انجام دهم، و کار می کند، اما نه با آن…

  9. این عالی است، با این حال درست مانند پرواز پرندگان است. خیلی خوب است که سعی کنید API نقشه های گوگل را به نحوی در این مورد بگنجانید (شاید با استفاده از جاده ها و غیره). من هنوز باید یک تابع بازپخت شبیه سازی شده در PHP ایجاد کنم که بتواند راه حلی کارآمد برای مشکل فروشنده دوره گرد ارائه دهد. اما من فکر می کنم که ممکن است بتوانم از برخی از کدهای شما برای این کار مجدد استفاده کنم.

  10. مقاله خوب! من مقالات زیادی پیدا کردم که نحوه محاسبه فاصله بین دو نقطه را توضیح می دهد، اما من واقعاً به دنبال قطعه SQL بودم.

  11. 2 روز تحقیق کردم تا بالاخره این صفحه را پیدا کنم که مشکل من را حل کند. به نظر می رسد بهتر است WolframAlpha خود را کنار بگذارم و ریاضیاتم را بررسی کنم. تغییر از WHERE به HAVING اسکریپت من را در حالت کار قرار داده است. متشکرم

  12. ای کاش این اولین صفحه ای بود که در این مورد پیدا می کردم. پس از آزمایش بسیاری از دستورات مختلف، این تنها دستوری بود که به درستی کار می کرد، و با حداقل تغییرات مورد نیاز برای تناسب با پایگاه داده خودم.
    خیلی ممنون!

  13. ای کاش این اولین صفحه ای بود که در این مورد پیدا می کردم. پس از آزمایش بسیاری از دستورات مختلف، این تنها دستوری بود که به درستی کار می کرد، و با حداقل تغییرات مورد نیاز برای تناسب با پایگاه داده خودم.
    خیلی ممنون!

  14. با تشکر از ارسال این مقاله مفید،  
    اما به دلایلی می خواهم بپرسم
    چگونه می توان فاصله بین کدهای داخل mysql db و کدهای وارد شده به php توسط کاربر را بدست آورد؟
    برای توضیح واضح تر:
    1. کاربر باید برای انتخاب داده های مشخص شده از db و همخوانی های خود کاربر، [id] را وارد کند.
    2. فایل php داده های هدف (کوردها) را با استفاده از [id] دریافت می کند و سپس فاصله بین کاربر و نقطه هدف را محاسبه می کند.

    یا می توانید به سادگی از کد زیر فاصله بگیرید؟

    $qry = "SELECT *,((acos(sin((".$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((". $latitude."*pi()/180)) * cos((`طول جغرافیایی`*pi()/180)) * cos((("$طولایی."- `طولایی`)*pi()/180) )))*180/pi())*60*1.1515*1.609344) به عنوان فاصله از «MyTable» WHERE فاصله >= ".$distance." >>>> آیا می توانم فاصله را از اینجا "بردارم"؟
    بازم ممنون
    تیمی اس

  15. باشه هر چی امتحان کردم جواب نمیده منظورم این است که آنچه من دارم کار می کند، اما فاصله ها بسیار دور است.

    آیا کسی احتمالاً می تواند ببیند مشکل این کد چیست؟

    if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['radius']; 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. city,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( 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) یا die (mysql_error())؛ while($row = mysql_fetch_array($sql )) {$store1 = $row['MktName'].""; $store = $row['LocAddSt']."; $store .= $row['LocAddCity']."، ".$row['LocAddState']." $row['zipcode']; $latitude1 = $row['lat']; $longitude1 = $row['lon']; $latitude2 = $row['y1']; $longitude2 = $row['x1']; $city = $row['city']; $state = $row['state']; $dis = getnew($latitude1، $longitude1، $latitude2، $longitude2، $unit = 'Mi'); // $dis = فاصله ($lat1, $lon1, $lat2, $lon2); $verified = $row['تأیید شده']; if($verified == '1'){ echo ""; echo "".$store.""; echo $dis . " خیلی دور"؛ پژواک ""؛ } else { echo "".$store.""; echo $dis . " خیلی دور"؛ پژواک ""؛ } }}

    کد من functions.php
    تابع getnew($latitude1، $longitude1، $latitude2، $longitude2، $unit = 'Mi') { $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 'Mi': break; مورد 'Km' : $distance = $distance * 1.609344; } return (round($distance,2)); }

    با تشکر از شما در پیشبرد

  16. هی داگلاس، مقاله عالی. توضیح شما در مورد مفاهیم جغرافیایی و کد بسیار جالب بود. تنها پیشنهاد من قرار دادن فاصله و تورفتگی کد برای نمایش است (مثلاً Stackoverflow). می‌دانم که شما می‌خواهید فضا را ذخیره کنید، اما فاصله‌گذاری / تورفتگی کد معمولی خواندن و تشریح آن را برای من، به عنوان یک برنامه‌نویس، بسیار آسان‌تر می‌کند. به هر حال، این یک چیز کوچک است. به کار عالی ادامه دهید.

  17. در اینجا هنگام استفاده از تابع با یک نوع فاصله دریافت می کنیم. در حالی که با استفاده از query نوع دیگری از فاصله آن را دریافت می کنیم

  18. به نظر می رسد سریعتر (mysql 5.9) استفاده از دو برابر فرمول در انتخاب و جایی که:
    $formula = "(((acos(sin((."$latitude."*pi()/180)) * sin((`Latitude`*pi()/180))+cos((."$latitude. "*pi()/180)) * cos((`طول جغرافیایی"*pi()/180)) * cos(((".$ طول جغرافیایی."- "طول جغرافیایی")*pi()/180)))) *180/pi())*60*1.1515*1.609344)”؛
    $sql = 'SELECT *, '.$formula.' به عنوان فاصله از جدول WHERE '..$formula.' <= '.$distance;

  19. با تشکر فراوان برای برش این مقاله، بسیار مفید است.
    PHP ابتدا به عنوان یک پلتفرم اسکریپت نویسی ساده به نام «صفحه اصلی شخصی» ایجاد شد. امروزه PHP (مخفف Hypertext Preprocessor) جایگزینی برای فناوری صفحات سرور فعال (ASP) مایکروسافت است.

    PHP یک زبان منبع باز سمت سرور است که برای ایجاد صفحات وب پویا استفاده می شود. می توان آن را در HTML جاسازی کرد. PHP معمولاً همراه با پایگاه داده MySQL در سرورهای وب لینوکس/یونیکس استفاده می شود. این احتمالاً محبوب ترین زبان برنامه نویسی است.

  20. من متوجه شدم راه حل بالا به درستی کار نمی کند.
    من باید تغییر کنم به:

    $qqq = "SELECT *,(((acos(sin((".$latitude."*pi()/180)) * sin((`latt`*pi()/180))+cos((" . $latitude . "*pi()/180)) * cos((`latt`*pi()/180)) * cos(((" . $Litude . "- `longt`)*pi()/180) )))*180/pi())*60*1.1515) به عنوان فاصله FROM `رجیستر` “;

  21. سلام، لطفا در این مورد واقعا به کمک شما نیاز دارم.

    من از وب سرورم درخواست دریافت کردم
    53.47792 = عرض جغرافیایی $
    -2.23389 = طول جغرافیایی $
    و 20 = فاصله ای که می خواهم بازیابی کنم

    با این حال، با استفاده از فرمول شما، تمام ردیف‌های db من را بازیابی می‌کند

    $results = DB::select( DB::raw("SELECT *, (((acos(sin((."$latitude."pi()/180)) * sin((latpi()/180))+cos((."$latitude."pi()/180)) * cos((latpi()/180)) * cos(((."$ طول جغرافیایی."- lng)pi()/180))))180/pi())601.1515*1.609344) به عنوان فاصله از نشانگرها دارای فاصله >= “.$distance ));

    [{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”address”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273،”lng”:-122.08582305908، ”distance”:16079.294719663},{“id”:2,”name”:”پیتزا فروشی ساحل شرقی آمیسی”,”آدرس”:”خیابان کاسترو 790, Mountain View, CA”,”lat”:37.387138366699،”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”address”:”191 Castro Street, Mountain View, CA,”lat”:37.393886566162 ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”پیتزای میز گرد: Mountain View”,”address”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”Address Mountain & Pasta”,619Ascu”: View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fred Pizza:”4546”address El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”distance”:16077.937560795},{“ id”:7,”name”:”کافه‌ها و کباب‌پزها”,”آدرس”:”خیابان وایتلی 24، منچستر”،”lat”:53.485118865967،”lng”:-2.1828699111938،”distance”:8038.7620112314]

    من می خواهم فقط ردیف هایی را با 20 مایل بازیابی کنم اما همه ردیف ها را می آورد. لطفا من چه غلطی می کنم

  22. من به دنبال یک پرس و جوی مشابه هستم، اما کمی افزایش یافته است - به طور خلاصه، این است که همه مختصات را در فاصله 2 مایلی از هر مختصات گروه بندی کنیم و سپس تعداد مختصات را در هر گروه بشماریم و تنها یک گروه را که بیشترین مختصات را دارد، خروجی بگیرم - حتی اگر شما بیش از یک گروه در میان گروه‌هایی دارید که بیشترین تعداد مختصات را دارند - به سادگی گروه تصادفی را از گروه‌هایی با همان بیشترین تعداد خروجی بگیرید.

شما چه فکر میکنید؟

این سایت از Akismet برای کاهش هرزنامه استفاده می کند. بدانید که چگونه نظر شما پردازش می شود.