Od 26 maja 2021 r. interfejs Maps JavaScript API w wersji 2 nie jest już dostępny. W efekcie mapy w wersji 2. Twojej witryny przestaną działać i zaczną zwracać błędy JavaScriptu. Aby nadal korzystać z map w swojej witrynie, zmień wersję Maps JavaScript API na 3. Ten przewodnik pomoże Ci przeprowadzić ten proces.
Omówienie
Każda aplikacja ma nieco inny proces migracji, jednak niektóre kroki są wspólne dla wszystkich projektów:
- Uzyskaj nowy klucz. Interfejs Maps JavaScript API do zarządzania kluczami korzysta teraz z konsoli Google Cloud Console. Jeśli nadal używasz klucza w wersji 2, przed rozpoczęciem migracji pobierz nowy klucz API.
- Zaktualizuj bootstrap interfejsu API. Większość aplikacji wczytuje interfejs Maps JavaScript API w wersji 3 za pomocą tego kodu:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- Zaktualizuj kod. Wymagana ilość zmian zależy w dużej mierze od aplikacji. Typowe zmiany to:
- Zawsze odwołuj się do przestrzeni nazw google.maps. W wersji 3 cały kod interfejsu Maps JavaScript API jest przechowywany w przestrzeni nazw
google.maps.*
, a nie w przestrzeni nazw globalnej. W ramach tego procesu zmieniliśmy nazwy większości obiektów. Na przykład zamiast GMap2
będziesz teraz wczytywać google.maps.Map
.
- Usuń wszelkie odwołania do przestarzałych metod. Usunięto kilka metod ogólnych, takich jak
GDownloadURL
i GLog
.
Zastąp tę funkcję zewnętrznymi bibliotekami narzędzi lub usuń te odwołania z kodu.
- (Opcjonalnie) Dodaj biblioteki do kodu. Wiele funkcji zostało wyodrębnionych do zewnętrznych bibliotek narzędziowych, dzięki czemu każda aplikacja musi wczytywać tylko te części interfejsu API, których używa.
- (Opcjonalnie) Skonfiguruj projekt tak, aby używał zewnętrznych bibliotek w wersji 3.
Zewnętrzne biblioteki w wersji 3 można używać do sprawdzania kodu za pomocą kompilatora Closure Compiler lub do wywoływania autouzupełniania w IDE.
Dowiedz się więcej o
kompilacji zaawansowanej i zewnętrznych bibliotekach zewnętrznych.
- Testuj i powtarzaj W tym momencie nadal czeka Cię trochę pracy, ale dobra wiadomość jest taka, że będziesz już blisko nowej wersji map v3.
Zmiany w wersji 3 interfejsu Maps JavaScript API
Zanim zaplanujesz migrację, zapoznaj się z różnicami między interfejsem Maps JavaScript API w wersji 2 a interfejsem Maps JavaScript API w wersji 3. Najnowsza wersja interfejsu Maps JavaScript API została napisana od podstaw z uwzględnieniem nowoczesnych technik programowania w języku JavaScript, częstszego korzystania z bibliotek i uproszczonego interfejsu API.
Do interfejsu API dodano wiele nowych funkcji, a kilka znanych funkcji zostało zmienionych lub nawet usuniętych. W tej sekcji opisaliśmy najważniejsze różnice między tymi 2 wersjami.
Niektóre zmiany w interfejsie API w wersji 3 to:
- usprawniona podstawowa biblioteka; Wiele funkcji dodatkowych zostało przeniesionych do bibliotek, co pozwoliło skrócić czas wczytywania i analizowania interfejsu Core API, dzięki czemu mapa wczytuje się szybko na dowolnym urządzeniu.
- Zwiększona wydajność kilku funkcji, takich jak renderowanie wielokątów i umieszczenie znaczników.
- Nowe podejście do limitów użycia po stronie klienta, aby lepiej dostosować się do współdzielonych adresów używanych przez serwery proxy na urządzeniach mobilnych i firmowe zapory sieciowe.
- Dodano obsługę kilku nowoczesnych przeglądarek i przeglądarek mobilnych. Obsługa Internet Explorera 6 została usunięta.
- Usunięto wiele klas pomocniczych o ogólnym zastosowaniu (
GLog
lub
GDownloadUrl
). Obecnie istnieje wiele doskonałych bibliotek JavaScript, które zapewniają podobne funkcje, np. Closure czy jQuery.
- Implementacja Street View w HTML5, która będzie wczytywać się na dowolnym urządzeniu mobilnym.
- Niestandardowe panoramy Street View ze zdjęciami własnymi, dzięki którym możesz udostępniać panoramy stoków narciarskich, domów na sprzedaż lub innych interesujących miejsc.
- Mapy stylizowane – umożliwiają zmianę wyświetlania elementów na mapie podstawowej, aby dopasować ją do Twojego niepowtarzalnego stylu wizualnego.
- Obsługa kilku nowych usług, takich jak ElevationService i DistanceMatrix.
- Ulepszony serwis wskazówek drogowych zapewnia alternatywne trasy, optymalizację trasy (przybliżone rozwiązania
problemu sprzedawcy podróżującego), wskazówki dotyczące jazdy na rowerze (z
warstwą rowerową), wskazówki dotyczące transportu publicznego oraz
wskazówki drogowe z możliwością przeciągania.
- Zaktualizowany format geokodowania, który zapewnia dokładniejsze informacje o typie niż wartość
accuracy
z interfejsu Geocoding API v2.
- Obsługa wielu okien Informacje na jednej mapie
Twój nowy klucz
Interfejs Maps JavaScript API w wersji 3 korzysta z nowego systemu kluczy z wersji 2. W przypadku aplikacji możesz już używać klucza 3. W takim przypadku nie musisz niczego zmieniać. Aby to sprawdzić, sprawdź adres URL, z którego wczytujesz interfejs Maps JavaScript API, pod kątem parametru key
. Jeśli wartość klucza zaczyna się od „ABQIAA”, używasz klucza w wersji 2. Jeśli masz klucz w wersji 2, musisz go uaktualnić do wersji 3 w ramach migracji. W efekcie:
Klucz jest przekazywany podczas wczytywania interfejsu Maps JavaScript API w wersji 3.
Więcej informacji o generowaniu kluczy interfejsu API
Pamiętaj, że jeśli korzystasz z interfejsów API Map Google dla firmy, możesz używać identyfikatora klienta z parametrem client
zamiast parametru key
. Identyfikatory klienta są nadal obsługiwane w interfejsie Maps JavaScript API w wersji 3 i nie trzeba przechodzić procesu uaktualniania klucza.
Wczytywanie interfejsu API
Pierwsza modyfikacja, którą musisz wprowadzić w kodzie, dotyczy sposobu wczytywania interfejsu API. W wersji 2 interfejs Maps JavaScript API wczytujesz za pomocą żądania do interfejsu http://maps.google.com/maps
. Jeśli wczytujesz interfejs Maps JavaScript API w wersji 3, musisz wprowadzić te zmiany:
- Wczytaj interfejs API z
//maps.googleapis.com/maps/api/js
- Usuń parametr
file
.
- Zaktualizuj parametr
key
, podając swój nowy klucz wersji 3. Klienci korzystający z interfejsów API Map Google for Work powinni używać parametru client
.
- (dotyczy tylko subskrypcji Google Maps Platform Premium) Upewnij się, że parametr
client
jest podany zgodnie z opisem w
przewodniku dla programistów dotyczącym subskrypcji Google Maps Platform Premium.
- Aby zażądać najnowszej wersji, usuń parametr
v
lub zmień jego wartość zgodnie ze schematem wersji 3.
- (Opcjonalnie) Zastąp parametr
hl
parametrem language
i zachowaj jego wartość.
- (Opcjonalnie) Dodaj parametr
libraries
, aby wczytać opcjonalne biblioteki.
W najprostszym przypadku bootstrap v3 będzie zawierać tylko parametr klucza interfejsu API:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
W przykładzie poniżej wysyłamy żądanie do najnowszej wersji interfejsu Maps JavaScript API 2 w języku niemieckim:
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
Poniżej znajdziesz przykład żądania o takim samym znaczeniu w wersji 3.
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
Przedstawiamy przestrzeń nazw google.maps
Prawdopodobnie najbardziej zauważalną zmianą w Maps JavaScript API w wersji 3 jest wprowadzenie przestrzeni nazw google.maps
. Interfejs API w wersji 2 domyślnie umieszcza wszystkie obiekty w globalnej przestrzeni nazw, co może powodować kolizje nazw. W wersji 3 wszystkie obiekty znajdują się w przestrzeni nazw google.maps
.
Podczas migracji aplikacji na wersję 3.0 musisz zmienić kod, aby korzystać z nowej przestrzeni nazw. Wyszukiwanie „G” i zastępowanie tego fragmentu ciągiem znaków „google.maps” nie przyniesie oczekiwanych rezultatów, ale jest to przydatna reguła podczas sprawdzania kodu. Poniżej znajdziesz kilka przykładów klas o odpowiednich funkcjach w wersji 2 i 3.
v2 |
Wersja 3 |
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 |
Usuwanie przestarzałego kodu
Interfejs Maps JavaScript API w wersji 3 zawiera odpowiedniki większości funkcji z wersji 2, ale niektóre klasy nie są już obsługiwane. W ramach migracji należy zastąpić te klasy bibliotekami narzędzi zewnętrznych lub usunąć te odwołania z kodu. Istnieje wiele świetnych bibliotek JavaScript, które zapewniają podobne funkcje, np. Closure czy jQuery.
Te klasy nie mają odpowiedników w interfejsie Maps JavaScript API w wersji 3:
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 |
|
Porównywanie kodu
Porównajmy 2 raczej proste aplikacje napisane za pomocą interfejsów API w wersji 2 i 3.
<!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>
Jak widać, te 2 aplikacje różni się od siebie w kilku aspektach. Najważniejsze zmiany:
- Zmienił się adres, z którego wczytywane jest interfejs API.
- Metody
GBrowserIsCompatible()
i GUnload()
nie są już wymagane w wersji 3 i zostały usunięte z interfejsu API.
- Obiekt
GMap2
zostaje zastąpiony przez obiekt google.maps.Map
, który staje się centralnym obiektem w interfejsie API.
- Właściwości są teraz ładowane za pomocą klas opcji. W powyższym przykładzie ustawiamy 3 właściwości wymagane do załadowania mapy (
center
, zoom
i mapTypeId
) za pomocą wbudowanego obiektu MapOptions
.
- W wersji 3 domyślny interfejs jest domyślnie włączony. Możesz to wyłączyć, ustawiając właściwość
disableDefaultUI
na wartość true w obiekcie MapOptions
.
Podsumowanie
W tym momencie powinieneś/powinnaś już znać najważniejsze punkty migracji z wersji 2 na wersję 3 interfejsu Maps JavaScript API.
Możesz potrzebować więcej informacji, ale wszystko zależy od Twojego zgłoszenia. W następnych sekcjach znajdziesz instrukcje migracji w przypadku konkretnych sytuacji, z którymi możesz się spotkać. Dodatkowo udostępniamy kilka materiałów, które mogą Ci się przydać podczas procesu uaktualniania.
Jeśli masz pytania lub wątpliwości dotyczące tego artykułu, kliknij link WYŚLIJ KOMENTARZ u góry tej strony.
W tej sekcji znajdziesz szczegółowe porównanie najpopularniejszych funkcji interfejsu Maps JavaScript API w wersji 2 i 3. Każdy rozdział w podręczniku został tak opracowany, aby można było czytać go osobno. Zalecamy, aby nie czytać tego dokumentu w całości. Zamiast tego należy korzystać z tego materiału w celu ułatwienia migracji w każdym konkretnym przypadku.
- Zdarzenia – rejestrowanie i obsługa zdarzeń.
- Elementy sterujące – umożliwiają manipulowanie elementami sterującymi nawigacją wyświetlanymi na mapie.
- Nakładki – dodawanie i edytowanie obiektów na mapie.
- Typy map – fragmenty mapy, które tworzą mapę podstawową.
- Warstwy – dodawanie i edytowanie treści jako grupy, na przykład warstw KML lub ruchu.
- Usługi – praca z geokodowaniem Google, wskazówkami lub usługami Street View.
Wydarzenia
Model zdarzeń interfejsu Maps JavaScript API w wersji 3 jest podobny do modelu używanego w wersji 2, ale pod maską wiele się zmieniło.
Nowe zdarzenie do obsługi MVC
Interfejs API w wersji 3 dodaje nowy typ zdarzenia, aby odzwierciedlać zmiany stanu MVC. Obecnie dostępne są 2 rodzaje zdarzeń:
- Zdarzenia użytkownika (np. zdarzenia myszy „kliknięcie”) są propagowane z DOM do Maps JavaScript API. Te zdarzenia są odrębne i różnią się od standardowych zdarzeń DOM.
- Powiadomienia o zmianie stanu MVC odzwierciedlają zmiany w obiektach interfejsu Maps API i są nazywane zgodnie z konwencją
property_changed
.
Każdy obiekt interfejsu Maps API eksportuje określoną liczbę nazwanych zdarzeń. Aplikacje, które interesują się określonymi zdarzeniami, powinny zarejestrować ich detektory i wykonać kod po ich otrzymaniu. Ten mechanizm sterowany zdarzeniami jest taki sam w wersjach 2 i 3 interfejsu Maps JavaScript API, z tym że zmieniła się przestrzeń nazw: z GEvent
na 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.');
});
Usuwanie detektorów zdarzeń
Ze względu na wydajność najlepiej usunąć detektor zdarzeń, gdy nie jest już potrzebny. Usuwanie detektora zdarzeń działa tak samo w wersjach 2 i 3:
- Podczas tworzenia detektora zdarzeń zwracany jest obiekt nieprzezroczysty (GEventListener w wersji 2, MapsEventListener w wersji 3).
- Aby usunąć detektor zdarzeń, przekaż ten obiekt metodzie
removeListener()
(GEvent.removeListener()
w wersji 2 lub google.maps.event.removeListener()
w wersji 3), aby usunąć detektor zdarzeń.
Nasłuchiwanie zdarzeń DOM
Jeśli chcesz rejestrować zdarzenia DOM (Document Object Model) i na nie odpowiadać, w wersji 3 dostępna jest metoda statyczna google.maps.event.addDomListener()
, która jest odpowiednikiem metody GEvent.addDomListener()
w wersji 2.
Używanie parametrów przekazywanych w zdarzeniach
Zdarzenia interfejsu użytkownika często przekazują argument zdarzenia, do którego odbiornik zdarzenia może uzyskać dostęp. Większość argumentów zdarzeń w wersji 3 została uproszczona, aby była bardziej spójna z obiektami w interfejsie API. (więcej informacji znajdziesz w materiałach referencyjnych wersji 3).
W detektorach zdarzeń w wersji 3 nie ma argumentu overlay
. Jeśli zarejestrujesz zdarzenie click
na mapie w wersji 3, wywołanie zwrotne nastąpi tylko wtedy, gdy użytkownik kliknie mapę podstawową. Jeśli chcesz reagować na kliknięcia, możesz zarejestrować dodatkowe wywołania zwrotne dla klikalnych nakładek.
// 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
});
});
Elementy sterujące
Interfejs Maps JavaScript API wyświetla elementy sterujące interfejsem użytkownika, które umożliwiają użytkownikom interakcję z mapą. Za pomocą interfejsu API możesz dostosować sposób wyświetlania tych elementów.
Zmiany w typach kontroli
Wprowadziliśmy pewne zmiany w typach control
w interfejsie API w wersji 3.
- Interfejs API w wersji 3 obsługuje dodatkowe typy map, w tym mapy terenu i możliwość dodawania niestandardowych typów map.
- Element hierarchiczny w wersji 2,
GHierarchicalMapTypeControl
, nie jest już dostępny.
Podobny efekt możesz uzyskać, używając ustawienia google.maps.MapTypeControlStyle.HORIZONTAL_BAR
.
- Układ poziomy udostępniany przez tag
GMapTypeControl
w wersji 2 jest niedostępny w wersji 3.
Dodawanie elementów sterujących do mapy
W interfejsie Maps JavaScript API v2 możesz dodać elementy sterujące do mapy za pomocą metody addControl()
obiektu mapy. W wersji 3 zamiast uzyskiwać dostęp do elementów sterujących lub modyfikować ich bezpośrednio, modyfikujesz powiązany obiekt MapOptions
. Przykład poniżej pokazuje, jak dostosować mapę, aby dodać te opcje:
- przyciski umożliwiające użytkownikowi przełączanie się między dostępnymi typami map;
- skali mapy;
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);
Elementy sterujące pozycjonowaniem na mapie
Ustawienia pozycjonowania zostały znacznie zmienione w wersji 3. W wersji 2 metoda addControl()
przyjmuje opcjonalny drugi parametr, który umożliwia określenie położenia elementu sterującego względem narożników mapy.
W wersji 3 pozycję elementu sterującego ustawiasz za pomocą właściwości position
opcji elementu. Położenie tych elementów nie jest absolutne. Zamiast tego interfejs API rozmieszcza je inteligentnie, „przesuwając” je wokół istniejących elementów mapy w ograniczonych ramach (np. rozmiaru mapy).
Dzięki temu domyślne ustawienia będą zgodne z Twoimi ustawieniami.
Więcej informacji znajdziesz w artykule Zarządzanie pozycjonowaniem w wersji 3.
Poniższy kod zmienia położenie elementów sterujących z powyższych przykładów:
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);
Elementy sterujące niestandardowe
Interfejs Maps JavaScript API umożliwia tworzenie niestandardowych elementów sterujących nawigacją.
Aby dostosować elementy sterujące za pomocą interfejsu API w wersji 2, musisz utworzyć podklasę klasy GControl
i zdefiniować metody obsługi dla metod initialize()
i getDefaultPosition()
.
W wersji 3 nie ma odpowiednika klasy GControl
. Zamiast tego kontrolki są reprezentowane jako elementy DOM. Aby dodać element sterujący niestandardowy za pomocą interfejsu API w wersji 3, utwórz strukturę DOM elementu sterującego w konstruktorze jako element podrzędny elementu Node
(np. elementu <div>
) i dodaj odbiorniki zdarzeń, które będą obsługiwać zdarzenia DOM. Prześlij element Node
do tablicy controls[position]
map, aby dodać do mapy instancję elementu sterującego niestandardowego.
W przypadku implementacji klasy HomeControl
, która spełnia wymagania dotyczące interfejsu opisane powyżej (szczegółowe informacje znajdziesz w dokumentacji elementów sterujących niestandardowych), poniższe przykłady kodu pokazują, jak dodać do mapy element sterujący niestandardowy.
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);
Nakładki
Nakładki odzwierciedlają obiekty, które „dodasz” do mapy, aby wyznaczyć punkty, linie, obszary lub kolekcje obiektów.
Dodawanie i usuwanie nakładek
Typy obiektów reprezentowanych przez nakładkę są takie same w wersji 2 i 3, ale są one obsługiwane w inny sposób.
Na mapie dodano i usunięto nakłady w interfejsie API w wersji 2 za pomocą metod addOverlay()
i removeOverlay()
obiektu GMap2
. W wersji 3 mapę przypisujesz do nakładki za pomocą właściwości map
powiązanej klasy opcji nakładki.
Możesz też dodać lub usunąć nakładkę bezpośrednio, wywołując metodę setMap()
obiektu nakładki i określając żądaną mapę. Ustawienie właściwości mapy na null
powoduje usunięcie nakładki.
W wersji 3 nie ma metody clearOverlays()
.
Jeśli chcesz zarządzać zestawem nakładek, utwórz tablicę, która będzie je przechowywać. Następnie możesz wywołać funkcję setMap()
dla każdego nakładania w tablicy (przekazując null
, jeśli chcesz je usunąć).
Znaczniki, które można przeciągać
Domyślnie znaczniki można klikać, ale nie można ich przeciągać. W tych 2 przykładach pokazano dodawanie znacznika, który można przeciągać:
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
});
Ikony
Możesz zdefiniować ikonę niestandardową, która będzie wyświetlana zamiast domyślnego znacznika.
Aby użyć niestandardowego obrazu w wersji 2, możesz utworzyć instancję GIcon
z poziomu G_DEFAULT_ICON type
i ją zmodyfikować. Jeśli obraz jest większy lub mniejszy niż domyślna ikona, musisz go określić za pomocą instancji GSize
.
Interfejs API w wersji 3 nieco upraszcza ten proces.
Wystarczy ustawić w markerze właściwość icon
na adres URL niestandardowego obrazu, a interfejs API automatycznie dostosuje rozmiar ikony.
Interfejs Maps JavaScript API obsługuje też złożone ikony.
Ikona złożona może zawierać wiele kafelków, złożone kształty lub określać „kolejność nakładania” obrazów względem innych nakładek. Aby dodać kształt do znacznika w wersji 2, musisz podać dodatkową właściwość w każdym wystąpieniu GIcon
i przekazać ją jako opcję konstruktorowi GMarker
. W wersji 3 ikony określone w ten sposób powinny mieć właściwości icon
ustawione na obiekt typu Icon
.
Cienie znaczników nie są obsługiwane w wersji 3.
W tych przykładach widać flagę na plaży Bondi w Australii. Przezroczysta część ikony nie jest klikalna:
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
});
Linie łamane
Linia złożona składa się z tablicy elementów LatLng
oraz serii odcinków linii, które łączą te lokalizacje w uporządkowanej kolejności.
Tworzenie i wyświetlanie obiektu Polyline
w wersji 3 jest podobne do korzystania z obiektu GPolyline
w wersji 2. W tych przykładach rysowana jest półprzezroczysta linia geodezyjna o szerokości 3 pikseli z Zurychu do Sydney przez Singapur:
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);
Zaszyfrowane linie łamane
Wersja 3 nie obsługuje tworzenia obiektów Polyline
bezpośrednio z zakodowanych polilinii. Zamiast tego biblioteka Geometry Library udostępnia metody kodowania i dekodowania ścieżek poliliniowych. Więcej informacji o wczytywaniu tej biblioteki znajdziesz w sekcji Biblioteki w interfejsie API Map w wersji 3.
Przykłady poniżej rysują ten sam zakodowany wielokąt; kod v3 używa metody decodePath()
z przestrzeni nazw 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);
Wielokąty
Wielokąt definiuje obszar wewnątrz zamkniętej pętli. Podobnie jak obiekt Polyline
, obiekty Polygon
składają się z szeregu punktów w uporządkowanej sekwencji. Klasa Polygon
w wersji 3 jest bardzo podobna do klasy GPolygon
w wersji 2, z tą różnicą, że nie trzeba już powtarzać wierzchołka początkowego na końcu ścieżki, aby zamknąć pętlę. Interfejs API v3 automatycznie zamyka wielokąty, łącząc ostatnią współrzędną z pierwszą. Poniższe fragmenty kodu tworzą wielokąt reprezentujący Trójkąt Bermudzki:
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);
Kształty edytowalne przez użytkownika
Linie i wielokąty można udostępnić do edycji przez użytkowników. Te fragmenty kodu są równoważne:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
Więcej informacji o zaawansowanych funkcjach rysowania znajdziesz w bibliotece rysunków w dokumentacji wersji 3.
Okna informacyjne
InfoWindow
wyświetla treści w oknie nakładanym na mapę. Oto kilka kluczowych różnic między oknami informacyjnymi w wersji 2 a 3:
- Interfejs API w wersji 2 obsługuje tylko
GInfoWindow
na mapę, natomiast interfejs API w wersji 3 obsługuje wiele jednoczesnych InfoWindow
na każdą mapę.
- Po kliknięciu mapy
InfoWindow
wersji 3 pozostanie otwarta. W wersji 2 GInfoWindow
zamyka się automatycznie, gdy klikniesz mapę. Możesz emulować zachowanie wersji 2, dodając do obiektu click
listenera.Map
- Interfejs API w wersji 3 nie obsługuje natywnych kart.
InfoWindow
Nakładki na powierzchnię
Aby umieścić obraz na mapie, użyj obiektu GroundOverlay
. Konstruktor elementu GroundOverlay
jest w wersji 2 i 3 zasadniczo taki sam: określa adres URL obrazu i jego granice jako parametry.
W tym przykładzie umieszczamy na mapie antyczną mapę Newark w New Jersey jako nakładkę:
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);
Typy map
Typy map dostępne w wersji 2 i 3 różnią się nieznacznie, ale wszystkie podstawowe typy map są dostępne w obu wersjach interfejsu API. Domyślnie wersja 2.0 używa standardowych „malowanych” kafelków mapy drogowej. Wersja 3 wymaga jednak podania określonego typu mapy podczas tworzenia obiektu google.maps.Map
.
Typy map
W wersji 2 i 3 dostępne są 4 podstawowe typy map:
MapTypeId.ROADMAP
(zastępuje G_NORMAL_MAP
) wyświetla widok mapy drogowej.
MapTypeId.SATELLITE
(zastępuje G_SATELLITE_MAP
)
wyświetla zdjęcia satelitarne Google Earth.
MapTypeId.HYBRID
(zastępuje G_HYBRID_MAP
) wyświetla widok mieszany: normalny i satelitarny.
MapTypeId.TERRAIN
(zastępuje G_PHYSICAL_MAP
) wyświetla mapę fizyczną opartą na informacjach o terenie.
Poniżej znajdziesz przykład ustawienia mapy na widok terenu w wersji 2 i 3:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
W wersji 3 interfejsu Maps JavaScript API wprowadzono też kilka zmian dotyczących rzadziej używanych typów map:
- Płytki mapy dla obiektów niebieskich innych niż Ziemia
nie są dostępne jako typy map w interfejsie API w wersji 3, ale można uzyskać do nich dostęp jako niestandardowe typy map, jak pokazano w tym przykładzie.
- W wersji 3 nie ma specjalnego typu mapy, który zastąpiłby typ
G_SATELLITE_3D_MAP
z wersji 2. Zamiast tego możesz zintegrować wtyczkę Google Earth z mapami w wersji 3, korzystając z tej biblioteki.
Obraz w maksymalnym powiększeniu
Zdjęcia satelitarne nie zawsze są dostępne przy dużym powiększeniu. Jeśli przed ustawieniem poziomu powiększenia chcesz poznać najwyższy dostępny poziom powiększenia, użyj klasy google.maps.MaxZoomService
. Ta klasa zastępuje metodę GMapType.getMaxZoomAtLatLng()
z wersji 2.
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.");
}
});
Zdjęcia lotnicze w perspektywie
Po włączeniu zdjęć lotniczych w wersji 3 elementy sterujące są podobne do elementów sterujących w wersji 2.GLargeZoomControl3D
, z dodatkowym elementem przejściowym.
Obracanie pozwala przełączać się między obsługiwanymi kierunkami.
Na tej mapie możesz sprawdzić, w których miastach są obecnie dostępne zdjęcia o rozdzielczości 45°. Gdy obrazy pod kątem 45° są dostępne, do przycisku satelitarnego interfejsu Maps API zostanie dodana opcja menu.
Warstwy
Warstwy to obiekty na mapie, które składają się z co najmniej 1 nakładki. Można je modyfikować jako pojedynczą jednostkę i zazwyczaj odzwierciedlają one kolekcje obiektów.
Obsługiwane warstwy
Interfejs API w wersji 3 zapewnia dostęp do kilku różnych warstw. Te warstwy
pokrywają się z klasą v2 GLayer
w tych obszarach:
-
Obiekt
KmlLayer
renderuje elementy KML i GeoRSS do nakładek v3, zapewniając odpowiednik warstwy GeoXml
w wersji 2.
- Obiekt
TrafficLayer
renderuje warstwę przedstawiającą warunki ruchu drogowego, podobnie jak nakładka GTrafficOverlay
w wersji 2.
Te warstwy różnią się od warstw w wersji 2. Różnice te opisaliśmy poniżej. Można je dodać do mapy, wywołując funkcję setMap()
, przekazując jej obiekt Map
, na którym ma być wyświetlana warstwa.
Więcej informacji o obsługiwanych warstwach znajdziesz w dokumentacji warstw.
Warstwy KML i GeoRSS
Interfejs Maps JavaScript API obsługuje formaty danych KML i GeoRSS do wyświetlania informacji geograficznych. Jeśli chcesz uwzględnić je na mapie, muszą być one dostępne publicznie. W wersji 3 te formaty danych są wyświetlane za pomocą instancji KmlLayer
, która zastępuje obiekt GGeoXml
z wersji 2.
Interfejs API w wersji 3 jest bardziej elastyczny podczas renderowania pliku KML. Umożliwia to pomijanie okien informacyjnych i modyfikowanie odpowiedzi na kliknięcie. Więcej informacji znajdziesz w dokumentacji dotyczącej warstw KML i GeoRSS w wersji 3.
Podczas renderowania KmlLayer
obowiązują ograniczenia dotyczące rozmiaru i złożoności. Więcej informacji znajdziesz w dokumentacji KmlLayer.
Poniższe przykłady pokazują, jak wczytywać plik 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);
Warstwa ruchu
Wersja 3 pozwala dodawać do map informacje o natężeniu ruchu w czasie rzeczywistym (gdzie jest to obsługiwane) za pomocą obiektu TrafficLayer
. Informacje o ruchu drogowym są dostarczane w czasie wysyłania żądania. Te przykłady pokazują informacje o ruchu w 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);
W przeciwieństwie do wersji 2 w wersji 3 konstruktor TrafficLayer
nie ma opcji. Incydenty są niedostępne w wersji 3.
Usługi
Geokodowanie
Interfejs Maps JavaScript API udostępnia obiekt geocoder
do dynamicznego geokodowania adresów na podstawie danych wejściowych użytkownika. Jeśli chcesz geokodować znane adresy statyczne, zapoznaj się z dokumentacją interfejsu Geocoding API.
Interfejs Geokodowanie API został znacznie ulepszony i rozszerzony o nowe funkcje oraz zmiany w sposobie przedstawiania danych.
GClientGeocoder
w interfejsie API w wersji 2 zawiera 2 różne metody geokodowania bezpośredniego i odwrotnego, a także dodatkowe metody wpływania na sposób wykonywania geokodowania. Natomiast obiekt Geocoder
w wersji 3 udostępnia tylko metodę geocode()
, która przyjmuje literał obiektu zawierający warunki wejściowe (w postaci obiektu Geocoding Requests) oraz metodę wywołania zwrotnego. W zależności od tego, czy żądanie zawiera atrybuty tekstowe address
czy obiekt LatLng
, interfejs Geocoding API zwróci odpowiedź z bezpośrednim lub odwrotnym geokodowaniem. Możesz wpływać na sposób, w jaki odbywa się geokodowanie, przekazując dodatkowe pola do żądania geokodowania:
- Użycie tekstu
address
powoduje kodowanie geoprzestrzenne w kierunku przodu, co jest równoznaczne z wywołaniem metody getLatLng()
.
- Użycie obiektu
latLng
powoduje odwrotne geokodowanie, co jest równoważne wywołaniu metody getLocations()
.
- Użycie atrybutu
bounds
umożliwia ustawienie wartości domyślnej dla atrybutu Viewport, co jest równoważne wywołaniu metody setViewport()
.
- Podanie atrybutu
region
umożliwia uwzględnianie preferencji kodu w regionie, co jest równoważne wywołaniu metody setBaseCountryCode()
.
Geokodowanie
Odpowiedzi w wersji 3 różnią się znacznie od odpowiedzi w wersji 2. Interfejs API w wersji 3 zastępuje strukturę zagnieżdżoną używaną w wersji 2 przez strukturę bardziej płaską, którą łatwiej analizować. Ponadto odpowiedzi w wersji 3 są bardziej szczegółowe: każdy wynik zawiera kilka komponentów adresu, które pozwalają lepiej poznać rozdzielczość każdego wyniku.
Ten kod pobiera tekstowy adres i wyświetla pierwszy wynik geokodowania:
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');
}
Trasa
Interfejs Maps JavaScript API w wersji 3 zastępuje klasę GDirections
z wersji 2 klasą DirectionsService
do obliczania tras.
Metoda route()
w wersji 3 zastępuje metody load()
i loadFromWaypoints()
z interfejsu API w wersji 2. Ta metoda przyjmuje jeden literał obiektu DirectionsRequest
zawierający warunki wejściowe oraz metodę wywołania zwrotnego, która zostanie wykonana po otrzymaniu odpowiedzi. W tym literału obiektu można podać opcje, podobnie jak w przypadku literału obiektu GDirectionsOptions
w wersji 2.
W interfejsie Maps JavaScript API w wersji 3 zadanie przesyłania żądań dotyczących wskazówek zostało oddzielone od zadania renderowania żądań, które jest teraz obsługiwane przez klasę DirectionsRenderer
. Obiekt DirectionsRenderer
możesz powiązać z dowolną mapą lub obiektem DirectionsResult
za pomocą metod setMap()
i setDirections()
. Render jest obiektem typu MVCObject
, więc wykrywa wszelkie zmiany w swoich właściwościach i aktualizuje mapę, gdy powiązane wskazówki ulegną zmianie.
Poniższy kod pokazuje, jak poprosić o wyświetlenie wskazówek dotyczących dojścia pieszo do konkretnej lokalizacji, korzystając z dróg dla pieszych podanych w adresie. Pamiętaj, że tylko wersja 3.0 może podawać wskazówki dojścia pieszo do Zoo w Dublinie.
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 udostępnia interaktywne widoki sferyczne z wybranych miejsc na obszarze objętym usługą. Interfejs API w wersji 3 obsługuje Street View natywnie w przeglądarce, w przeciwieństwie do wersji 2, która wymagała wtyczki Flash® do wyświetlania zdjęć Street View.
Zdjęcia Street View są obsługiwane za pomocą obiektu StreetViewPanorama
w wersji 3 lub obiektu GStreetviewPanorama
w wersji 2. Te klasy mają różne interfejsy, ale pełnią tę samą funkcję: łączą kontener div
ze zdjęciami Street View i umożliwiają określenie lokalizacji oraz punktu widzenia panoramy 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);
}
Bezpośredni dostęp do danych Street View jest możliwy za pomocą obiektu StreetViewService
w wersji 3 lub podobnego obiektu GStreetviewClient
w wersji 2. Oba te narzędzia oferują podobne interfejsy do pobierania i sprawdzania dostępności danych Street View oraz umożliwiają wyszukiwanie według lokalizacji lub identyfikatora panoramy.
W wersji 3 Street View jest domyślnie włączona. Pojawi się mapa z elementem sterującym Pegman Street View, a interfejs API ponownie wykorzysta element mapy div do wyświetlania panoram Street View. Poniższy kod pokazuje, jak emulować zachowanie wersji 2, oddzielając panoramy Street View do osobnego elementu 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);
}