Maps JavaScript API v2 از 26 مه 2021 دیگر در دسترس نیست. در نتیجه، نقشههای v2 سایت شما از کار میافتند و خطاهای جاوا اسکریپت را برمیگردانند. برای ادامه استفاده از نقشهها در سایت خود، به Maps JavaScript API نسخه 3 بروید. این راهنما به شما در طی این فرآیند کمک می کند.
نمای کلی
هر برنامه یک روند مهاجرت کمی متفاوت خواهد داشت. با این حال، مراحلی وجود دارد که برای همه پروژهها مشترک است:
- یک کلید جدید دریافت کنید. Maps JavaScript API اکنون از Google Cloud Console برای مدیریت کلیدها استفاده می کند. اگر همچنان از کلید v2 استفاده می کنید، قبل از شروع مهاجرت، حتما کلید API جدید خود را دریافت کنید.
- API Bootstrap خود را به روز کنید. اکثر برنامه ها Maps JavaScript API v3 را با کد زیر بارگذاری می کنند:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- کد خود را به روز کنید مقدار تغییر مورد نیاز بستگی زیادی به درخواست شما دارد. تغییرات رایج عبارتند از:
- همیشه به فضای نام google.maps ارجاع دهید. در نسخه 3، تمام کدهای Maps JavaScript API در فضای نام
google.maps.*
به جای فضای نام جهانی ذخیره می شود. اکثر اشیا نیز به عنوان بخشی از این فرآیند تغییر نام داده اند. به عنوان مثال، به جای GMap2
، اکنون google.maps.Map
بارگیری خواهید کرد. - هرگونه ارجاع به روش های منسوخ را حذف کنید. تعدادی از روشهای کاربردی عمومی حذف شدهاند، مانند
GDownloadURL
و GLog
. یا این قابلیت را با کتابخانه های ابزار شخص ثالث جایگزین کنید یا این مراجع را از کد خود حذف کنید. - (اختیاری) کتابخانه ها را به کد خود اضافه کنید. بسیاری از ویژگیها به کتابخانههای ابزار خارجی تبدیل شدهاند، به طوری که هر برنامه فقط باید قسمتهایی از API را که مورد استفاده قرار میگیرد بارگیری کند.
- (اختیاری) پروژه خود را برای استفاده از خارجی های v3 پیکربندی کنید. خارجیهای v3 میتوانند برای کمک به اعتبارسنجی کد شما با Closure Compiler یا برای فعال کردن تکمیل خودکار در IDE شما استفاده شوند. درباره کامپایل پیشرفته و خارجی بیشتر بیاموزید.
- تست و تکرار کنید. در این مرحله شما هنوز مقداری کار برای انجام خواهید داشت، اما خبر خوب این است که به خوبی در مسیر برنامه جدید نقشه های v3 خود خواهید بود!
تغییرات در V3 از Maps JavaScript API
قبل از برنامه ریزی مهاجرت خود، باید زمانی را برای درک تفاوت های بین Maps JavaScript API v2 و Maps JavaScript API v3 اختصاص دهید. جدیدترین نسخه Maps JavaScript API از ابتدا با تمرکز بر تکنیک های برنامه نویسی جاوا اسکریپت مدرن، افزایش استفاده از کتابخانه ها و یک API ساده شده نوشته شده است. بسیاری از ویژگی های جدید به API اضافه شده اند و چندین ویژگی آشنا تغییر کرده یا حتی حذف شده اند. این بخش برخی از تفاوت های کلیدی بین این دو نسخه را برجسته می کند.
برخی از تغییرات در API v3 عبارتند از:
- یک کتابخانه اصلی کارآمد. بسیاری از توابع تکمیلی به کتابخانهها منتقل شدهاند و به کاهش بار و زمان تجزیه برای Core API کمک میکنند که به شما امکان میدهد نقشه شما به سرعت در هر دستگاهی بارگیری شود.
- بهبود عملکرد چندین ویژگی، مانند رندر چند ضلعی و قرار دادن نشانگر.
- یک رویکرد جدید برای محدودیتهای استفاده سمت مشتری برای تطبیق بهتر آدرسهای مشترک مورد استفاده توسط پراکسیهای تلفن همراه و فایروالهای شرکتی.
- پشتیبانی از چندین مرورگر مدرن و مرورگرهای تلفن همراه اضافه شده است. پشتیبانی از اینترنت اکسپلورر 6 حذف شده است.
- بسیاری از کلاس های کمکی همه منظوره (
GLog
یا GDownloadUrl
) را حذف کرد. امروزه، بسیاری از کتابخانههای جاوا اسکریپت عالی وجود دارند که عملکردهای مشابهی را ارائه میکنند، مانند Closure یا jQuery . - یک پیاده سازی نمای خیابان HTML5 که در هر دستگاه تلفن همراه بارگیری می شود.
- پانورامای نمای خیابان سفارشی با عکس های خود، به شما امکان می دهد تصاویر پانوراما از پیست های اسکی، خانه های برای فروش یا مکان های جالب دیگر را به اشتراک بگذارید.
- سفارشیسازیهای Styled Maps که به شما امکان میدهد نمایش عناصر را روی نقشه پایه تغییر دهید تا با سبک بصری منحصر به فرد خود مطابقت داشته باشد.
- پشتیبانی از چندین سرویس جدید، مانند ElevationService و Distance Matrix .
- خدمات مسیرهای بهبودیافته مسیرهای جایگزین، بهینه سازی مسیر (راه حل های تقریبی برای مشکل فروشنده دوره گرد )، مسیرهای دوچرخه سواری (با لایه دوچرخه سواری )، مسیرهای حمل و نقل، و مسیرهای قابل کشیدن را ارائه می دهد.
- یک قالب Geocoding به روز شده که اطلاعات نوع دقیق تری را نسبت به مقدار
accuracy
از Geocoding API v2 ارائه می دهد. - پشتیبانی از چندین ویندوز اطلاعات در یک نقشه
کلید جدید شما
Maps JavaScript API v3 از یک سیستم کلید جدید از نسخه 2 استفاده می کند. ممکن است قبلاً از یک کلید v3 برای برنامه خود استفاده کرده باشید، در این صورت نیازی به تغییر نیست. برای تأیید، نشانی اینترنتی را که Maps JavaScript API از آن بارگیری میکنید برای پارامتر key
آن بررسی کنید. اگر مقدار کلید با "ABQIAA" شروع می شود، شما از یک کلید v2 استفاده می کنید. اگر یک کلید v2 دارید، باید به عنوان بخشی از انتقال، به یک کلید v3 ارتقا دهید، که:
هنگام بارگیری Maps JavaScript API v3، کلید ارسال می شود. درباره ایجاد کلیدهای API بیشتر بیاموزید .
توجه داشته باشید که اگر مشتری Google Maps APIs for Work هستید، ممکن است به جای استفاده از پارامتر key
، از شناسه مشتری با پارامتر client
استفاده کنید. شناسههای سرویس گیرنده همچنان در Maps JavaScript API نسخه 3 پشتیبانی میشوند و نیازی به انجام فرآیند ارتقاء کلید ندارند.
در حال بارگیری API
اولین تغییری که باید در کد خود انجام دهید مربوط به نحوه بارگیری API است. در نسخه 2، Maps JavaScript API را از طریق یک درخواست به http://maps.google.com/maps
بارگیری میکنید. اگر در حال بارگیری Maps JavaScript API v3 هستید، باید تغییرات زیر را اعمال کنید:
- API را از
//maps.googleapis.com/maps/api/js
بارگیری کنید - پارامتر
file
حذف کنید. - پارامتر
key
را با کلید v3 جدید خود به روز کنید. مشتریان Google Maps APIs for Work باید از پارامتر client
استفاده کنند. - (فقط طرح ممتاز پلتفرم Google Maps) اطمینان حاصل کنید که پارامتر
client
همانطور که در راهنمای برنامهنویس برنامه Google Maps Platform Premium توضیح داده شده است، ارائه شده است. - برای درخواست آخرین نسخه منتشر شده، پارامتر
v
را حذف کنید یا مقدار آن را مطابق با طرح نسخه سازی v3 تغییر دهید. - (اختیاری) پارامتر
hl
با language
جایگزین کنید و مقدار آن را حفظ کنید. - (اختیاری) برای بارگیری کتابخانه های اختیاری، پارامتر
libraries
را اضافه کنید.
در ساده ترین حالت، bootstrap v3 فقط پارامتر کلید API شما را مشخص می کند:
<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>
مثال زیر یک درخواست معادل برای v3 است.
<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 همه اشیا را به طور پیشفرض در فضای نام جهانی قرار میدهد که میتواند منجر به برخورد نامگذاری شود. در نسخه 3، همه اشیا در فضای نام google.maps
قرار دارند.
هنگام انتقال برنامه خود به نسخه 3، باید کد خود را تغییر دهید تا از فضای نام جدید استفاده کنید. متأسفانه، جستجوی «G» و جایگزینی با «google.maps». به طور کامل کار نخواهد کرد. اما، این یک قانون سرانگشتی خوب است که هنگام بررسی کد خود اعمال کنید. در زیر چند نمونه از کلاس های معادل در v2 و v3 آورده شده است.
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 برای بیشتر عملکردهای نسخه 2 مشابهی دارد. با این حال، برخی از کلاس ها هستند که دیگر پشتیبانی نمی شوند. به عنوان بخشی از مهاجرت خود، باید این کلاس ها را با کتابخانه های ابزار شخص ثالث جایگزین کنید یا این مراجع را از کد خود حذف کنید. بسیاری از کتابخانه های جاوا اسکریپت عالی وجود دارند که عملکردهای مشابهی مانند بستن یا جی کوئری را ارائه می دهند.
کلاس های زیر در Maps JavaScript API v3 مشابهی ندارند:
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 |
|
مقایسه کد
بیایید دو برنامه نسبتاً ساده را که با API های 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()
دیگر در نسخه 3 مورد نیاز نیستند و از API حذف شده اند. - شی
GMap2
با google.maps.Map
به عنوان شی مرکزی در API جایگزین شده است. - اکنون ویژگی ها از طریق کلاس های Options بارگیری می شوند. در مثال بالا، ما سه ویژگی مورد نیاز برای بارگیری یک نقشه -
center
، zoom
و mapTypeId
- را از طریق یک شی MapOptions
خطی تنظیم کردیم. - رابط کاربری پیش فرض در نسخه 3 به طور پیش فرض روشن است. میتوانید با تنظیم ویژگی
disableDefaultUI
روی true در شی MapOptions
آن را غیرفعال کنید.
خلاصه
در این مرحله، برخی از نکات کلیدی مربوط به انتقال شما از نسخه 2 به نسخه 3 از Maps JavaScript API را خواهید چشید. اطلاعات بیشتری وجود دارد که ممکن است لازم باشد بدانید، اما به درخواست شما بستگی دارد. در بخشهای بعدی، دستورالعملهای مهاجرت را برای موارد خاصی که ممکن است با آنها مواجه شوید قرار دادهایم. علاوه بر این، منابع متعددی وجود دارد که ممکن است در طول فرآیند ارتقا برای شما مفید باشد.
- Maps JavaScript API v3 Developers Documentation بهترین مکان برای کسب اطلاعات بیشتر در مورد API و نحوه عملکرد آن است.
- مرجع Maps JavaScript API v3 به شما کمک می کند تا در مورد کلاس ها و روش های جدید در v3 API اطلاعات بیشتری کسب کنید.
- انجمن Stack Overflow مکانی عالی برای پرسیدن سوالات مربوط به کد شما است. در سایت، سؤالات و پاسخهای مربوط به Maps JavaScript API از برچسبهای « google-maps » یا « google-maps-api-3 » استفاده میشود.
- مشتریان طرح ممتاز پلتفرم Google Maps مایلند اسناد طرح ممتاز پلتفرم Google Maps را مطالعه کنند.
- وبلاگ Google Geo Developers یک راه عالی برای اطلاع از آخرین تغییرات API است.
اگر در مورد این مقاله مشکل یا سؤالی دارید، لطفاً از پیوند ارسال بازخورد در بالای این صفحه استفاده کنید.
این بخش مقایسه دقیقی از محبوب ترین ویژگی های نسخه 2 و 3 از Maps JavaScript API ارائه می دهد. هر بخش از مرجع برای خواندن جداگانه طراحی شده است. توصیه می کنیم این مرجع را به طور کامل مطالعه نکنید. در عوض، از این مطالب برای کمک به مهاجرت خود به صورت موردی استفاده کنید.
- رویدادها - ثبت و رسیدگی به رویدادها.
- کنترل ها - دستکاری کنترل های ناوبری که روی نقشه ظاهر می شوند.
- پوشش ها - اضافه کردن و ویرایش اشیاء روی نقشه.
- انواع نقشه - کاشی هایی که نقشه پایه را تشکیل می دهند.
- لایه ها - اضافه کردن و ویرایش محتوا به عنوان یک گروه، مانند لایه های KML یا ترافیک.
- خدمات - کار با کدگذاری جغرافیایی Google، مسیرها یا خدمات نمای خیابان.
رویدادها
مدل رویداد برای Maps JavaScript API v3 شبیه به آنچه در نسخه 2 استفاده شده است، است، اگرچه بسیاری از موارد در زیر هود تغییر کرده است.
رویداد جدید برای پشتیبانی 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.');
});
حذف شنوندگان رویداد
به دلایل عملکرد، بهتر است شنونده رویداد را زمانی که دیگر به آن نیاز ندارید حذف کنید. حذف شنونده رویداد در نسخه های 2 و 3 به همین ترتیب عمل می کند:
- هنگامی که شنونده رویداد ایجاد می کنید، یک شیء مات ( GEventListener در v2، MapsEventListener در v3) برگردانده می شود.
- هنگامی که می خواهید شنونده رویداد را حذف کنید، این شی را به متد
removeListener()
( GEvent.removeListener()
در v2 یا google.maps.event.removeListener()
در v3) منتقل کنید تا شنونده رویداد حذف شود.
گوش دادن به رویدادهای DOM
اگر میخواهید رویدادهای DOM (مدل شیء سند) را بگیرید و به آنها پاسخ دهید، v3 متد ثابت google.maps.event.addDomListener()
را ارائه میکند که معادل متد GEvent.addDomListener()
در نسخه 2 است.
استفاده از آرگومان های پاس شده در رویدادها
رویدادهای UI اغلب یک آرگومان رویداد را ارسال می کنند که سپس شنونده رویداد می تواند به آن دسترسی داشته باشد. اکثر آرگومانهای رویداد در v3 سادهسازی شدهاند تا بر روی اشیاء در API سازگارتر باشند. (برای جزئیات به مرجع v3 مراجعه کنید.)
هیچ آرگومان overlay
در شنوندگان رویداد v3 وجود ندارد. اگر یک رویداد click
روی نقشه نسخه 3 ثبت کنید، پاسخ تماس تنها زمانی اتفاق میافتد که کاربر روی نقشه پایه کلیک کند. در صورت نیاز به واکنش به آن کلیکها، میتوانید تماسهای اضافی را روی همپوشانیهای قابل کلیک ثبت کنید.
// 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 کنترلهای UI را نمایش میدهد که به کاربران اجازه میدهد با نقشه شما تعامل داشته باشند. میتوانید از API برای سفارشی کردن نحوه نمایش این کنترلها استفاده کنید.
تغییرات در انواع کنترل
برخی تغییرات در انواع control
با API v3 معرفی شده است.
- v3 API از انواع نقشه های اضافی از جمله نقشه های زمین و توانایی اضافه کردن انواع نقشه های سفارشی پشتیبانی می کند.
- کنترل سلسله مراتبی v2،
GHierarchicalMapTypeControl
، دیگر در دسترس نیست. می توانید با استفاده از کنترل google.maps.MapTypeControlStyle.HORIZONTAL_BAR
به جلوه مشابهی دست پیدا کنید. - طرح افقی ارائه شده توسط
GMapTypeControl
در نسخه 2 در نسخه 3 موجود نیست.
افزودن کنترل ها به نقشه
با Maps JavaScript API v2 میتوانید کنترلهایی را از طریق متد addControl()
شی نقشه خود به نقشه خود اضافه کنید. در نسخه 3، به جای دسترسی یا تغییر مستقیم کنترلها، شی 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);
کنترل های موقعیت یابی روی نقشه
کنترل های موقعیت یابی در نسخه 3 بسیار تغییر کرده است. در v2، متد addControl()
یک پارامتر دوم اختیاری می گیرد که به شما امکان می دهد موقعیت کنترل را نسبت به گوشه های نقشه مشخص کنید.
در v3، شما موقعیت یک کنترل را از طریق ویژگی position
گزینه های کنترل تنظیم می کنید. تعیین موقعیت این کنترل ها مطلق نیست. در عوض، API کنترلها را با «جریاندادن» آنها در اطراف عناصر نقشه موجود در محدودیتهای داده شده (مانند اندازه نقشه) بهطور هوشمندانه چیدمان میکند. این تضمین می کند که کنترل های پیش فرض با کنترل های شما سازگار هستند. برای اطلاعات بیشتر به کنترل موقعیت در نسخه 3 مراجعه کنید.
کد زیر کنترلهای نمونههای بالا را مجدداً قرار میدهد:
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 به شما امکان می دهد کنترل های ناوبری سفارشی ایجاد کنید. برای سفارشیسازی کنترلها با API v2، کلاس GControl
را زیر کلاس میدهید و برای متدهای initialize()
و getDefaultPosition()
هندلرهایی تعریف میکنید. هیچ معادلی برای کلاس GControl
در نسخه 3 وجود ندارد. در عوض، کنترل ها به عنوان عناصر DOM نشان داده می شوند. برای افزودن یک کنترل سفارشی با v3 API، یک ساختار DOM برای کنترل در سازنده به عنوان فرزند یک Node
ایجاد کنید (به عنوان مثال یک عنصر <div>
) و شنوندگان رویداد را برای مدیریت هر رویداد DOM اضافه کنید. Node
به آرایه controls[ position ]
های نقشه ها فشار دهید تا نمونه ای از کنترل سفارشی را به نقشه خود اضافه کنید.
با توجه به اجرای کلاس HomeControl
که به الزامات واسط ذکر شده در بالا پایبند است (برای جزئیات به اسناد Custom Controls مراجعه کنید)، نمونه کد زیر نحوه افزودن یک کنترل سفارشی به نقشه را نشان می دهد.
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 و v3 یکسان است، با این حال، آنها به طور متفاوتی مدیریت می شوند.
همپوشانی ها در v2 API با استفاده از متدهای addOverlay()
و removeOverlay()
شی GMap2
به نقشه اضافه و از آن حذف شدند. در نسخه 3، شما یک نقشه را از طریق ویژگی map
کلاس گزینه های پوشش مرتبط، به یک Overlay اختصاص می دهید. همچنین میتوانید مستقیماً با فراخوانی متد setMap()
شیء همپوشانی و تعیین نقشه مورد نظر، یک پوشش اضافه یا حذف کنید. با تنظیم ویژگی map روی null
، همپوشانی حذف می شود.
هیچ روش clearOverlays()
در نسخه 3 وجود ندارد. اگر میخواهید مجموعهای از همپوشانیها را مدیریت کنید، باید یک آرایه برای نگه داشتن همپوشانیها ایجاد کنید. با استفاده از این آرایه، سپس میتوانید 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
});
نمادها
شما می توانید یک نماد سفارشی برای نشان دادن به جای نشانگر پیش فرض تعریف کنید. برای استفاده از یک تصویر سفارشی در نسخه 2، می توانید یک نمونه GIcon
از G_DEFAULT_ICON type
ایجاد کنید و آن را تغییر دهید. اگر تصویر شما بزرگتر یا کوچکتر از نماد پیش فرض است، باید آن را با یک نمونه GSize
مشخص کنید. v3 API این فرآیند را کمی ساده می کند. به سادگی ویژگی icon
نشانگر را روی URL تصویر سفارشی خود تنظیم کنید و API نماد را به طور خودکار اندازه میدهد.
Maps JavaScript API همچنین از نمادهای پیچیده پشتیبانی می کند. یک نماد پیچیده ممکن است شامل چندین کاشی، اشکال پیچیده باشد، یا «ترتیب پشته» نحوه نمایش تصاویر را نسبت به دیگر پوششها مشخص کند. برای افزودن یک شکل به یک نشانگر در v2، باید ویژگی اضافی را در هر نمونه GIcon
مشخص کنید و آن را به عنوان یک گزینه به سازنده GMarker
ارسال کنید. در نسخه 3، آیکونهایی که به این روش مشخص شدهاند باید ویژگیهای icon
خود را روی یک شی از نوع Icon
تنظیم کنند. سایه های نشانگر در نسخه 3 پشتیبانی نمی شوند.
نمونههای زیر پرچم ساحل را در ساحل بوندی در استرالیا نشان میدهند که قسمت شفاف نماد قابل کلیک نیست:
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
s، به اضافه یک سری پاره خط تشکیل شده است که آن مکان ها را در یک دنباله مرتب به هم متصل می کند. ایجاد و نمایش یک شی Polyline
در v3 شبیه به استفاده از یک شی GPolyline
در v2 است. نمونه های زیر یک پلی خط ژئودزیکی نیمه شفاف با عرض 3 پیکسل از زوریخ تا سیدنی از طریق سنگاپور ترسیم می کنند:
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);
چند خطوط رمزگذاری شده
هیچ پشتیبانی در نسخه 3 برای ایجاد اشیاء Polyline
مستقیماً از چند خطوط کدگذاری شده وجود ندارد. در عوض، The Geometry Library روش هایی را برای رمزگذاری و رمزگشایی چند خطوط ارائه می دهد. برای اطلاعات بیشتر در مورد نحوه بارگیری این کتابخانه، به کتابخانه ها در v3 Maps API مراجعه کنید.
مثال های زیر همان چند خط کدگذاری شده را ترسیم می کنند. کد v3 از متد 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);
چند ضلعی ها
یک Polygon یک منطقه را در یک حلقه بسته تعریف می کند. مانند شی Polyline
، اشیاء Polygon
از یک سری نقاط در یک دنباله مرتب تشکیل شده است. کلاس v3 Polygon
تقریباً مشابه کلاس v2 GPolygon
است، با این استثنا که دیگر لازم نیست راس شروع را در انتهای مسیر برای بستن حلقه تکرار کنید. v3 API به طور خودکار هر چند ضلعی را با کشیدن یک ضربه که آخرین مختصات را به اولین مختصات متصل می کند، می بندد. تکههای کد زیر یک چند ضلعی ایجاد میکنند که مثلث برمودا را نشان میدهد:
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);
برای قابلیتهای طراحی پیشرفتهتر، به کتابخانه طراحی در مستندات v3 مراجعه کنید.
اطلاعات ویندوز
InfoWindow
محتوا را در یک پنجره شناور بالای نقشه نمایش می دهد. چند تفاوت کلیدی بین پنجره های اطلاعات v2 و v3 وجود دارد:
- API v2 فقط
GInfoWindow
در هر نقشه پشتیبانی می کند، در حالی که API v3 از چندین InfoWindow
همزمان در هر نقشه پشتیبانی می کند. - هنگامی که روی نقشه کلیک می کنید،
InfoWindow
v3 باز می ماند. وقتی روی نقشه کلیک میکنید GInfoWindow
v2 بهطور خودکار بسته میشود. میتوانید با افزودن یک click
شنونده روی شی Map
، رفتار v2 را شبیهسازی کنید. - API v3 برای
InfoWindow
تب دار پشتیبانی نمی کند.
پوشش های زمینی
برای قرار دادن یک تصویر روی نقشه، باید از یک شی GroundOverlay
استفاده کنید. سازنده برای GroundOverlay
اساساً در v2 و v3 یکسان است: URL یک تصویر و مرزهای تصویر را به عنوان پارامتر مشخص می کند.
مثال زیر نقشه عتیقه نیوآرک، نیوجرسی را به عنوان یک پوشش روی نقشه قرار می دهد:
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);
انواع نقشه
انواع نقشه های موجود در نسخه 2 و 3 کمی متفاوت هستند، اما همه انواع نقشه های اصلی در هر دو نسخه API موجود هستند. بهطور پیشفرض، v2 از کاشیهای نقشه راه استاندارد «رنگشده» استفاده میکند. با این حال، v3 نیاز به یک نوع نقشه خاص برای ایجاد یک شی google.maps.Map
دارد.
انواع نقشه های رایج
چهار نوع نقشه اصلی در نسخه 2 و 3 موجود است:
-
MapTypeId.ROADMAP
(جایگزین G_NORMAL_MAP
می شود) نمای نقشه راه را نمایش می دهد. -
MapTypeId.SATELLITE
(جایگزین G_SATELLITE_MAP
) تصاویر ماهواره ای Google Earth را نمایش می دهد. -
MapTypeId.HYBRID
(جایگزین G_HYBRID_MAP
) ترکیبی از نمای عادی و ماهواره ای را نمایش می دهد. -
MapTypeId.TERRAIN
(جایگزین G_PHYSICAL_MAP
) یک نقشه فیزیکی را بر اساس اطلاعات زمین نمایش می دهد.
در زیر نمونه ای از v2 و v3 است که نقشه را برای نمای زمین تنظیم می کند:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API v3 نیز تغییراتی را در انواع نقشه های کمتر رایج ایجاد کرد:
- کاشیهای نقشه برای اجرام آسمانی غیر از زمین بهعنوان انواع نقشه در API v3 در دسترس نیستند، اما همانطور که در این مثال نشان داده شده است، میتوان بهعنوان انواع نقشههای سفارشی به آنها دسترسی داشت.
- هیچ نوع نقشه خاصی در نسخه 3 وجود ندارد که جایگزین نوع
G_SATELLITE_3D_MAP
از نسخه 2 شود. در عوض، میتوانید با استفاده از این کتابخانه ، افزونه Google Earth را در نقشههای نسخه 3 خود ادغام کنید.
حداکثر زوم تصاویر
تصاویر ماهواره ای همیشه در سطوح زوم بالا در دسترس نیستند. اگر ممکن است بخواهید قبل از تنظیم سطح بزرگنمایی، بالاترین سطح بزرگنمایی موجود را بدانید، از کلاس google.maps.MaxZoomService
استفاده کنید. این کلاس جایگزین متد GMapType.getMaxZoomAtLatLng()
از v2 می شود.
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.");
}
});
تصاویر پرسپکتیو هوایی
هنگام فعال کردن تصاویر هوایی در نسخه 3، کنترلها مشابه کنترل v2 GLargeZoomControl3D
هستند، با یک کنترل چرخش بینابینی اضافی برای چرخش در جهتهای پشتیبانیشده.
میتوانید شهرهایی را که در حال حاضر تصاویر 45 درجه در آنها موجود است، در این نقشه ردیابی کنید. هنگامی که تصاویر 45 درجه در دسترس است، یک گزینه از منوی فرعی به دکمه Maps API Satellite اضافه می شود.
لایه ها
لایه ها اشیایی روی نقشه هستند که از یک یا چند پوشش تشکیل شده اند. آنها را می توان به عنوان یک واحد دستکاری کرد و به طور کلی مجموعه ای از اشیاء را منعکس می کند.
لایه های پشتیبانی شده
v3 API دسترسی به چندین لایه مختلف را فراهم می کند. این لایه ها در قسمت های زیر با کلاس v2 GLayer
همپوشانی دارند:
- شی
KmlLayer
عناصر KML و GeoRSS را به روکشهای v3 تبدیل میکند و معادل لایه GeoXml
v2 را ارائه میکند. - شی
TrafficLayer
لایه ای را ارائه می دهد که شرایط ترافیک را نشان می دهد، شبیه به پوشش v2 GTrafficOverlay
.
این لایه ها با v2 متفاوت هستند. تفاوت ها در زیر توضیح داده شده است. آنها را می توان با فراخوانی setMap()
به نقشه اضافه کرد و شی Map
را برای نمایش لایه ارسال کرد.
اطلاعات بیشتر در مورد لایه های پشتیبانی شده در مستندات لایه ها موجود است.
لایه های KML و GeoRSS
Maps JavaScript API از فرمت های داده های KML و GeoRSS برای نمایش اطلاعات جغرافیایی پشتیبانی می کند. اگر میخواهید فایلهای KML یا GeoRSS را در نقشه قرار دهید، باید در دسترس عموم قرار گیرند. در نسخه 3، این فرمت های داده با استفاده از نمونه ای از KmlLayer
نمایش داده می شوند که جایگزین شی GGeoXml
از v2 می شود.
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);
لایه ترافیک
v3 به شما امکان می دهد تا با استفاده از شی 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);
برخلاف v2، هیچ گزینه ای برای سازنده TrafficLayer
در v3 وجود ندارد. حوادث در نسخه 3 در دسترس نیستند.
خدمات
ژئوکدینگ
Maps JavaScript API یک شی geocoder
برای geocoding آدرس ها به صورت پویا از ورودی کاربر فراهم می کند. اگر می خواهید آدرس های ثابت و شناخته شده را به صورت جغرافیایی کدگذاری کنید، به مستندات API Geocoding مراجعه کنید.
Geocoding API به طور قابل توجهی ارتقا یافته و بهبود یافته است و ویژگیهای جدیدی اضافه کرده و نحوه نمایش دادهها را تغییر داده است.
GClientGeocoder
در v2 API دو روش مختلف برای geocoding رو به جلو و معکوس و همچنین روش های اضافی برای تأثیرگذاری بر نحوه انجام geocoding ارائه کرد. در مقابل، شئ v3 Geocoder
تنها یک متد geocode()
ارائه میکند، که یک شی را به صورت تحت اللفظی شامل عبارتهای ورودی (به شکل یک شی درخواستهای جغرافیایی ) و یک متد برگشت فراخوان میگیرد. بسته به اینکه درخواست حاوی یک ویژگی address
متنی یا یک شی LatLng
باشد، API Geocoding یک پاسخ کدگذاری جغرافیایی رو به جلو یا معکوس را برمیگرداند. شما می توانید با ارسال فیلدهای اضافی به درخواست geocoding بر نحوه انجام geocoding تأثیر بگذارید:
- گنجاندن یک
address
متنی، کدگذاری جغرافیایی رو به جلو، معادل فراخوانی متد getLatLng()
راهاندازی میکند. - گنجاندن یک شی
latLng
باعث ایجاد geocoding معکوس می شود که معادل فراخوانی متد getLocations()
. - شامل کردن ویژگی
bounds
، Viewport Biasing را فعال میکند، که معادل فراخوانی متد setViewport()
. - از جمله ویژگی
region
، منطقه کد بایاس را فعال می کند، که معادل فراخوانی متد setBaseCountryCode()
.
پاسخ های کدگذاری جغرافیایی در v3 بسیار متفاوت از پاسخ های v2 هستند. v3 API ساختار تودرتویی را که v2 استفاده میکند با ساختار صافتری جایگزین میکند که تجزیه آسانتر است. علاوه بر این، پاسخهای v3 جزئیات بیشتری دارند: هر نتیجه دارای چندین مؤلفه آدرس است که به ارائه ایده بهتر از وضوح هر نتیجه کمک میکند.
کد زیر یک آدرس متنی می گیرد و اولین نتیجه از کدگذاری جغرافیایی آن را نشان می دهد:
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()
در v3 جایگزین متد load()
و loadFromWaypoints()
از API v2 می شود. این روش یک شی DirectionsRequest
را به صورت تحت اللفظی می گیرد که شامل عبارت های ورودی و یک متد برگشت به تماس است تا پس از دریافت پاسخ اجرا شود. گزینهها ممکن است در این شی به معنای واقعی کلمه داده شوند، مشابه شیء GDirectionsOptions
در v2.
در 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);
}
});
}
نمای خیابان
نمای خیابان گوگل نماهای تعاملی 360 درجه را از مکان های تعیین شده در محدوده تحت پوشش خود ارائه می دهد. API v3 به طور بومی از نمای خیابان در مرورگر پشتیبانی می کند، برخلاف v2 که برای نمایش تصاویر نمای خیابان به پلاگین Flash® نیاز داشت.
تصاویر نمای خیابان از طریق استفاده از شی StreetViewPanorama
در نسخه 3 یا شیء GStreetviewPanorama
در نسخه 2 پشتیبانی می شوند. این کلاسها رابطهای متفاوتی دارند، اما نقش یکسانی دارند: اتصال ظرف 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);
}
دسترسی مستقیم به داده های Street View از طریق شی StreetViewService
در نسخه 3 یا شیء مشابه GStreetviewClient
در نسخه 2 امکان پذیر است. هر دو رابطهای مشابهی برای بازیابی یا بررسی در دسترس بودن دادههای نمای خیابان ارائه میکنند و امکان جستجو بر اساس مکان یا شناسه پانوراما را فراهم میکنند.
در نسخه 3، نمای خیابان به طور پیش فرض فعال است. نقشه با یک کنترل آدمک نمای خیابان ظاهر می شود و API از div نقشه برای نمایش پانورامای StreetView استفاده مجدد می کند. کد زیر نحوه شبیهسازی رفتار v2 را با جدا کردن پانوراماهای نمای خیابان در یک بخش جداگانه نشان میدهد.
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);
}