اول سلام :)
این اولین نوشته ی من تو ویرگوله و اگه بدرد کسی هم خورد بیشتر خوشحال میشم :)
اگه برنامه نویس باشین، احتمالا خیلی وقتا و تو خیلی پروژه ها و یا قسمتی از یه پروژه لازم شده روی داده های جغرافیایی محاسباتی انجام بدین. مثلا ازتون خواسته باشن که یه وب اپلیکیشن توسعه بدین که داخلش کاربر بتونه نزدیکترین شعبه ی فلان فروشگاه رو روی نقشه ببینه و بدونه که چقدر فاصلشه. جالبه نه؟؟ چون اکثر اپلیکیشن ها و استارت آپ های این روزا دارن خدمات مبتنی بر موقعیت مکانی ارائه میدن و خیلی هم رو بورسه!
خب بریم سراغ یسری کانسپت ها :)
اولش باید بگم که داده ی موقعیت مکانی چیه!
اگه از ریاضیات چیزی خونده باشین که فکر میکنم اکثرا خوندین، احتمالا میدونین که روی صفحه ی مختصات، هر نقطه دوتا مولفه یا مشخصه داره. اونجوری که ما خوندیم و یاد گرفتیم این دوتا مولفه رو معمولا با دو متغیر X , Y مشخص میکنیم که تقاطع خطی که هر کدوم از این متغیر هارو قطع میکنه میشه موقعیت نقطه ی مورد نظر ما روی صفحه:
خب تو تصویر بالا میبینین که دوتا محور X , Y داریم. هر نقطه هم موقعیتش همونطور که قبلا گفتم با دو مولفه مشخص شده. مثلا نقطه ی (5 ، 4) یعنی 4 واحد روی محور X و 5 واحد روی محور Y حرکت کنیم که به این نقطه برسیم. این از مفهوم مختصات که البته خیلیاتون بلد بودین ولی خب گفتم بنویسم بهتره :)
حالا وقتی بخوایم فاصله ی بین دو نقطه رو روی محور پیدا کنیم چطوری باید اینکارو بکنیم؟؟
خب این کار به راحتی با فرمول زیر قابل انجامه (sqrt همون رادیکاله و علامت ^ همون توان) :
خب این فاصله دو نقطه در صفحه ی مختصات عادی رو میده بهمون!
حالا مختصات هر نقطه روی کره ی زمین هم همینطوره و یک طول و عرض جغرافیایی(Longitude & Latitude) داره. شاید الان فکر کردین که با همین فرمول میشه فاصله ی دو نقطه روی کره ی زمین رو هم حساب کرد اما باید بگم نه...
دلیل اینکه نمیشه اینکارو کرد کروی بودن و غیر صاف بودن زمینه. یعنی وقتی زمین قوس داره امکان اینکه فاصله رو انقدر راحت بدست بیارین نیست(البته میفهمین که راحته ولی نه انقدر دیگه :دی ).
فاصله ی دو نقطه روی سطح کره(بدون در نظر گرفتن پستی بلندی ها و فقط سطح صاف) از فرمول زیر محاسبه میشه :
مشخصه که هر متغیر معادل چه مقداریه. البته دلتا میشه اختلاف طول های جغرافیایی دو نقطه! R هم که میشه شعاع کره ی قشنگمون زمین :)
البته این رو هم بدونین که این فقط یکی از چند فرمول محاسبه هست و فرمول های دیگه با پرفورمنس های دیگه هم وجود داره که میتونین اینجا در موردشون بیشتر بخونین!
من در این نوشته از PHP استفاده میکنم و یک فانکشن(تابع ، متد) برای محاسبه ی فاصله ی دو نقطه مینویسم:
function getDistance($lat1, $lon1, $lat2, $lon2) { $rad = M_PI / 180; $radius = 6371; //earth radius in kilometers return acos(sin($lat2 * $rad) * sin($lat1 * $rad) + cos($lat2 * $rad) * cos($lat1 * $rad) * cos($lon2 * $rad - $lon1 * $rad)) * $radius; //result in Kilometers }
این فانکشن دقیقا فاصله ی بین دو نقطه رو به شما میده که میتونین با توجه به توابع مثلثاتی که استفاده شده در هر زبان برنامه نویسی دیگه ای هم اون رو پیاده سازی و استفاده کنین.
برای اینکه با محاسبات روی داده های جغرافیایی در MySQL هم بهتر و کاربردی تر آشنا بشین این لینک رو مطالعه کنین که حتما بدردتون میخوره :)
فکر کنم تا اینجا فعلا کافی باشه و بقیشو میسپارم به خودتون :)
با نظرتون من رو خوشحال تر کنین :)