Maps JavaScript API نسخه ۲ از ۲۶ مه ۲۰۲۱ دیگر دردسترس نیست. درنتیجه، نقشههای نسخه ۲ سایتتان ازکار خواهد افتاد و خطاهای جاوا اسکریپت برمیگرداند. برای ادامه استفاده از نقشهها در سایت خود، به
نسخه سوم API جاوا اسکریپت Maps مهاجرت کنید. این راهنما درطول فرایند به شما کمک خواهد کرد.
نمای کلی
فرایند انتقال هر برنامه کمی متفاوت خواهد بود؛
بااینحال، برخیاز مراحل برای همه پروژهها مشترک است:
- کلید جدیدی دریافت کنید. اکنون Maps JavaScript API از
کنسول Google Cloud برای مدیریت کلیدها استفاده میکند. اگر هنوز از کلید نسخه ۲ استفاده میکنید، حتماً قبلاز شروع انتقال،
کلید میانای برنامهسازی کاربردی جدید خود را دریافت کنید.
- «میانای برنامهسازی کاربردی» Bootstrap را بهروز کنید. بیشتر برنامهها
Maps JavaScript API v3 را با کد زیر بار میکنند:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- کدتان را بهروز کنید. میزان تغییرات لازم تا حد زیادی به برنامه شما بستگی دارد. تغییرات رایج عبارتاند از:
- همیشه به فضای نام google.maps ارجاع دهید. در نسخه ۳،
همه کدهای Maps JavaScript API بهجای فضای نام سراسری
در فضای نام
google.maps.*
ذخیره میشود. نام اکثر اشیاء نیز بهعنوان بخشی از این فرایند تغییر کرده است. برای مثال، بهجای GMap2، اکنون google.maps.Map را بار خواهید کرد.
- هرگونه اشاره به روشهای منسوخ را بردارید. تعدادی از روشهای کاربردی با هدف کلی برداشته شدهاند، مانند
GDownloadURL و GLog.
یا این عملکرد را با کتابخانههای ابزار شخص ثالث جایگزین کنید،
یا این ارجاعها را از کدتان بردارید.
- (اختیاری) کتابخانهها را به کدتان اضافه کنید. بسیاری از ویژگیها به کتابخانههای کمکی خارجی منتقل شدهاند تا هر برنامه فقط بخشهایی از میانای برنامهسازی کاربردی را که استفاده خواهد شد بار کند.
- (اختیاری) پروژهتان را برای استفاده از externs نسخه ۳ پیکربندی کنید.
از v3 externs میتوان برای کمک به اعتبارسنجی کد با
Closure
Compiler، یا برای راهاندازی تکمیل خودکار در IDE استفاده کرد.
درباره
«کامپایل پیشرفته» و «خارجیها» بیشتر بدانید.
- آزمایش و تکرار کنید. در این مرحله هنوز کارهایی برای انجام دادن دارید، اما خبر خوب این است که در مسیر درست برای رسیدن به برنامه نقشههای v3 جدیدتان هستید!
تغییرات در نسخه ۳ Maps JavaScript API
قبلاز برنامهریزی برای انتقال، باید زمانی را به درک تفاوتهای بین Maps JavaScript API v2 و Maps JavaScript API v3 اختصاص دهید. جدیدترین نسخه Maps JavaScript API از ابتدا نوشته شده است و بر تکنیکهای مدرن برنامهنویسی جاوا اسکریپت، افزایش استفاده از کتابخانهها و یک API سادهشده تمرکز دارد.
ویژگیهای جدید زیادی به API اضافه شده است و چندین
ویژگی آشنا تغییر کرده یا حتی حذف شده است. این بخش برخیاز تفاوتهای کلیدی بین این دو نسخه را برجسته میکند.
برخیاز تغییرات در v3 API عبارتاند از:
- کتابخانه هسته ساده و کارآمد. بسیاری از عملکردهای تکمیلی به
کتابخانهها منتقل شدهاند،
که به کاهش بار و زمان تجزیه برای Core API کمک میکند و باعث میشود
نقشه شما بهسرعت در هر دستگاهی بار شود.
- بهبود عملکرد چندین ویژگی، مانند پرداز چندضلعی و
جایگذاری نشانگر.
- رویکردی جدید برای
محدودیتهای استفاده
سمت کارخواه برای تطبیق بهتر با نشانیهای مشترک مورداستفاده
پراکسیهای تلفن همراه و دیوارهای آتش شرکتی.
- پشتیبانی از چندین مرورگر نو و مرورگر تلفن همراه اضافه شد. پشتیبانی از Internet Explorer 6 برداشته شده است.
- بسیاری از کلاسهای کمکی چندمنظوره (
GLog یا
GDownloadUrl) را حذف کردیم. امروزه، بسیاری از
کتابخانههای عالی جاوا اسکریپت وجود دارند که عملکرد مشابهی را ارائه میدهند،
مانند Closure یا
jQuery.
- پیادهسازی HTML5 «نمای خیابان» که در هر دستگاه همراهی بار میشود.
- تمامنماهای سفارشی
«نمای خیابان» با عکسهای خودتان، که به شما امکان میدهد
تمامنماهای پیستهای اسکی، خانههای فروشی، یا مکانهای جالب دیگر را همرسانی کنید.
- سفارشیسازیهای نقشههای قابلطراحی به شما امکان میدهد نمایش عناصر را در نقشه مبنا تغییر دهید تا با سبک دیداری منحصربهفرد شما مطابقت داشته باشد.
- پشتیبانی از چندین سرویس جدید، مانند
ElevationService
و Distance
Matrix.
- سرویس مسیرهای بهبودیافته، مسیرهای جایگزین، بهینهسازی مسیر (راهحلهای تقریبی برای
مسئله فروشنده دورهگرد)، مسیرهای دوچرخهسواری (با
لایه دوچرخهسواری)، مسیرهای حملونقل عمومی، و
مسیرهای کشیدنی را ارائه میدهد.
- قالب بهروزشده Geocoding که اطلاعات دقیقتری درباره
نوع
نسبتبه مقدار
accuracy از Geocoding API v2 ارائه میدهد.
- پشتیبانی از چند
پنجره
اطلاعات در یک نقشه
کلید جدید شما
Maps JavaScript API نسخه ۳ از سیستم کلید جدیدی نسبت به نسخه ۲ استفاده میکند. ممکن است ازقبل از کلید نسخه ۳ در برنامهتان استفاده کنید که دراینصورت نیازی به تغییر نیست. برای درستیسنجی، نشانی وبی را که از آن Maps JavaScript API را بار میکنید ازنظر پارامتر key بررسی کنید. اگر مقدار کلید با «ABQIAA» شروع میشود، از کلید نسخه ۲ استفاده میکنید. اگر کلید نسخه ۲ دارید، باید بهعنوان بخشی از انتقال به کلید نسخه ۳ ارتقا دهید،
که این کار:
این کلید هنگام بارگذاری نسخه سوم API جاوا اسکریپت Maps ارسال میشود.
درباره تولید کلیدهای API بیشتر بدانید.
توجه داشته باشید که اگر مشتری Google Maps APIs for Work هستید، ممکن است بهجای استفاده از پارامتر key، از شناسه کارخواه با پارامتر client استفاده کنید. شناسههای کارخواه هنوز در
Maps JavaScript API نسخه ۳ پشتیبانی میشوند و نیازی به گذراندن فرایند ارتقای کلید ندارند.
بار کردن میانای برنامهسازی کاربردی
اولین تغییری که باید در کدتان ایجاد کنید مربوط به نحوه بار کردن API است. در نسخه ۲، Maps JavaScript API را
ازطریق درخواست به
http://maps.google.com/maps بار میکنید. اگر
نسخه ۳ Maps JavaScript API را بار میکنید، باید تغییرات زیر را
اعمال کنید:
- بار کردن میانای برنامهسازی کاربردی از
//maps.googleapis.com/maps/api/js
- پارامتر
file را بردارید.
- پارامتر
key را با کلید v3 جدیدتان بهروز کنید. مشتریان Google Maps APIs for Work باید از پارامتر
client استفاده کنند.
- (فقط طرح Google Maps Platform Premium) بررسی کنید که پارامتر
client همانطور که در
راهنمای توسعهدهنده طرح Google Maps Platform Premium توضیح داده شده است،
ارائه شده باشد.
- پارامتر
v را بردارید تا جدیدترین نسخه منتشرشده را درخواست کنید یا مقدار آن را مطابق با طرح نسخهبندی v3 تغییر دهید.
- (اختیاری) پارامتر
hl را با language جایگزین کنید و مقدار آن را حفظ کنید.
- (اختیاری) پارامتر
libraries را برای بار کردن کتابخانههای اختیاری اضافه کنید.
در سادهترین حالت، راهانداز v3 فقط پارامتر کلید میانای برنامهسازی کاربردی شما را مشخص میکند:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
مثال زیر جدیدترین نسخه
Maps JavaScript API v2 را به زبان آلمانی درخواست میکند:
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
نمونه زیر درخواست معادل برای نسخه ۳ است.
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
فضای نام google.maps
احتمالاً قابلتوجهترین تغییر در Maps JavaScript API v3 معرفی فضای نام google.maps است. v2 API بهطور پیشفرض همه اشیاء را در فضای نام Global قرار میدهد که میتواند منجر به تداخل نامگذاری شود. در v3، همه اشیاء در فضای نام
google.maps قرار دارند.
هنگام انتقال برنامهتان به نسخه ۳، باید کدتان را تغییر دهید تا از فضای نام جدید استفاده کنید. متأسفانه جستجوی «G» و جایگزینی آن با «google.maps.» کاملاً کارساز نخواهد بود، اما این یک قاعده سرانگشتی خوب برای اعمال هنگام بازبینی کد شما است. در زیر چند نمونه از کلاسهای معادل در نسخه ۲ و ۳ آورده شده است.
| v2 |
v3 |
GMap2 |
google.maps.Map |
GLatLng |
google.maps.LatLng |
GInfoWindow |
google.maps.InfoWindow |
GMapOptions |
google.map.MapOptions |
G_API_VERSION |
google.maps.version |
GPolyStyleOptions |
google.maps.PolygonOptions or
google.maps.PolylineOptions |
برداشتن کد منسوخ
Maps JavaScript API v3 برای بیشتر عملکردهای v2 معادلهایی دارد؛ بااینحال، برخی کلاسها دیگر پشتیبانی نمیشوند. بهعنوان بخشی از انتقال، باید این کلاسها را با کتابخانههای ابزار شخص ثالث جایگزین کنید یا این ارجاعها را از کدتان بردارید. کتابخانههای جاوا اسکریپت عالی بسیاری وجود دارد که
عملکرد مشابهی ارائه میدهند، مانند Closure یا
jQuery.
کلاسهای زیر در نسخه ۳ میانای برنامهسازی کاربردی جاوا اسکریپت Maps موازی ندارند:
GBounds | GLanguage |
GBrowserIsCompatible | GLayer |
GControl | GLog |
GControlAnchor | GMercatorProjection |
GControlImpl | GNavLabelControl |
GControlPosition | GObliqueMercator |
GCopyright | GOverlay |
GCopyrightCollection | GPhotoSpec |
GDownloadUrl | GPolyEditingOptions |
GDraggableObject | GScreenOverlay |
GDraggableObjectOptions | GStreetviewFeatures |
GFactualGeocodeCache | GStreetviewLocation |
GGeoAddressAccuracy | GStreetviewOverlay |
GGeocodeCache | GStreetviewUserPhotosOptions |
GGoogleBar | GTileLayerOptions |
GGoogleBarAdsOptions | GTileLayerOverlayOptions |
GGoogleBarLinkTarget | GTrafficOverlayOptions |
GGoogleBarListingTypes | GUnload |
GGoogleBarOptions | GXml |
GGoogleBarResultList | GXmlHttp |
GInfoWindowTab | GXslt |
GKeyboardHandler | |
مقایسه کردن کد
در اینجا مقایسهای بین دو برنامه کاربردی که با میاناهای برنامهسازی کاربردی v2 و v3 نوشته شدهاند ارائه شده است.
<!DOCTYPE html>
<html>
<head>
<script src="//maps.google.com/maps?file=api&v=2&key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(
document.getElementById('map'));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
map.addOverlay(new GMarker(new GLatLng(37.4419, -122.1419)));
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="map"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: new google.maps.LatLng(37.4419, -122.1419),
map: map
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
همانطور که میبینید، تفاوتهای متعددی بین این دو برنامه وجود دارد. تغییرات قابلتوجه عبارتاند از:
- نشانیای که API از آن بار میشود تغییر کرده است.
- روشهای
GBrowserIsCompatible() و GUnload() دیگر در نسخه ۳ لازم نیستند و از میانای برنامهسازی کاربردی برداشته شدهاند.
- شیء
GMap2 با
google.maps.Map بهعنوان شیء مرکزی در API جایگزین شده است.
- مشخصات اکنون ازطریق کلاسهای «گزینهها» بار میشود. در مثال بالا، سه ویژگی لازم برای بار کردن نقشه را تنظیم میکنیم —
center، zoom، و mapTypeId
— بااستفاده از شیء
MapOptions
درونخطی.
- واسط کاربر پیشفرض بهطور پیشفرض در نسخه ۳ روشن است. میتوانید این را با
تنظیم کردن ویژگی
disableDefaultUI
روی true در شیء
MapOptions
غیرفعال کنید.
خلاصه
در این مرحله، با برخیاز نکات کلیدی
مربوط به انتقال از نسخه ۲ به نسخه ۳ میانای برنامهسازی کاربردی جاوا اسکریپت در Maps آشنا شدهاید.
اطلاعات بیشتری وجود دارد که ممکن است لازم باشد بدانید، اما این اطلاعات به برنامه شما بستگی دارد. در بخشهای زیر، دستورالعملهای انتقال را برای موارد خاصی که ممکن است با آنها مواجه شوید گنجاندهایم. علاوهبراین، چندین منبع وجود دارد
که ممکن است درطول فرایند ارتقا برایتان مفید باشد.
- نسخه سوم API جاوا اسکریپت Google Maps
اسناد توسعهدهندگان
بهترین مکان برای کسب اطلاعات بیشتر درباره API و نحوه عملکرد آن است.
- مرجع
نسخه سوم API جاوا اسکریپت Maps
به شما کمک میکند تا درباره کلاسها و روشهای جدید در نسخه سوم API بیشتر بدانید.
- انجمن Stack Overflow مکانی عالی برای پرسیدن سؤالات مربوط به کد است. در این سایت، پرسشها و پاسخهای مربوط به
Maps JavaScript API از برچسبهای
'google-maps'
یا 'google-maps-api-3'
استفاده میکنند.
- مشتریان «طرح Google Maps Platform Premium» باید
اسناد
طرح Google Maps Platform Premium را بخوانند.
- وبلاگ Google Geo Developers راهی عالی برای اطلاع از جدیدترین تغییرات API است.
اگر مشکل یا سؤالی درباره این سند دارید، از پیوند ارسال بازخورد در بالای این صفحه استفاده کنید.
این بخش مقایسه دقیقی از محبوبترین ویژگیهای
هر دو نسخه ۲ و ۳ از Maps JavaScript API ارائه میدهد. هر
بخش از مرجع بهگونهای طراحی شده است که بهطور جداگانه خوانده شود. توصیه میکنیم
این مرجع را بهطور کامل نخوانید؛ درعوض، از این
مطالب برای کمک به انتقال خود بهصورت موردی استفاده کنید.
- رویدادها - ثبت و رسیدگی به رویدادها.
- کنترلها - دستکاری کنترلهای ناوبری که روی نقشه ظاهر میشوند.
- رونهادها - افزودن و ویرایش اشیاء روی نقشه.
- انواع نقشه - کاشیهایی که نقشه پایه را تشکیل میدهند.
- لایهها - افزودن و ویرایش محتوا بهعنوان یک
گروه، مانند لایههای KML یا ترافیک.
- سرویسها - کار با زمینکدیابی Google،
مسیرها یا سرویسهای «نمای خیابان».
رویدادها
مدل رویداد برای Maps JavaScript API v3 مشابه مدل استفادهشده در v2 است،
اگرچه تغییرات زیادی در پشت صحنه رخ داده است.
رویداد جدید برای پشتیبانی MVC
v3 API نوع جدیدی از رویداد را برای نشان دادن تغییرات وضعیت MVC اضافه میکند. اکنون دو نوع رویداد وجود دارد:
- رویدادهای کاربر (مانند رویدادهای «کلیک» موشواره) از
DOM به Maps JavaScript API منتشر میشوند. این رویدادها جدا و
متمایز از رویدادهای استاندارد DOM هستند.
- اعلانهای تغییر وضعیت MVC منعکسکننده تغییرات در اشیاء Maps API هستند
و بااستفاده از قرارداد
property_changed
نامگذاری میشوند.
هر شیء Maps API تعدادی رویداد نامگذاریشده را صادر میکند. برنامههایی که به رویدادهای خاصی علاقه دارند باید شنوندگان رویداد را برای آن رویدادها ثبت کنند و هنگام دریافت آن رویدادها، کد را اجرا کنند. این
سازوکار رویدادمحور در هر دو Maps JavaScript API
v2 و v3 یکسان است، با این تفاوت که فضای نام
از GEvent به
google.maps.event تغییر کرده است:
GEvent.addListener(map, 'click', function() {
alert('You clicked the map.');
});
google.maps.event.addListener(map, 'click', function() {
alert('You clicked the map.');
});
برداشتن شنوندگان رویداد
بهدلایل عملکردی، بهتر است شنونده رویداد را وقتی دیگر به آن نیاز نیست بردارید. برداشتن شنونده رویداد در نسخه ۲ و نسخه ۳ به یک شکل انجام میشود:
- وقتی شنونده رویداد ایجاد میکنید، یک شیء مات (GEventListener
در نسخه ۲، MapsEventListener
در نسخه ۳) برگردانده میشود.
- وقتی میخواهید شنونده رویداد را بردارید، این شیء را به روش
removeListener() (GEvent.removeListener() در نسخه ۲ یا google.maps.event.removeListener() در نسخه ۳) ارسال کنید تا شنونده رویداد برداشته شود.
گوش دادن به رویدادهای DOM
اگر میخواهید رویدادهای DOM (مدل شیء سند) را ضبط کنید و به آنها پاسخ دهید،
نسخه ۳ روش ثابت google.maps.event.addDomListener() را ارائه میدهد که معادل روش GEvent.addDomListener()
در نسخه ۲ است.
استفاده از متغیرهای مستقل ارسالشده در رویدادها
رویدادهای میانای کاربر اغلب آرگومان رویدادی را ارسال میکنند که سپس شنونده رویداد میتواند به آن دسترسی داشته باشد. بیشتر آرگومانهای رویداد در نسخه ۳ ساده شدهاند تا با اشیاء در میانای برنامهسازی کاربردی سازگارتر باشند. (برای جزئیات، به
مرجع v3
مراجعه کنید.)
هیچ آرگومان overlay در شنوندگان رویداد نسخه ۳ وجود ندارد. اگر
رویداد click را در نقشه v3 ثبت کنید، فراخوانی برگشتی فقط
زمانی رخ میدهد که کاربر روی نقشه مبنا کلیک کند. اگر لازم است به این کلیکها واکنش نشان دهید، میتوانید
فراخوانهای برگشتی بیشتری را در همپوشانیهای کلیککردنی ثبت کنید.
// Passes an overlay argument when clicking on a map
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
GEvent.addListener(map,'click', function(overlay, latlng) {
if (latlng) {
var marker = new GMarker(latlng);
map.addOverlay(marker);
}
});
// Passes only an event argument
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
google.maps.event.addListener(map, 'click', function(event) {
var marker = new google.maps.Marker({
position: event.latLng,
map: map
});
});
کنترلها
Maps JavaScript API کنترلهای میانای کاربری را نمایش میدهد که به کاربران اجازه میدهد با
نقشه شما تعامل داشته باشند. میتوانید از میانای برنامهسازی کاربردی برای سفارشیسازی نحوه نمایش این کنترلها استفاده کنید.
تغییرات در انواع کنترل
برخیاز تغییرات در انواع control با
میانای برنامهسازی کاربردی نسخه ۳ معرفی شده است.
- v3 API از
انواع نقشه
بیشتری پشتیبانی میکند، ازجمله نقشههای ناهمواری و توانایی افزودن انواع نقشه سفارشی.
- کنترل سلسلهمراتبی نسخه ۲،
GHierarchicalMapTypeControl، دیگر دردسترس نیست.
بااستفاده از کنترل google.maps.MapTypeControlStyle.HORIZONTAL_BAR میتوانید به جلوه مشابهی دست پیدا کنید.
- چیدمان افقی ارائهشده توسط
GMapTypeControl
در نسخه ۲ در نسخه ۳ دردسترس نیست.
افزودن کنترلها به نقشه
با Maps JavaScript API v2، کنترلها را ازطریق روش addControl() شیء نقشه به نقشهتان اضافه میکنید. در نسخه ۳، بهجای دسترسی یا اصلاح مستقیم کنترلها،
شیء MapOptions مرتبط را اصلاح میکنید. نمونه
زیر نشان میدهد که چگونه نقشه را سفارشی کنید تا کنترلهای زیر را
اضافه کنید:
- دکمههایی که به کاربر امکان میدهد بین انواع نقشه موجود جابهجا شود
- مقیاس نقشه
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add controls
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add controls
mapTypeControl: true,
scaleControl: true
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
کنترلهای موقعیت روی نقشه
کنترلهای موقعیتیابی در نسخه ۳ تغییرات زیادی داشته است. در نسخه ۲،
روش addControl() پارامتر دوم اختیاریای را میگیرد
که به شما امکان میدهد موقعیت کنترل را نسبت به
گوشههای نقشه مشخص کنید.
در نسخه ۳، موقعیت کنترل را ازطریق ویژگی position گزینههای کنترل تنظیم میکنید. موقعیتیابی این کنترلها مطلق نیست؛ درعوض، API کنترلها را بهطور هوشمندانه با «جاری کردن» آنها در اطراف عناصر موجود نقشه در محدودیتهای دادهشده (مانند اندازه نقشه) طرحبندی میکند.
این چیدمان مطمئن میشود که کنترلهای پیشفرض با کنترلهای شما سازگار است.
برای اطلاعات بیشتر، به کنترل
موقعیتیابی در نسخه ۳ مراجعه کنید.
کد زیر کنترلها را از نمونههای بالا تغییر موقعیت میدهد:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add map type control
map.addControl(new GMapTypeControl(), new GControlPosition(
G_ANCHOR_TOP_LEFT, new GSize(10, 10)));
// Add scale
map.addControl(new GScaleControl(), new GControlPosition(
G_ANCHOR_BOTTOM_RIGHT, new GSize(20, 20)));
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add map type control
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_LEFT
},
// Add scale
scaleControl: true,
scaleControlOptions: {
position: google.maps.ControlPosition.BOTTOM_RIGHT
}
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
کنترلهای سفارشی
از Maps JavaScript API برای ایجاد کنترلهای ناوبری سفارشی استفاده کنید.
برای سفارشیسازی کردن کنترلها با میانای برنامهسازی کاربردی نسخه ۲، باید کلاس
GControl را زیرکلاس کنید و گردانندههایی برای روشهای
initialize() و getDefaultPosition() تعریف کنید.
معادلی برای کلاس GControl در نسخه ۳ وجود ندارد. درعوض،
کنترلها بهعنوان عناصر DOM نشان داده میشوند. برای افزودن کنترل سفارشی
با v3 API، ساختار DOM برای کنترل در
سازنده بهعنوان فرزند Node (مثلاً
عنصر <div>) ایجاد کنید و شنوندگان رویداد را برای رسیدگی به هرگونه
رویداد DOM اضافه کنید. Node را به آرایه controls[position] نقشهها اضافه کنید تا نمونهای از کنترل سفارشی به نقشهتان اضافه شود.
با فرض اینکه پیادهسازی کلاس HomeControl از الزامات میانای ذکرشده در بالا پیروی میکند (برای جزئیات، به سند کنترلهای سفارشی مراجعه کنید)، نمونه کدهای زیر نحوه افزودن کنترل سفارشی به نقشه را نشان میدهد.
map.addControl(new HomeControl(),
GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));
var homeControlDiv = document.createElement('DIV');
var homeControl = new HomeControl(homeControlDiv, map);
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(
homeControlDiv);
همپوشانی ها
لایههای رویی نشاندهنده اشیایی هستند که به نقشه «اضافه میکنید» تا نقاط،
خطوط، مناطق، یا مجموعههای اشیا را مشخص کنید.
افزودن و برداشتن همپوشانیها
انواع اشیایی که توسط Overlay نشان داده میشوند در نسخه ۲ و ۳ یکسان هستند، اما بهطور متفاوتی مدیریت میشوند.
در v2 API، بااستفاده از روشهای addOverlay() و removeOverlay() از شیء GMap2، همپوشانیها به نقشه اضافه و از آن برداشته میشدند. در نسخه ۳، بااستفاده از ویژگی map کلاس گزینههای رونهاد مرتبط، نقشهای را به «رونهاد» اختصاص میدهید.
همچنین میتوانید با فراخوانی روش setMap() شیء همپوشانی و مشخص کردن نقشه موردنظرتان، همپوشانی را مستقیماً اضافه یا حذف کنید. برای برداشتن همپوشانی، ویژگی نقشه را روی null تنظیم کنید.
هیچ روش clearOverlays() در نسخه ۳ وجود ندارد.
اگر میخواهید مجموعهای از همپوشانیها را مدیریت کنید، باید آرایهای برای نگهداری همپوشانیها ایجاد کنید. بااستفاده از این آرایه، میتوانید
setMap() را در هر رونهاد در آرایه فراخوانی کنید (اگر لازم است آنها را بردارید،
null را رد کنید).
نشانگرهای کشیدنی
بهطور پیشفرض، نشانگرها قابلکلیک هستند اما کشیدنی نیستند. دو نمونه زیر
نشانگر کشیدنی اضافه میکنند:
var myLatLng = new GLatLng(-25.363882, 131.044922);
var map = new GMap2(document.getElementById('map'));
map.setCenter(myLatLng, 4);
var marker = new GMarker(latLng, {
draggable: true
});
map.addOverlay(marker);
var myLatLng = new google.maps.LatLng(-25.363882, 131.044922);
var map = new google.maps.Map(
document.getElementById('map'), {
center: myLatLng,
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: myLatLng,
draggable: true,
map: map
});
نمادها
میتوانید نماد سفارشیای را برای نمایش بهجای نشانگر پیشفرض تعریف کنید.
برای استفاده از تصویر سفارشی در نسخه ۲، میتوانید یک نمونه GIcon
از G_DEFAULT_ICON type ایجاد کنید و آن را اصلاح کنید. اگر
تصویرتان بزرگتر یا کوچکتر از نماد پیشفرض است، باید
آن را با نمونه GSize
مشخص کنید.
میانای برنامهسازی کاربردی نسخه ۳ این فرایند را کمی سادهتر میکند.
کافی است ویژگی icon نشانگر را روی نشانی وب تصویر سفارشیتان تنظیم کنید تا API اندازه نماد را بهطور خودکار تغییر دهد.
Maps JavaScript API همچنین از نمادهای پیچیده پشتیبانی میکند.
نماد پیچیده ممکن است شامل چند کاشی، شکلهای پیچیده،
یا «ترتیب پشته» مشخصی باشد که نحوه نمایش تصاویر را نسبت به
سایر همپوشانیها تعیین میکند. برای افزودن شکل به نشانگر در نسخه ۲، باید
ویژگی اضافی را در هر نمونه GIcon مشخص کنید
و آن را بهعنوان گزینهای به سازنده GMarker
ارسال کنید. در نسخه ۳، نمادهای
مشخصشده به این روش باید ویژگیهای icon
خود را روی شیئی از نوع Icon تنظیم کنند.
سایههای نشانگر در نسخه ۳ پشتیبانی نمیشود.
مثالهای زیر پرچم ساحلی را در ساحل بوندی در استرالیا نشان میدهد که بخش شفاف نماد قابلکلیک نیست:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
var flagIcon = new GIcon(G_DEFAULT_ICON);
flagIcon.image = '/images/beachflag.png';
flagIcon.imageMap = [1, 1, 1, 20, 18, 20, 18 , 1];
var bbLatLng = new GLatLng(-33.890542, 151.274856);
map.addOverlay(new GMarker(bbLatLng, {
icon: flagIcon
}));
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
var bbLatLng = new google.maps.LatLng(-33.890542, 151.274856);
var bbMarker = new google.maps.Marker({
icon: '/images/beachflag.png'
shape: shape,
position: bbLatLng,
map: map
});
چندخطیها
چندخطی از آرایهای از LatLngها، بهعلاوه مجموعهای از بخشهای خطی تشکیل شده است که این مکانها را در یک توالی مرتب به هم متصل میکند.
ایجاد و نمایش شیء Polyline در نسخه ۳ مشابه استفاده از شیء GPolyline در نسخه ۲ است. نمونههای زیر
یک چندخطی ژئودزیک نیمهشفاف با عرض ۳ پیکسل از زوریخ به
سیدنی ازطریق سنگاپور رسم میکنند:
var polyline = new GPolyline(
[
new GLatLng(47.3690239, 8.5380326),
new GLatLng(1.352083, 103.819836),
new GLatLng(-33.867139, 151.207114)
],
'#FF0000', 3, 0.5, {
geodesic: true
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: [
new google.maps.LatLng(47.3690239, 8.5380326),
new google.maps.LatLng(1.352083, 103.819836),
new google.maps.LatLng(-33.867139, 151.207114)
],
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
geodesic: true
});
polyline.setMap(map);
چندخطیهای کدبندیشده
در نسخه ۳، برای ایجاد اشیای Polyline
مستقیماً از چندخطیهای
کدبندیشده پشتیبانی وجود ندارد. درعوض، کتابخانه هندسه
روشهایی برای کدگذاری و کدگشایی چندخطیها ارائه میدهد. برای اطلاعات بیشتر درباره نحوه بار کردن این کتابخانه، به کتابخانهها در Maps API نسخه ۳ مراجعه کنید.
نمونههای زیر همان چندخطی کدبندیشده را ترسیم میکنند؛ کد نسخه ۳ از روش
decodePath() از فضای نام
google.maps.geometry.encoding استفاده میکند.
var polyline = new GPolyline.fromEncoded({
points: 'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H',
levels: 'PPP',
zoomFactor: 2,
numLevels: 18,
color: '#ff0000',
opacity: 0.8,
weight: 3
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: google.maps.geometry.encoding.decodePath(
'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H'),
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
});
polyline.setMap(map);
چندضلعیها
«چندضلعی» منطقهای را در یک حلقه بسته تعریف میکند. درست مثل شیء
Polyline، اشیای Polygon
شامل مجموعهای از نقاط در یک توالی مرتبشده هستند. کلاس v3
Polygon بسیار شبیه کلاس v2
GPolygon است، با این تفاوت قابلتوجه
که دیگر لازم نیست رأس شروع را در انتهای
مسیر تکرار کنید تا حلقه بسته شود. «میانای برنامهسازی کاربردی» نسخه v3
بهطور خودکار هر چندضلعی را با کشیدن خطی که آخرین مختصات را به اولین مختصات وصل میکند
میبندد. تکهکدهای زیر
چندضلعیای را ایجاد میکنند که نشاندهنده مثلث برمودا است:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(24.886436, -70.268554), 5);
var bermudaTriangle = new GPolygon(
[
new GLatLng(25.774252, -80.190262),
new GLatLng(18.466465, -66.118292),
new GLatLng(32.321384, -64.75737),
new GLatLng(25.774252, -80.190262)
],
'#FF0000', 2, 0.8, '#FF0000', 0.35);
map.addOverlay(bermudaTriangle);
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(24.886436, -70.268554),
mapTypeId: google.maps.MapTypeId.TERRAIN,
zoom: 5
});
var bermudaTriangle = new google.maps.Polygon({
paths: [
new google.maps.LatLng(25.774252, -80.190262),
new google.maps.LatLng(18.466465, -66.118292),
new google.maps.LatLng(32.321384, -64.75737)
],
strokeColor: '#FF0000',
strokeWeight: 2,
strokeOpacity: 0.8,
fillColor: '#FF0000',
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
شکلهای قابلویرایش توسط کاربر
چندخطیها و چندضلعیها را میتوان قابلویرایش توسط کاربر کرد. تکهکدهای زیر معادل هستند:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
برای قابلیتهای طراحی پیشرفتهتر،
کتابخانه طراحی
را در اسناد نسخه ۳ ببینید.
پنجرههای اطلاعات
InfoWindow محتوا را در پنجره شناور بالای نقشه نمایش میدهد. چند تفاوت کلیدی بین پنجرههای اطلاعات نسخه ۲ و نسخه ۳ وجود دارد:
- میانای برنامهسازی کاربردی نسخه ۲ فقط از یک
GInfoWindow در هر نقشه پشتیبانی میکند، درحالیکه
میانای برنامهسازی کاربردی نسخه ۳ از چند InfoWindow همزمان در
هر نقشه پشتیبانی میکند.
- وقتی روی نقشه کلیک میکنید،
InfoWindow نسخه ۳ باز میماند. وقتی روی نقشه کلیک میکنید،
v2 GInfoWindow بهطور خودکار بسته میشود. با افزودن شنونده click در شیء Map میتوانید رفتار نسخه ۲ را شبیهسازی کنید.
- میانای برنامهسازی کاربردی نسخه ۳ از
InfoWindow زبانهدار پشتیبانی داخلی نمیکند.
رونهادهای زمین
برای قرار دادن تصویر روی نقشه، باید از شیء
GroundOverlay استفاده کنید. سازنده برای
GroundOverlay اساساً در نسخه ۲ و ۳ یکسان است: نشانی وب تصویر و مرزهای تصویر را بهعنوان
پارامتر مشخص میکند.
مثال زیر نقشه قدیمی نیوآرک، نیوجرسی را بهعنوان همپوشانی روی نقشه قرار میدهد:
var bounds = new GLatLngBounds(
new GLatLng(40.716216, -74.213393),
new GLatLng(40.765641, -74.139235));
var overlay = new GGroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
map.addOverlay(overlay);
var bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(40.716216, -74.213393),
new google.maps.LatLng(40.765641, -74.139235));
var overlay = new google.maps.GroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
overlay.setMap(map);
انواع نقشه
انواع نقشههای دردسترس در نسخه ۲ و ۳ کمی متفاوت است، اما همه
انواع نقشههای پایه در هر دو نسخه API دردسترس است. بهطور پیشفرض، نسخه ۲ از کاشیهای نقشه راه استاندارد «رنگشده» استفاده میکند. اما نسخه ۳ مستلزم آن است که هنگام ایجاد شیء google.maps.Map، نوع نقشه خاصی ارائه شود.
انواع نقشه رایج
چهار نوع نقشه اصلی در هر دو نسخه ۲ و ۳ دردسترس است:
MapTypeId.ROADMAP (جایگزین G_NORMAL_MAP)
نمای نقشه راه را نمایش میدهد.
MapTypeId.SATELLITE (جایگزین G_SATELLITE_MAP)
تصاویر ماهوارهای Google Earth را نمایش میدهد.
MapTypeId.HYBRID (جایگزین G_HYBRID_MAP)
ترکیبی از نماهای معمولی و ماهوارهای را نمایش میدهد.
MapTypeId.TERRAIN (جایگزین G_PHYSICAL_MAP)
نقشه فیزیکی را براساس اطلاعات عوارض زمین نمایش میدهد.
در زیر نمونهای از تنظیم نقشه روی نمای عوارض زمین در نسخه ۲ و ۳ آمده است:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API v3 چند تغییر در انواع نقشه کمتر رایج نیز ایجاد کرده است:
- کاشیهای نقشه برای اجرام آسمانی غیر از زمین بهعنوان انواع نقشه در v3 API دردسترس نیستند، اما میتوان بهعنوان انواع نقشه سفارشی به آنها دسترسی داشت. برای نمونه، این
نمونه انواع نقشه سفارشی را ببینید.
- هیچ نوع نقشه خاصی در نسخه ۳ وجود ندارد که جایگزین نوع
G_SATELLITE_3D_MAP در نسخه ۲ شود. درعوض،
میتوانید افزونه Google Earth را بااستفاده از
این
کتابخانه در نقشههای v3 خود ادغام کنید.
تصاویر با حداکثر بزرگنمایی
تصاویر ماهوارهای همیشه در سطوح بزرگنمایی بالا دردسترس نیست. اگر میخواهید
بالاترین سطح بزرگنمایی دردسترس را قبلاز تنظیم سطح بزرگنمایی بدانید،
از کلاس google.maps.MaxZoomService استفاده کنید. این کلاس جایگزین
روش GMapType.getMaxZoomAtLatLng() از نسخه ۲ میشود.
var point = new GLatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new GMap2(document.getElementById("map"));
map.setUIToDefault();
map.setCenter(point);
map.setMapType(G_HYBRID_MAP);
map.getCurrentMapType().getMaxZoomAtLatLng(point,
function(response) {
if (response.status) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
var myLatlng = new google.maps.LatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new google.maps.Map(
document.getElementById("map"),{
zoom: 0,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.HYBRID
});
var maxZoomService = new google.maps.MaxZoomService();
maxZoomService.getMaxZoomAtLatLng(
myLatlng,
function(response) {
if (response.status == google.maps.MaxZoomStatus.OK) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
تصاویر چشمانداز هوایی
هنگام فعال کردن تصاویر هوایی در نسخه ۳، کنترلها مشابه کنترل
GLargeZoomControl3D در نسخه ۲ هستند، با یک کنترل «چرخش» میانآگهی اضافی
برای چرخش در جهتهای پشتیبانیشده.
میتوانید شهرهایی را که تصاویر ۴۵ درجه در آنها دردسترس است در
نقشه شهرهای پشتیبانیشده ردیابی کنید. وقتی تصاویر ۴۵ درجه دردسترس باشد، گزینه زیرمنو به دکمه «ماهواره Maps API» اضافه میشود.
لایهها
لایهها اشیایی روی نقشه هستند که از یک یا چند
پوشش تشکیل شدهاند. میتوان آنها را بهعنوان یک واحد دستکاری کرد و معمولاً مجموعهای از اشیا را نشان میدهند.
لایههای پشتیبانیشده
v3 API دسترسی به چندین لایه مختلف را فراهم میکند. این لایهها
با کلاس v2 GLayer
در مناطق زیر همپوشانی دارند:
-
شیء
KmlLayer عناصر KML و GeoRSS را در
همپوشانیهای نسخه ۳ ارائه میکند و معادل لایه GeoXml
نسخه ۲ را ارائه میدهد.
- شیء
TrafficLayer لایهای را رندر میکند که وضعیت ترافیک را نشان میدهد، مشابه رونهاد GTrafficOverlay نسخه ۲.
این لایهها با نسخه ۲ متفاوت است. تفاوتها در زیر شرح داده شده است. با فراخوانی setMap() و ارسال شیء Map که لایه باید روی آن نمایش داده شود، میتوان آنها را به نقشه اضافه کرد.
اطلاعات بیشتر درباره لایههای پشتیبانیشده در
اسناد لایهها دردسترس است.
لایههای KML و GeoRSS
Maps JavaScript API از قالبهای داده KML و GeoRSS برای نمایش اطلاعات جغرافیایی پشتیبانی میکند. اگر میخواهید فایلهای KML یا GeoRSS را در نقشه بگنجانید،
باید بهطور عمومی دردسترس باشند. در نسخه ۳، این قالبهای داده بااستفاده از نمونهای از KmlLayer نمایش داده میشوند که جایگزین شیء GGeoXml از نسخه ۲ میشود.
v3 API هنگام ارائه KML انعطافپذیرتر است و به شما امکان میدهد
InfoWindows را سرکوب کنید و پاسخ کلیک را اصلاح کنید. برای جزئیات بیشتر، به سند v3 KML و GeoRSS Layers مراجعه کنید.
هنگام ارائه KmlLayer،
محدودیتهای اندازه و پیچیدگی اعمال میشود؛ برای جزئیات بیشتر،
سند KmlLayer
را ببینید.
نمونههای زیر نحوه بار کردن فایل KML را مقایسه میکنند.
geoXml = new GGeoXml(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml');
map.addOverlay(geoXml);
var layer = new google.maps.KmlLayer(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml', {
preserveViewport: true
});
layer.setMap(map);
لایه ترافیک
در نسخه ۳، میتوانید اطلاعات ترافیک همزمان (درصورت پشتیبانی) را بااستفاده از شیء TrafficLayer به نقشههایتان اضافه کنید. اطلاعات ترافیک برای زمانی که درخواست ارائه شده است فراهم میشود. این مثالها اطلاعات ترافیک
لسآنجلس را نشان میدهد:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(34.0492459, -118.241043), 13);
map.setUIToDefault();
var trafficOptions = {incidents:false};
trafficInfo = new GTrafficOverlay(trafficOptions);
map.addOverlay(trafficInfo);
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(34.0492459, -118.241043),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 13
});
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);
برخلاف نسخه ۲، هیچ گزینهای برای سازنده TrafficLayer در نسخه ۳ وجود ندارد. «رویدادها» در نسخه ۳ دردسترس نیست.
خدمات
زمینکدیابی
Maps JavaScript API یک شیء geocoder برای زمینکدیابی نشانیها بهصورت پویا از ورودی کاربر ارائه میدهد. اگر میخواهید
نشانیهای شناختهشده و ثابت را زمینکدیابی کنید، به مستندات
Geocoding API
مراجعه کنید.
Geocoding API بهطور قابلتوجهی ارتقا و بهبود یافته است، ویژگیهای جدیدی به آن اضافه شده است، و نحوه نمایش دادهها تغییر کرده است.
GClientGeocoder در «میانای برنامهسازی کاربردی» v2 دو روش مختلف
برای زمینکدیابی مستقیم و معکوس و همچنین روشهای اضافی برای
تأثیرگذاری بر نحوه انجام زمینکدیابی ارائه میکرد. درمقابل، شیء v3
Geocoder فقط یک روش geocode()
ارائه میدهد که یک راستیننماد شیء حاوی عبارتهای ورودی
(بهشکل شیء درخواستهای
زمینکدیابی) و یک روش فراخوانی متقابل را میگیرد. بسته به اینکه درخواست حاوی مشخصه نوشتاری address یا شیء LatLng باشد، Geocoding API پاسخ زمینکدیابی مستقیم یا معکوس را برمیگرداند. با ارسال فیلدهای اضافی به درخواست زمینکدیابی، میتوانید بر نحوه انجام زمینکدیابی تأثیر بگذارید:
- گنجاندن
address متنی باعث راهاندازی زمینکدیابی پیشرو میشود،
که معادل فراخوانی روش getLatLng() است.
- گنجاندن شیء
latLng باعث راهاندازی زمینکدیابی معکوس میشود،
که معادل فراخوانی روش getLocations() است.
- با گنجاندن مشخصه
bounds، سوگیری
نمای فعال میشود که معادل فراخوانی روش setViewport() است.
- گنجاندن مشخصه
region سوگیری کد منطقه را فعال میکند که معادل فراخوانی روش setBaseCountryCode() است.
پاسخهای
زمینکدیابی در نسخه ۳ با پاسخهای نسخه ۲ بسیار متفاوت است. «میانای برنامهسازی کاربردی» نسخه v3
ساختار تودرتویی را که نسخه v2 استفاده میکند با ساختار مسطحتری جایگزین میکند که
تجزیه آن آسانتر است. علاوهبراین، پاسخهای نسخه ۳ جزئیات بیشتری دارند: هر نتیجه چندین مؤلفه نشانی دارد که کمک میکند ایده بهتری از وضوح هر نتیجه داشته باشید.
کد زیر نشانی نوشتاری را میگیرد و اولین نتیجه را از زمینکدیابی آن نشان میدهد:
var geocoder = new GClientGeocoder();
var infoPanel;
var map;
var AccuracyDescription = [
'Unknown accuracy', 'country level accuracy',
'region level accuracy', 'sub-region level accuracy',
'town level accuracy', 'post code level accuracy',
'street level accuracy', 'intersection level accuracy',
'address level accuracy', 'premise level accuracy',
];
function geocode_result_handler(response) {
if (!response || response.Status.code != 200) {
alert('Geocoding failed. ' + response.Status.code);
} else {
var bounds = new GLatLngBounds(new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.south,
response.Placemark[0].ExtendedData.LatLonBox.west
), new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.north,
response.Placemark[0].ExtendedData.LatLonBox.east
));
map.setCenter(bounds.getCenter(),
map.getBoundsZoomLevel(bounds));
var latlng = new GLatLng(
response.Placemark[0].Point.coordinates[1],
response.Placemark[0].Point.coordinates[0]);
infoPanel.innerHTML += '<p>1st result is <em>' +
// No info about location type
response.Placemark[0].address +
'</em> of <em>' +
AccuracyDescription[response.Placemark[0].
AddressDetails.Accuracy] +
'</em> at <tt>' + latlng + '</tt></p>';
var marker_title = response.Placemark[0].address +
' at ' + latlng;
map.clearOverlays();
var marker = marker = new GMarker(
latlng,
{'title': marker_title}
);
map.addOverlay(marker);
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.getLocations(address, geocode_result_handler);
}
function initialize() {
map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(38, 15), 2);
map.setUIToDefault();
infoPanel = document.getElementById('info-panel');
}
var geocoder = new google.maps.Geocoder();
var infoPanel;
var map;
var marker;
function geocode_result_handler(result, status) {
if (status != google.maps.GeocoderStatus.OK) {
alert('Geocoding failed. ' + status);
} else {
map.fitBounds(result[0].geometry.viewport);
infoPanel.innerHTML += '<p>1st result for geocoding is <em>' +
result[0].geometry.location_type.toLowerCase() +
'</em> to <em>' +
result[0].formatted_address + '</em> of types <em>' +
result[0].types.join('</em>, <em>').replace(/_/, ' ') +
'</em> at <tt>' + result[0].geometry.location +
'</tt></p>';
var marker_title = result[0].formatted_address +
' at ' + latlng;
if (marker) {
marker.setPosition(result[0].geometry.location);
marker.setTitle(marker_title);
} else {
marker = new google.maps.Marker({
position: result[0].geometry.location,
title: marker_title,
map: map
});
}
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.geocode({'address': address}, geocode_result_handler);
}
function initialize() {
map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(38, 15),
zoom: 2,
mapTypeId: google.maps.MapTypeId.HYBRID
});
infoPanel = document.getElementById('info-panel');
}
مسیرها
Maps JavaScript API v3 کلاس GDirections از v2 را با کلاس DirectionsService برای محاسبه مسیرها جایگزین میکند.
روش route() در نسخه ۳ جایگزین هر دو روش
load() و loadFromWaypoints() از
میانای برنامهسازی کاربردی نسخه ۲ میشود. این روش یک راستیننماد شیء DirectionsRequest واحد را که حاوی عبارتهای ورودی است و یک روش فراخوانی را برای اجرا پساز دریافت پاسخ میگیرد. گزینهها ممکن است در این راستیننماد شیء ارائه شوند،
مشابه راستیننماد شیء GDirectionsOptions در نسخه ۲.
در Maps JavaScript API v3، وظیفه ارسال درخواستهای مسیر از وظیفه درخواستهای رندر کردن جدا شده است، که اکنون با کلاس DirectionsRenderer انجام میشود. میتوانید شیء
DirectionsRenderer را ازطریق روشهای setMap() و
setDirections() به هر نقشه یا شیء
DirectionsResult گره بزنید. چون رندرکننده یک
MVCObject است، هرگونه تغییر در ویژگیهایش را شناسایی میکند و
وقتی مسیرهای مرتبط تغییر کند، نقشه را بهروز میکند.
کد زیر نشان میدهد که چگونه میتوان بااستفاده از مسیرهای عابر پیاده از یک نشانی، مسیرهای پیادهروی به یک مکان خاص را درخواست کرد. توجه داشته باشید که فقط
v3 میتواند مسیرهای پیادهروی را در مسیر عابر پیاده در
باغوحش دوبلین ارائه دهد.
var map;
var directions;
var directionsPanel;
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsPanel = document.getElementById("route");
map = new GMap2(document.getElementById('map'));
map.setCenter(origin, 10);
map.setUIToDefault();
directions = new GDirections(map, directionsPanel);
directions.loadFromWaypoints(
[origin, destination], {
travelMode: 'G_TRAVEL_MODE_WALKING',
});
}
var map;
var directionsRenderer;
var directionsService = new google.maps.DirectionsService();
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsRenderer = new google.maps.DirectionsRenderer();
map = new google.maps.Map(
document.getElementById('map'), {
center: origin,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
directionsRenderer.setPanel(document.getElementById("route"));
directionsRenderer.setMap(map);
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.DirectionsTravelMode.WALKING
}, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsRenderer.setDirections(result);
}
});
}
نمای خیابان
«نمای خیابان Google» نماهای ۳۶۰ درجه تعاملی از مکانهای تعیینشده در منطقه تحت پوشش خود ارائه میدهد. میانای برنامهسازی کاربردی نسخه ۳ از «نمای خیابان» بهطور بومی در مرورگر پشتیبانی میکند، برخلاف نسخه ۲ که برای نمایش تصاویر «نمای خیابان» به افزونه Flash® نیاز داشت.
تصاویر «نمای خیابان» ازطریق استفاده از
شیء StreetViewPanorama در نسخه ۳، یا
شیء GStreetviewPanorama در نسخه ۲ پشتیبانی میشوند. این کلاسها
میاناهای متفاوتی دارند، اما نقش یکسانی را ایفا میکنند: متصل کردن
محفظه div با تصاویر «نمای خیابان» و اجازه دادن به شما
برای مشخص کردن مکان و POV (نقطه دید) تمامنمای
«نمای خیابان».
function initialize() {
var fenwayPark = new GLatLng(42.345573, -71.098326);
panoramaOptions = {
latlng: fenwayPark,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new GStreetviewPanorama(
document.getElementById('pano'),
panoramaOptions);
GEvent.addListener(myPano, "error", handleNoFlash);
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
function initialize() {
var fenway = new google.maps.LatLng(42.345573, -71.098326);
var panoramaOptions = {
position: fenway,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new google.maps.StreetViewPanorama(
document.getElementById('pano'),
panoramaOptions);
}
دسترسی مستقیم به دادههای «نمای خیابان» ازطریق
شیء StreetViewService در نسخه ۳ یا شیء مشابه
GStreetviewClient در نسخه ۲ امکانپذیر است. هر دو واسطهای مشابهی برای بازیابی یا بررسی دردسترس بودن دادههای «نمای خیابان» ارائه میدهند و امکان جستجو براساس مکان یا شناسه تمامنما را فراهم میکنند.
در نسخه ۳، «نمای خیابان» بهطور پیشفرض فعال است. نقشه با کنترل آدمک «نمای خیابان» نشان داده میشود و API از div نقشه برای نمایش تمامنماهای «نمای خیابان» مجدداً استفاده میکند. کد زیر نشان میدهد که چگونه میتوان رفتار نسخه ۲ را با جدا کردن تمامنماهای «نمای خیابان» در یک div جداگانه شبیهسازی کرد.
var marker;
var panoClient = new GStreetviewClient();
function initialize() {
if (GBrowserIsCompatible()) {
var myPano = new GStreetviewPanorama(
document.getElementById('pano'));
GEvent.addListener(myPano, 'error', handleNoFlash);
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(42.345573, -71.098326), 16);
map.setUIToDefault();
GEvent.addListener(map, 'click', function(overlay, latlng) {
if (marker) {
marker.setLatLng(latlng);
} else {
marker = new GMarker(latlng);
map.addOverlay(marker);
}
var nearestPano = panoClient.getNearestPanorama(
latlng, processSVData);
});
function processSVData(panoData) {
if (panoData.code != 200) {
alert("Panorama data not found for this location.");
}
var latlng = marker.getLatLng();
var dLat = latlng.latRadians()
- panoData.location.latlng.latRadians();
var dLon = latlng.lngRadians()
- panoData.location.latlng.lngRadians();
var y = Math.sin(dLon) * Math.cos(latlng.latRadians());
var x = Math.cos(panoData.location.latlng.latRadians()) *
Math.sin(latlng.latRadians()) -
Math.sin(panoData.location.latlng.latRadians()) *
Math.cos(latlng.latRadians()) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * 180 / Math.PI;
myPano.setLocationAndPOV(panoData.location.latlng, {
yaw: bearing
});
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
}
}
// Load the API with libraries=geometry
var map;
var marker;
var panorama;
var sv = new google.maps.StreetViewService();
function radians(degrees) { return Math.PI * degrees / 180.0 };
function initialize() {
panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"));
map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(42.345573, -71.098326),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 16
});
google.maps.event.addListener(map, 'click', function(event) {
if (!marker) {
marker = new google.maps.Marker({
position: event.latLng,
map: map
});
} else {
marker.setPosition(event.latLng);
}
sv.getPanoramaByLocation(event.latLng, 50, processSVData);
});
}
function processSVData(panoData, status) {
if (status == google.maps.StreetViewStatus.OK) {
alert("Panorama data not found for this location.");
}
var bearing = google.maps.geometry.spherical.computeHeading(
panoData.location.latLng, marker.getPosition());
panorama.setPano(panoData.location.pano);
panorama.setPov({
heading: bearing,
pitch: 0,
zoom: 1
});
panorama.setVisible(true);
marker.setMap(panorama);
}