پیدا کردن موقعیت جغرافیایی کاربر (در فایرفاکس 3.5)

تصویر مهدی

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

پیدا کردن موقعیت

در حال حاضر برای تشخیص موقعیت کاربر، معمولا از آدرس IP کاربر استفاده می شود و برای اینکار ابزارهای متفاوتی وجود دارد تا جایی که هم اکنون به سادگی میتوان به پایگاه داده های حاوی اطلاعات موقعیت IP های ثبت شده نیز دستری داشت (به عنوان نمونه http://ipinfodb.com را ببینید). اما مشکلی که استفاده از IP دارد اینست که دقت بسیار کمی دارد و فقط در مورد کامپیوترهای ثابت میتوان به آن اعتماد کرد و در مورد دستگاههای متحرک مانند موبایلها کاربردی ندارد و این درحالی است که قسمت هیجان انگیز این تکنولوژی کاربرد آن در دستگاههای متحرک خواهد بود و در مورد دستگاههای ثابت تحول چندانی ایجاد نخواهد کرد.
برای استفاده از سرویسهای موقعیت یابی در وب 2.0، استانداردهایی از طرف w3c در حال بررسی است که استفاده از آنها میتواند یک راهکار موقعیت یابی یکپارچه و اصولی برای انواع مختلف ابزارهای متصل به شبکه فراهم کند. این تکنولوژی در آخرین نسخه های مروگرهای اپرا و فایرفاکس پیاده سازی شده است. در اینجا توضیح مختصری بر شیوه استفاده از این تکنولوژی با استفاده از JavaScript میدهم و همچنین یک مثال نسبتا کامل ارایه میکنم. دقت کنید که کلیه کدهای توضیح داده شده در اینجا را توسط مرورگر فایرفاکس نسخه 3.5 آزمایش کرده ام.

مثال

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

روش استفاده

کلیه توابع مرتبط با این سرویس در شیء navigator.geolocation قرار گرفته است. برای استفاده ابتدا باید بررسی کرد این این شیء وجود دارد یا نه.

if(navigator.geolocation) {
	alert('مرورگر شما از سرویس موقعیت یابی پشتیبانی می کند.');
} else {
	alert('متاسفانه مرورگر شما قابلیت پشیبانی از سرویس موقعیت یابی را ندارد.');
}

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

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
        alert('عرض جغرافیایی: ' + position.coords.latitude +
            '\nطول جغرافیایی: ' + position.coords.longitude);
    });
} else {
    alert('متاسفانه مرورگر شما قابلیت پشیبانی از سرویس موقعیت یابی را ندارد.');
}

همچنین در صورت نیاز میتوان از تابع watchPosition استفاده کرد. این استفاده از تابع کاملا مشابه همان تابع getCurrentPosition است، با این تفاوت که در اینجا فقط یک بار موقعیت دریافت نمی شود و به طور پیوسته آخرین موقعیت کاربر با فراخوانی مجدد تابع اعلام می شود.
شیء position در مثال بالا خود شامل دو شیء timestamp و coords است. timestamp زمان خواندن موقعیت کاربر را نشان میدهد و coords (که در مثال بالا نیز از آن استفاده شد) مختصات کاربر را نشان می دهد. coords خود شامل اطلاعات زیر است:

  • latitude: عرض جغرافیایی کاربر بر حسب درجه
  • longitude: طور جغرافیایی کاربر برحسب درجه
  • altitude: ارتفاع فعلی کاربر از سطح دریا بر حسب متر (اگر پشتیبانی نشود، مقدار صفر برگردانده میشود)
  • accuracy: دقت اطلاعات موقعیت بر حسب متر
  • altitudeAccuracy: دقت اطلاعات ارتفاع بر حسب متر (اگر پشتیبانی نشود، مقدار صفر برگردانده میشود)
  • heading: جهت حرکت کاربر بر حسب درجه
  • speed: سرعت حرکت کاربر بر حسب متر بر ثانیه
  • if(navigator.geolocation) {
    	navigator.geolocation.getCurrentPosition(
    		function(position) {  
    			alert('زمان: ' + (new Date(position.timestamp)).toLocaleString() + '\n' +
    			    'عرض جغرافیایی: ' + position.coords.latitude + ' درجه\n' +
    				'طول جغرافیایی: ' + position.coords.longitude + ' درجه\n' +
    				'ارتفاع: ' + position.coords.altitude + ' متر\n' +
    				'دقت مختصات: ' + position.coords.accuracy + ' متر\n' +
    				'دقت ارتفاع: ' + position.coords.altitudeAccuracy + ' متر\n' +
    				'جهت حرکت: ' + position.coords.heading + ' درجه\n' +
    				'سرعت حرکت: ' + position.coords.speed + ' متر/ثانیه'
    				);
    		}
    	);
    } else {
    	alert('متاسفانه مرورگر شما قابلیت پشیبانی از سرویس موقعیت یابی را ندارد.');
    }
    

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

    • کد 0: خطای نامشخص (هر خطایی که شامل کدهای دیگر نباشد)
    • کد 1: خطای مجوز دسترسی (اجازه ارسال اطلاعات موقعیت داده نشده است)
    • کد 2: موقعیت نامشخص (موقعیت کاربر به علت وجود مشکلات در سیستم موقعیت یابی، تشخیص داده نشده است)
    • کد 3: timeout (اطلاعات موقعیت در زمانی که انتظار میرفت، دریافت نشده است)
    • if(navigator.geolocation) {
      	navigator.geolocation.getCurrentPosition(
      		function(position) {  
      			alert('مختصات: ' + position.coords.latitude + ':' + position.coords.longitude);
      		}, function(error) {
      			switch(error.code){
      			    case 0:
      			        alert('خطای نامشخص');
      			        break;
      			    case 1:
      			        alert('خطای مجوز دسترسی');
      			        break;
      			    case 2:
      			        alert('موقعیت نامشخص');
      			        break;
      			    case 3:
      			        alert('timeout');
      			        break;
      			}
      		}
      	);
      } else {
      	alert('متاسفانه مرورگر شما قابلیت پشیبانی از سرویس موقعیت یابی را ندارد.');
      }
      

      منابع

      برای تهیه این مطلب از منابع زیر کمک گرفته ام:

نظرات

تشکر

مهدی جان
واقعا جالب بود من تست کردم و IPسیستم رو با یه روش تغییر دادم که کاملا صحیح بود ولی نمیدونم چرارو نقشه صحیح نبود
دستت درد نکنه

یک غلط املایی(Typo)

عالی بود.ممنون.فقط...
در حال حاظر برای...---->در حال حاضر برای....
Typo

تصویر مهدی

بی سوادیه دیگه!

ممنون. هم از نظرتون و هم از تصحیح!
بیسوادی من رو ببخشید. من کلا با ض و ظ خیلی مشکل دارم. این مشکل رو با چپ و راست هم داشتم که به تازگی حل شده، دیگه وقتشه رو ض و ظ تمرین کنم! ;)

سلام

میبخشید من از بهقثبخطث4 نسخه بتا استفاده می کنم می خواستم ببینم این نسخه هم موردی رو که گفتید پشتیبانی می کنه؟

بی سوادی

اختیار داری قربان شما منبع سوادی ممنون از مطلب جالبت