Maps JavaScript API v2 tidak tersedia lagi mulai 26 Mei
2021. Akibatnya, peta v2 situs Anda akan berhenti berfungsi, dan akan menampilkan error JavaScript. Untuk terus menggunakan peta di situs Anda, lakukan migrasi ke
Maps JavaScript API v3. Panduan ini akan membantu Anda menyelesaikan
prosesnya.
Ringkasan
Setiap aplikasi akan memiliki proses migrasi yang sedikit berbeda;
namun, ada beberapa langkah yang umum untuk semua project:
- Dapatkan kunci baru. Maps JavaScript API kini menggunakan Konsol Google Cloud untuk mengelola kunci. Jika Anda masih menggunakan kunci v2, pastikan untuk mendapatkan
kunci API baru sebelum memulai migrasi.
- Perbarui Bootstrap API Anda. Sebagian besar aplikasi akan memuat Maps JavaScript API v3 dengan kode berikut:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- Perbarui kode Anda. Jumlah perubahan yang diperlukan akan
sangat bergantung pada aplikasi Anda. Perubahan umum meliputi:
- Selalu referensikan namespace google.maps. Di v3,
semua kode Maps JavaScript API disimpan di
namespaces
google.maps.*
, bukan namespace
global. Sebagian besar objek juga telah diganti namanya sebagai bagian dari proses ini. Misalnya, sebagai ganti GMap2
, Anda
kini akan memuat google.maps.Map
.
- Hapus semua referensi ke metode yang tidak digunakan lagi. Sejumlah
metode utilitas tujuan umum telah dihapus, seperti
GDownloadURL
dan GLog
.
Ganti fungsi ini dengan library utilitas pihak ketiga,
atau hapus referensi ini dari kode Anda.
- (Opsional) Tambahkan library ke kode Anda. Banyak
fitur telah dieksternalisasi ke dalam library utilitas sehingga setiap
aplikasi hanya perlu memuat bagian API yang akan digunakan.
- (Opsional) Konfigurasikan project Anda untuk menggunakan extern v3.
Extern v3 dapat digunakan untuk membantu memvalidasi kode Anda dengan
Closure
Compiler, atau untuk memicu pelengkapan otomatis di IDE Anda.
Pelajari lebih lanjut
Kompilasi dan Extern Lanjutan.
- Uji dan lakukan iterasi. Pada tahap ini, Anda masih
memiliki beberapa pekerjaan yang harus dilakukan, tetapi kabar baiknya adalah Anda akan berada di jalan yang benar
untuk aplikasi peta v3 baru.
Perubahan di V3 Maps JavaScript API
Sebelum merencanakan migrasi, Anda harus meluangkan waktu untuk memahami
perbedaan antara Maps JavaScript API v2 dan
Maps JavaScript API v3. Versi terbaru Maps JavaScript API telah ditulis dari awal, dengan fokus pada teknik pemrograman JavaScript modern, peningkatan penggunaan library, dan API yang disederhanakan.
Banyak fitur baru telah ditambahkan ke API, dan beberapa
fitur yang sudah dikenal telah diubah atau bahkan dihapus. Bagian ini menyoroti
beberapa perbedaan utama antara kedua rilis.
Beberapa perubahan dalam API v3 meliputi:
- Pustaka inti yang efisien. Banyak fungsi tambahan telah
dipindahkan ke
library,
yang membantu mengurangi waktu pemuatan dan penguraian untuk Core API, sehingga memungkinkan
peta Anda dimuat dengan cepat di perangkat apa pun.
- Meningkatkan performa beberapa fitur, seperti rendering poligon dan
penempatan penanda.
- Pendekatan baru untuk
batas penggunaan
sisi klien guna mengakomodasi alamat bersama yang digunakan oleh proxy
seluler dan firewall perusahaan dengan lebih baik.
- Menambahkan dukungan untuk beberapa browser
modern dan browser seluler. Dukungan untuk Internet Explorer 6 telah
dihapus.
- Menghapus banyak class helper tujuan umum (
GLog
atau
GDownloadUrl
). Saat ini, ada banyak
library JavaScript yang bagus yang menyediakan fungsi serupa,
seperti Closure atau
jQuery.
- Implementasi HTML5 Street View yang akan dimuat pada semua perangkat seluler.
- Panorama Street View kustom dengan foto Anda sendiri, yang memungkinkan Anda membagikan panorama lereng ski, rumah yang dijual, atau tempat menarik lainnya.
- Penyesuaian Maps Bergaya yang memungkinkan Anda mengubah tampilan elemen di peta dasar agar sesuai dengan gaya visual unik Anda.
- Dukungan untuk beberapa layanan baru, seperti
ElevationService
dan Distance
Matrix.
- Layanan rute yang ditingkatkan menyediakan rute alternatif, pengoptimalan rute (solusi perkiraan untuk
permasalahan penjual keliling), rute bersepeda (dengan
lapisan bersepeda), rute transportasi umum, dan
rute yang dapat ditarik.
- Format Geocoding yang diperbarui yang memberikan informasi type yang lebih akurat daripada nilai
accuracy
dari Geocoding API v2.
- Dukungan untuk beberapa Jendela Info di satu Peta
Meningkatkan Versi Aplikasi Anda
Kunci Baru Anda
Maps JavaScript API v3 menggunakan sistem kunci baru dari v2. Anda mungkin sudah
menggunakan kunci v3 dengan aplikasi Anda, dalam hal ini tidak diperlukan perubahan. Untuk memverifikasi, periksa URL tempat Anda memuat Maps JavaScript API untuk parameter key
-nya. Jika nilai kunci dimulai dengan 'ABQIAA', Anda
menggunakan kunci v2. Jika memiliki kunci v2, Anda harus mengupgrade ke kunci v3 sebagai bagian dari migrasi,
yang akan:
Kunci diteruskan saat memuat Maps JavaScript API v3.
Pelajari lebih lanjut cara membuat kunci API.
Perhatikan bahwa jika Anda adalah pelanggan Google Maps API for Work, Anda mungkin menggunakan client ID
dengan parameter client
, bukan menggunakan
parameter key
. Client ID masih didukung di Maps JavaScript API v3 dan tidak perlu melalui proses upgrade kunci.
Memuat API
Modifikasi pertama yang perlu Anda lakukan pada kode melibatkan cara memuat API. Di v2, Anda memuat Maps JavaScript API melalui permintaan ke http://maps.google.com/maps
. Jika memuat Maps JavaScript API v3, Anda harus melakukan perubahan berikut:
- Memuat API dari
//maps.googleapis.com/maps/api/js
- Hapus parameter
file
.
- Perbarui parameter
key
dengan kunci v3 baru Anda. Pelanggan Google Maps API for Work harus menggunakan parameter client
.
- (Khusus Premium Plan Google Maps Platform) Pastikan parameter
client
diberikan seperti yang dijelaskan dalam
Panduan Developer Premium Plan Google Maps Platform.
- Hapus parameter
v
untuk meminta
versi terbaru yang dirilis atau ubah nilainya sesuai dengan
skema
versioning v3.
- (Opsional) Ganti parameter
hl
dengan
language
dan pertahankan nilainya.
- (Opsional) Tambahkan parameter
libraries
untuk
memuat library
opsional.
Dalam kasus paling sederhana, bootstrap v3 hanya akan menentukan parameter kunci API Anda:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
Contoh di bawah meminta versi terbaru Maps JavaScript API v2 dalam bahasa Jerman:
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
Contoh di bawah adalah permintaan ekuivalen untuk v3.
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
Memperkenalkan namespace google.maps
Mungkin perubahan yang paling mencolok di Maps JavaScript API v3 adalah
pengenalan namespace google.maps
. API v2 menempatkan semua objek di namespace Global secara default, yang dapat menyebabkan konflik penamaan. Dalam v3, semua objek berada dalam
namespace google.maps
.
Saat memigrasikan aplikasi ke v3, Anda harus mengubah kode untuk
menggunakan namespace baru. Sayangnya, menelusuri "G" dan
menggantinya dengan "google.maps" tidak akan sepenuhnya berfungsi; tetapi, ini adalah aturan umum yang baik untuk diterapkan saat meninjau kode Anda. Berikut adalah beberapa contoh
class yang setara di v2 dan 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 |
Membuang Kode yang Tidak Terpakai
Maps JavaScript API v3 memiliki paralel untuk sebagian besar
fungsi di v2; namun, ada beberapa class yang tidak lagi
didukung. Sebagai bagian dari migrasi, Anda harus mengganti class
ini dengan library utilitas pihak ketiga, atau menghapus
referensi ini dari kode Anda. Ada banyak library JavaScript yang sangat baik yang
menyediakan fungsi serupa, seperti Closure atau
jQuery.
Class berikut tidak memiliki paralel di 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 |
|
Membandingkan Kode
Mari kita bandingkan dua aplikasi yang agak sederhana yang telah ditulis dengan
API v2 dan 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>
Seperti yang dapat Anda lihat, ada beberapa perbedaan antara kedua
aplikasi tersebut. Perubahan penting meliputi:
- Alamat dari mana API dimuat telah berubah.
- Metode
GBrowserIsCompatible()
dan GUnload()
tidak lagi diperlukan di v3, dan telah dihapus dari
API.
- Objek
GMap2
diganti dengan
google.maps.Map
sebagai objek pusat di API.
- Properti sekarang dimuat melalui kelas Options. Pada contoh
di atas, kita menetapkan tiga properti yang diperlukan untuk memuat peta —
center
, zoom
, dan mapTypeId
— melalui objek
MapOptions
yang disisipkan.
- UI default aktif secara default dalam v3. Anda dapat menonaktifkannya dengan
menetapkan properti
disableDefaultUI
ke true dalam objek
MapOptions
.
Ringkasan
Pada tahap ini, Anda akan memahami beberapa poin penting yang terlibat dalam migrasi dari Maps JavaScript API v2 ke v3.
Ada informasi selengkapnya yang mungkin perlu Anda ketahui, tetapi hal ini akan bergantung pada
aplikasi Anda. Di bagian berikut, kami telah menyertakan petunjuk migrasi untuk
kasus tertentu yang mungkin Anda alami. Selain itu, ada beberapa referensi
yang mungkin berguna bagi Anda selama proses upgrade.
- Dokumentasi Developer Maps JavaScript API v3 adalah tempat terbaik untuk mempelajari lebih lanjut API dan cara kerjanya.
- Referensi Maps JavaScript API v3 akan membantu Anda mempelajari lebih lanjut class dan metode baru di API v3.
- Komunitas Stack Overflow adalah tempat yang tepat untuk mengajukan pertanyaan terkait kode Anda. Di situs ini, pertanyaan dan jawaban yang berkaitan dengan Maps JavaScript API menggunakan tag 'google-maps' atau 'google-maps-api-3'.
- Pelanggan Premium Plan Google Maps Platform sebaiknya membaca
Dokumentasi Premium Plan
Google Maps Platform.
- Blog Developer Geo Google adalah cara yang bagus untuk mengetahui perubahan terbaru pada API.
Jika Anda memiliki masalah atau pertanyaan tentang artikel ini, gunakan
link KIRIM MASUKAN di bagian atas halaman ini.
Bagian ini memberikan perbandingan mendetail tentang fitur paling populer untuk Maps JavaScript API v2 dan v3. Setiap
bagian referensi dirancang untuk dibaca satu per satu. Sebaiknya
Anda tidak membaca referensi ini secara keseluruhan; sebagai gantinya, gunakan
materi ini untuk membantu migrasi Anda berdasarkan kasus per kasus.
- Peristiwa - mendaftar dan menangani peristiwa.
- Kontrol - memanipulasi kontrol navigasi yang muncul di peta.
- Overlay - menambahkan dan mengedit objek di peta.
- Jenis Peta - ubin yang membentuk peta dasar.
- Lapisan - menambahkan dan mengedit konten sebagai grup, seperti lapisan KML atau Lalu Lintas.
- Layanan - menggunakan layanan geocoding, rute, atau Street View Google.
Acara
Model peristiwa untuk Maps JavaScript API v3 mirip dengan yang digunakan di v2, walaupun banyak yang berubah di balik layar.
Kejadian Baru untuk Dukungan MVC
API v3 menambahkan tipe kejadian baru untuk merefleksikan perubahan status MVC. Sekarang ada dua jenis peristiwa:
- Peristiwa pengguna (seperti peristiwa mouse "klik") disebarkan dari DOM ke Maps JavaScript API. Peristiwa ini terpisah dan berbeda dari peristiwa DOM standar.
- Notifikasi perubahan status MVC mencerminkan perubahan dalam objek Maps API dan diberi nama menggunakan ketentuan
property_changed
.
Setiap objek Maps API mengekspor sejumlah kejadian yang telah dinamai. Aplikasi yang tertarik dengan peristiwa tertentu harus mendaftarkan pemroses peristiwa untuk peristiwa tersebut dan mengeksekusi kode saat peristiwa tersebut diterima. Mekanisme berbasis peristiwa ini sama di Maps JavaScript API v2 dan v3, kecuali bahwa namespace telah berubah dari GEvent
menjadi 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.');
});
Menghapus Pemroses Peristiwa
Untuk alasan performa, sebaiknya hapus pemroses peristiwa saat tidak
diperlukan lagi. Menghapus pemroses peristiwa berfungsi dengan cara yang sama di v2 dan v3:
- Saat Anda membuat pemroses peristiwa, objek buram (GEventListener
di v2, MapsEventListener
di v3) akan ditampilkan.
- Jika Anda ingin menghapus pemroses peristiwa, teruskan objek ini ke
metode
removeListener()
(GEvent.removeListener()
di v2 atau google.maps.event.removeListener()
di v3) untuk menghapus
pemroses peristiwa.
Memproses Peristiwa DOM
Jika Anda ingin merekam dan merespons peristiwa DOM (Document Object Model), v3 menyediakan metode statis google.maps.event.addDomListener()
, yang setara dengan metode GEvent.addDomListener()
di v2.
Menggunakan Argumen yang Diteruskan dalam Kejadian
Peristiwa UI sering kali meneruskan argumen peristiwa yang kemudian dapat diakses oleh pemroses peristiwa. Sebagian besar argumen peristiwa di v3 telah disederhanakan agar lebih konsisten dengan objek di API. (Lihat
Referensi v3
untuk mengetahui detailnya.)
Tidak ada argumen overlay
di pemroses peristiwa v3. Jika Anda mendaftarkan peristiwa click
pada peta v3, callback hanya akan terjadi saat pengguna mengklik peta dasar. Anda dapat mendaftarkan callback tambahan di overlay yang dapat diklik jika perlu bereaksi terhadap klik tersebut.
// 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
});
});
Kontrol
Maps JavaScript API menampilkan kontrol UI yang memungkinkan pengguna berinteraksi dengan peta Anda. Anda dapat menggunakan API untuk menyesuaikan tampilan kontrol ini.
Perubahan di Tipe Kontrol
Beberapa perubahan pada jenis control
telah diperkenalkan
dengan API v3.
- API v3 mendukung jenis peta tambahan, termasuk peta medan dan kemampuan untuk menambahkan jenis peta kustom.
- Kontrol hierarkis v2,
GHierarchicalMapTypeControl
, tidak lagi tersedia.
Anda dapat memperoleh efek yang serupa dengan menggunakan kontrol google.maps.MapTypeControlStyle.HORIZONTAL_BAR
.
- Tata letak horizontal yang disediakan oleh
GMapTypeControl
di v2 tidak tersedia di v3.
Menambahkan Kontrol ke Peta
Dengan Maps JavaScript API v2, Anda akan menambahkan kontrol ke peta melalui metode addControl()
objek peta. Di v3, Anda mengubah objek MapOptions
terkait, bukan mengakses atau mengubah kontrol secara langsung. Contoh
di bawah menunjukkan cara menyesuaikan peta untuk menambahkan kontrol
berikut:
- tombol yang memungkinkan pengguna beralih antar tipe peta yang tersedia
- skala peta
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);
Pemosisian Kontrol pada Peta
Pemosisian kontrol telah berubah banyak dalam v3. Di v2, metode addControl()
menggunakan parameter kedua opsional yang memungkinkan Anda menentukan posisi kontrol relatif terhadap sudut peta.
Di v3, Anda menetapkan posisi kontrol melalui properti position
dari opsi kontrol. Pemosisian kontrol ini tidak mutlak; sebagai gantinya, API akan menata letak kontrol secara cerdas dengan "mengalirkan"nya di sekitar elemen peta yang ada dalam batasan tertentu (seperti ukuran peta).
Hal ini memastikan kontrol default kompatibel dengan kontrol Anda.
Lihat Mengontrol
Pemosisi di v3 untuk mengetahui informasi selengkapnya.
Kode berikut memosisikan-ulang kontrol dari contoh di atas:
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);
Kontrol Kustom
Maps JavaScript API memungkinkan Anda membuat kontrol navigasi kustom.
Untuk menyesuaikan kontrol dengan v2 API, Anda akan membuat subclass
class GControl
dan menentukan pengendali untuk
metode initialize()
dan getDefaultPosition()
.
Tidak ada yang setara dengan class GControl
di v3. Sebagai gantinya, kontrol direpresentasikan sebagai elemen DOM. Untuk menambahkan kontrol kustom dengan v3 API, buat struktur DOM untuk kontrol di konstruktor sebagai turunan dari Node
(misalnya, elemen <div>
) dan tambahkan pemroses peristiwa untuk menangani peristiwa DOM apa pun. Kirim Node
ke array controls[position]
peta untuk menambahkan instance kontrol kustom ke peta Anda.
Dengan implementasi class HomeControl
yang mematuhi
persyaratan antarmuka yang disebutkan di atas (lihat dokumentasi Kontrol kustom untuk mengetahui detailnya), contoh kode berikut menunjukkan cara menambahkan kontrol kustom ke peta.
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
Overlay mencerminkan objek yang Anda "tambahkan" ke peta untuk menunjukkan titik, garis, area, atau kumpulan objek.
Menambahkan dan Membuang Hamparan
Jenis objek yang direpresentasikan
oleh Overlay sama antara v2 dan v3, tetapi ditangani
secara berbeda.
Overlay di API v2 ditambahkan ke dan dihapus dari peta menggunakan metode addOverlay()
dan removeOverlay()
dari objek GMap2
. Di v3, Anda menetapkan peta ke Overlay melalui properti map
dari class opsi overlay terkait.
Anda juga dapat menambahkan atau menghapus overlay secara langsung dengan memanggil metode setMap()
dari objek overlay, dan menentukan peta yang diinginkan. Menetapkan properti peta ke null
akan menghapus overlay.
Tidak ada metode clearOverlays()
di v3.
Jika ingin mengelola kumpulan overlay, Anda harus membuat array untuk
menyimpan overlay. Dengan menggunakan array ini, Anda kemudian dapat memanggil
setMap()
pada setiap overlay dalam array (meneruskan
null
jika Anda perlu menghapusnya).
Marker Dapat Diseret
Secara default, marker bisa diklik tapi tidak dapat diseret. Dua contoh berikut menambahkan penanda yang dapat ditarik:
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
});
Ikon
Anda bisa menetapkan ikon khusus agar ditampilkan sebagai pengganti marker default.
Untuk menggunakan image kustom di v2, Anda dapat membuat instance GIcon
dari G_DEFAULT_ICON type
, dan mengubahnya. Jika
gambar Anda lebih besar atau lebih kecil dari ikon default, Anda harus
menentukannya dengan instance GSize
.
API v3 sedikit menyederhanakan proses ini.
Cukup tetapkan properti icon
penanda ke URL gambar kustom Anda, dan API akan menetapkan ukuran ikon secara otomatis.
Maps JavaScript API juga menyediakan dukungan untuk ikon yang kompleks.
Ikon kompleks dapat mencakup beberapa kartu, bentuk kompleks,
atau menentukan "urutan tumpukan" tampilan gambar secara relatif
terhadap overlay lainnya. Untuk menambahkan bentuk ke penanda di v2, Anda
harus menentukan properti tambahan di setiap
instance GIcon
dan meneruskannya sebagai opsi
ke konstruktor GMarker
. Di v3, ikon yang ditentukan dengan cara ini harus menetapkan properti icon
-nya ke objek berjenis Icon
.
Bayangan marker tidak didukung di v3.
Contoh berikut menampilkan bendera pantai di Pantai Bondi di
Australia, dengan bagian transparan ikon yang tidak dapat diklik:
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
});
Polyline
Polyline terdiri dari array LatLng
, ditambah serangkaian segmen garis yang menghubungkan lokasi tersebut secara berurutan.
Membuat dan menampilkan objek Polyline
di v3 mirip dengan menggunakan objek GPolyline
di v2. Contoh berikut
menggambar polyline geodesi semi-transparan dengan lebar 3 piksel dari Zurich ke
Sydney melalui Singapura:
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 yang Dienkode
Tidak ada dukungan di v3 untuk membuat objek Polyline
secara langsung dari polyline
yang dienkode. Sebagai gantinya, Library Geometri menyediakan metode untuk mengenkode dan mendekode polyline. Lihat Library di Maps API v3 untuk mengetahui informasi selengkapnya tentang cara memuat library ini.
Contoh di bawah ini menggambar polyline yang sama yang dienkode; kode v3 menggunakan metode decodePath()
dari namespace 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);
Poligon
Sebuah Poligon mendefinisikan suatu region dalam loop tertutup. Sama seperti
objek Polyline
, objek Polygon
terdiri dari serangkaian titik dalam urutan yang berurutan. Class Polygon
v3
hampir sama dengan class GPolygon
v2, dengan pengecualian penting
bahwa Anda tidak perlu lagi mengulangi vertex awal di akhir
jalur untuk menutup loop. API v3 akan otomatis menutup poligon dengan menggambar goresan yang menghubungkan koordinat terakhir kembali ke koordinat pertama. Cuplikan kode berikut membuat poligon yang mewakili Segitiga Bermuda:
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);
Bentuk Dapat Diedit-Pengguna
Polyline dan poligon bisa dibuat dapat-diedit-pengguna. Cuplikan kode berikut setara:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
Untuk kemampuan menggambar yang lebih canggih, lihat
Library Gambar
dalam dokumentasi v3.
Jendela Info
InfoWindow
menampilkan konten dalam jendela mengambang di atas peta. Ada beberapa perbedaan utama antara jendela info v2 dan v3:
- API v2 hanya mendukung
GInfoWindow
per peta, sedangkan API v3 mendukung beberapa InfoWindow
serentak di setiap peta.
InfoWindow
v3 akan tetap terbuka saat Anda
mengklik peta. GInfoWindow
v2 akan tertutup secara otomatis saat Anda mengklik peta. Anda dapat mengemulasi perilaku v2 dengan menambahkan pemroses click
pada objek Map
.
- API v3 tidak memberikan dukungan native untuk
InfoWindow
dengan tab.
Overlay Bumi
Untuk menempatkan gambar pada peta, Anda harus menggunakan objek GroundOverlay
. Konstruktor untuk
GroundOverlay
pada dasarnya sama di v2 dan v3: konstruktor ini
menentukan URL gambar dan batas gambar sebagai
parameter.
Contoh berikut menempatkan peta antik Newark, NJ pada peta sebagai overlay:
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);
Tipe Peta
Jenis peta yang tersedia di v2 dan v3 sedikit berbeda, tetapi semua jenis peta dasar tersedia di kedua versi API. Secara default, v2 menggunakan ubin peta jalan "dicat" standar. Namun, v3 memerlukan jenis peta tertentu untuk diberikan saat membuat objek google.maps.Map
.
Tipe Peta Biasa
Empat tipe peta dasar yang tersedia di v2 dan v3:
MapTypeId.ROADMAP
(menggantikan G_NORMAL_MAP
) menampilkan tampilan peta jalan.
MapTypeId.SATELLITE
(menggantikan G_SATELLITE_MAP
) menampilkan gambar satelit Google Earth.
MapTypeId.HYBRID
(menggantikan G_HYBRID_MAP
) menampilkan gabungan tampilan normal dan satelit.
MapTypeId.TERRAIN
(menggantikan G_PHYSICAL_MAP
) menampilkan peta fisik berdasarkan informasi medan.
Berikut adalah contoh v2 dan v3 yang menyetel peta untuk menampilkan medan:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API v3 juga membuat beberapa perubahan pada jenis peta yang kurang umum:
- Ubin peta untuk benda langit selain Bumi
tidak tersedia sebagai jenis peta di API v3, tetapi dapat diakses sebagai
jenis peta kustom seperti yang ditunjukkan dalam
contoh ini.
- Tidak ada jenis peta khusus di v3 yang menggantikan jenis
G_SATELLITE_3D_MAP
dari v2. Sebagai gantinya,
Anda dapat mengintegrasikan plugin Google Earth di peta v3 menggunakan
library
ini.
Maximum Zoom Imagery
Gambar satelit tidak selalu tersedia pada tingkat zoom tinggi. Jika Anda ingin mengetahui tingkat zoom tertinggi yang tersedia sebelum menetapkan tingkat zoom, gunakan class google.maps.MaxZoomService
. Class ini menggantikan metode GMapType.getMaxZoomAtLatLng()
dari 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.");
}
});
Gambar Perspektif Aerial
Saat mengaktifkan gambar Aerial di v3, kontrolnya mirip dengan kontrol GLargeZoomControl3D
v2, dengan kontrol Rotate interstisial tambahan untuk memutar melalui arah yang didukung.
Anda dapat melacak kota tempat gambar 45° saat ini tersedia di peta ini. Jika citra 45° tersedia, opsi submenu akan ditambahkan
ke tombol Satelit Maps API.
Lapisan
Lapisan adalah objek di peta yang terdiri dari satu atau beberapa
overlay. Model dapat dimanipulasi sebagai satu unit dan umumnya mencerminkan
kumpulan objek.
Layer yang Didukung
API v3 menyediakan akses ke beberapa layer yang berbeda. Lapisan ini
tumpang-tindih dengan class GLayer
v2 di area berikut:
-
Objek
KmlLayer
merender elemen KML dan GeoRSS menjadi overlay v3, yang memberikan elemen yang setara untuk lapisan GeoXml
v2.
- Objek
TrafficLayer
merender lapisan yang menggambarkan kondisi lalu lintas, mirip dengan overlay GTrafficOverlay
v2.
Layer ini berbeda dari v2. Perbedaannya dijelaskan
di bawah. Lapisan dapat ditambahkan ke peta dengan memanggil setMap()
, dengan meneruskan objek Map
yang akan menampilkan lapisan.
Informasi selengkapnya tentang lapisan yang didukung tersedia di
Dokumentasi lapisan.
Layer KML dan GeoRSS
Maps JavaScript API mendukung format data KML dan GeoRSS untuk menampilkan informasi geografis. File KML atau GeoRSS harus dapat diakses secara publik jika Anda ingin menyertakannya dalam peta. Di v3, format data ini ditampilkan menggunakan instance KmlLayer
, yang menggantikan objek GGeoXml
dari v2.
API v3 lebih fleksibel saat merender KML, sehingga Anda dapat
menyembunyikan InfoWindows dan mengubah respons klik. Lihat dokumentasi Lapisan KML dan GeoRSS v3 untuk mengetahui detail selengkapnya.
Saat merender KmlLayer
,
batasan ukuran dan kompleksitas berlaku; lihat
dokumentasi KmlLayer
untuk mengetahui detailnya.
Contoh berikut membandingkan cara memuat file 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);
Layer Lalu Lintas
v3 memungkinkan Anda menambahkan informasi lalu lintas secara real-time (jika didukung) ke peta menggunakan objek TrafficLayer
. Informasi lalu lintas
diberikan untuk waktu permintaan dibuat. Contoh ini menunjukkan
informasi lalu lintas untuk Los Angeles:
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);
Tidak seperti v2, tidak ada opsi untuk konstruktor TrafficLayer
di v3. Insiden tidak tersedia di v3.
Layanan
Geocoding
Maps JavaScript API menyediakan objek geocoder
untuk melakukan geocoding alamat secara dinamis dari input pengguna. Jika Anda ingin melakukan geocoding pada alamat statis yang diketahui, lihat dokumentasi Geocoding API.
Geocoding API telah
diupgrade dan ditingkatkan secara signifikan, dengan menambahkan fitur baru dan mengubah
cara data ditampilkan.
GClientGeocoder
di API v2 menyediakan dua metode yang berbeda untuk geocoding maju dan mundur serta metode tambahan untuk memengaruhi cara geocoding dilakukan. Sebaliknya, objek Geocoder
v3 hanya menyediakan metode geocode()
, yang menggunakan literal objek yang berisi istilah input (dalam bentuk objek Permintaan Geocoding) dan metode callback. Bergantung pada apakah permintaan tersebut berisi atribut address
tekstual atau objek LatLng
, Geocoding API akan menampilkan respons geocoding maju atau balik. Anda dapat memengaruhi cara geocoding dilakukan dengan meneruskan kolom tambahan ke permintaan geocoding:
- Menyertakan
address
tekstual akan memicu geocoding maju,
yang setara dengan memanggil metode getLatLng()
.
- Menyertakan objek
latLng
akan memicu geocoding terbalik,
yang setara dengan memanggil metode getLocations()
.
- Menyertakan atribut
bounds
akan mengaktifkan Viewport
Biasing, yang setara dengan memanggil metode setViewport()
.
- Menyertakan atribut
region
akan mengaktifkan Region
Code Biasing, yang setara dengan memanggil
metode setBaseCountryCode()
.
Respons Geocoding di v3 sangat berbeda dengan respons v2. API v3
menggantikan struktur bertingkat yang digunakan v2 dengan struktur yang lebih datar dan
lebih mudah diuraikan. Selain itu, respons v3 lebih mendetail: setiap
hasil memiliki beberapa komponen alamat yang membantu memberikan gambaran yang lebih baik tentang resolusi
setiap hasil.
Kode berikut mengambil alamat tekstual dan menampilkan hasil pertama dari geocoding-nya:
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');
}
Rute
Maps JavaScript API v3 mengganti class GDirections
dari v2 dengan class DirectionsService
untuk menghitung rute.
Metode route()
di v3 menggantikan metode load()
dan loadFromWaypoints()
dari v2 API. Metode ini menggunakan satu literal objek DirectionsRequest
yang berisi istilah input dan metode callback yang akan dieksekusi setelah menerima respons. Opsi dapat diberikan dalam literal objek ini,
mirip dengan literal objek GDirectionsOptions
di v2.
Di Maps JavaScript API v3, tugas mengirimkan permintaan rute telah dipisahkan dari tugas merender permintaan, yang kini ditangani dengan class DirectionsRenderer
. Anda dapat mengaitkan objek DirectionsRenderer
ke peta atau objek DirectionsResult
melalui metode setMap()
dan setDirections()
. Karena perender adalah
MVCObject
, perender ini akan mendeteksi perubahan pada propertinya dan
memperbarui peta jika rute yang terkait telah berubah.
Kode berikut menunjukkan cara meminta rute jalan kaki ke lokasi tertentu menggunakan jalur pejalan kaki dari alamat. Perhatikan bahwa hanya
v3 yang dapat memberikan rute jalan kaki di jalur pejalan kaki di
Kebun Binatang Dublin.
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);
}
});
}
Street View
Google Street View memberikan tampilan 360° interaktif dari lokasi yang ditetapkan dalam area cakupannya. API v3 mendukung Street View secara native dalam browser, tidak seperti v2 yang memerlukan plugin Flash® untuk menampilkan gambar Street View.
Gambar Street View didukung melalui penggunaan objek StreetViewPanorama
di v3, atau objek GStreetviewPanorama
di v2. Class ini memiliki
antarmuka yang berbeda, tetapi memiliki peran yang sama: menghubungkan
penampung div
dengan gambar Street View dan memungkinkan
Anda menentukan lokasi dan POV (titik pandang) panorama
Street View.
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);
}
Akses langsung ke data Street View dapat dilakukan melalui objek StreetViewService
di v3 atau objek GStreetviewClient
serupa di v2. Keduanya menyediakan antarmuka yang serupa untuk mengambil atau memeriksa ketersediaan data Street View, dan memungkinkan penelusuran menurut lokasi atau ID panorama.
Di v3, Street View secara default diaktifkan. Peta akan muncul dengan kontrol Pegman Street View dan API akan menggunakan kembali div peta untuk menampilkan panorama StreetView. Kode berikut mengilustrasikan cara mengemulasi perilaku v2 dengan memisahkan panorama Street View ke dalam div terpisah.
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);
}