API JavaScript phiên bản 2 của Maps không còn hoạt động kể từ ngày 26 tháng 5 năm 2021. Kết quả là các bản đồ phiên bản 2 của trang web sẽ ngừng hoạt động và sẽ trả về lỗi JavaScript. Để tiếp tục sử dụng bản đồ trên trang web của bạn, hãy di chuyển sang API JavaScript cho Maps phiên bản 3. Hướng dẫn này sẽ giúp bạn trong suốt quá trình này.
Tổng quan
Mỗi ứng dụng sẽ có quy trình di chuyển hơi khác nhau; tuy nhiên, có một số bước phổ biến cho tất cả dự án:
- Nhận khoá mới. API JavaScript cho Maps hiện sử dụng Google Cloud Console để quản lý các khoá. Nếu bạn vẫn đang sử dụng khoá phiên bản 2, hãy nhớ lấy khoá API mới trước khi bắt đầu di chuyển.
- Cập nhật API Bootstrap. Hầu hết ứng dụng đều tải API JavaScript của Maps phiên bản 3 bằng mã sau:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- Cập nhật mã của bạn. Mức độ thay đổi cần thiết sẽ phụ thuộc rất nhiều vào ứng dụng của bạn. Những thay đổi phổ biến bao gồm:
- Luôn tham chiếu vùng chứa tên google.maps. Ở phiên bản 3, tất cả mã API của JavaScript cho Maps được lưu trữ trong không gian tên
google.maps.*
thay vì không gian tên chung. Hầu hết các đối tượng cũng đã được đổi tên trong quá trình này. Ví dụ: giờ đây, bạn sẽ tải google.maps.Map
thay vì GMap2
.
- Xóa mọi tệp tham chiếu đến các phương thức cũ. Một số phương thức tiện ích chung được xoá, chẳng hạn như
GDownloadURL
và GLog
.
Hãy thay thế chức năng này bằng các thư viện tiện ích của bên thứ ba
hoặc xóa các tệp tham chiếu này khỏi mã của bạn.
- (Không bắt buộc) Thêm thư viện vào mã của bạn. Nhiều tính năng đã được đưa vào các thư viện tiện ích để mỗi ứng dụng chỉ phải tải các phần của API sẽ được sử dụng.
- (Không bắt buộc) Định cấu hình dự án để sử dụng phiên bản v3.
Bạn có thể sử dụng các phần mở rộng v3 để giúp xác thực mã bằng Trình biên dịch đóng hoặc để kích hoạt tính năng tự động hoàn thành trong IDE.
Tìm hiểu thêm về tính năng Biên dịch nâng cao và mở rộng.
- Thử nghiệm và lặp lại. Tại thời điểm này, bạn vẫn còn một số việc cần làm, nhưng tin vui là bạn sẽ nhanh chóng tiếp cận ứng dụng bản đồ v3 mới!
Những thay đổi trong phiên bản 3 của API Maps JavaScript
Trước khi lên kế hoạch di chuyển, bạn nên dành thời gian để tìm hiểu sự khác biệt giữa API JavaScript của Maps phiên bản 2 và API JavaScript phiên bản 3. Phiên bản mới nhất của API JavaScript cho Maps được viết từ đầu, tập trung vào các kỹ thuật lập trình JavaScript hiện đại, tăng cường sử dụng thư viện và đơn giản hoá một API.
Nhiều tính năng mới đã được thêm vào API và một số tính năng quen thuộc đã được thay đổi hoặc thậm chí là xoá. Phần này nêu bật một số điểm khác biệt chính giữa 2 bản phát hành.
Một số thay đổi trong API phiên bản 3 bao gồm:
- Thư viện cốt lõi đơn giản. Nhiều chức năng bổ sung đã được chuyển vào thư viện, giúp giảm thời gian tải và phân tích cú pháp API cốt lõi, cho phép bản đồ của bạn tải nhanh trên mọi thiết bị.
- Cải thiện hiệu suất của một số tính năng, chẳng hạn như hiển thị đa giác và
vị trí đánh dấu.
- Một phương pháp mới để giới hạn mức sử dụng phía máy khách nhằm thích ứng tốt hơn với các địa chỉ dùng chung của proxy trên thiết bị di động và tường lửa của công ty.
- Thêm khả năng hỗ trợ cho một số trình duyệt hiện đại và trình duyệt cho thiết bị di động. Chúng tôi đã ngừng hỗ trợ Internet Explorer 6.
- Xoá nhiều lớp trình trợ giúp đa năng (
GLog
hoặc
GDownloadUrl
). Hiện nay, nhiều thư viện JavaScript xuất sắc cung cấp các chức năng tương tự, chẳng hạn như Closed hoặc
jQuery.
- Cách triển khai Chế độ xem phố HTML5 sẽ tải trên mọi thiết bị di động.
- Chế độ xem phố tùy chỉnh có ảnh của riêng bạn, cho phép bạn chia sẻ ảnh toàn cảnh về dốc trượt tuyết, nhà để bán hoặc các địa điểm thú vị khác.
- Tùy chỉnh Maps theo kiểu cho phép bạn thay đổi hiển thị của các phần tử trên bản đồ cơ sở để phù hợp với kiểu hình ảnh độc đáo của bạn.
- Hỗ trợ một số dịch vụ mới, chẳng hạn như ElevationService và Distance Matrix ma trận.
- Dịch vụ chỉ đường được cải tiến cung cấp các tuyến đường thay thế, tối ưu hóa tuyến đường (các giải pháp gần đúng với vấn đề nhân viên bán hàng đi lại), chỉ đường đi xe đạp (với
lớp xe đạp), chỉ đường phương tiện và
chỉ đường có thể kéo.
- Định dạng Mã hóa địa lý được cập nhật cung cấp thông tin
loại chính xác hơn
giá trị
accuracy
từ API Mã hóa địa lý phiên bản 2.
- Hỗ trợ nhiều Info Windows trên một Bản đồ
Khoá mới của bạn
API JavaScript phiên bản 3 của Maps sử dụng một hệ thống khóa mới từ phiên bản 2. Có thể bạn đã sử dụng khoá phiên bản 3 với ứng dụng. Trong trường hợp này, bạn không cần thay đổi. Để xác minh, hãy kiểm tra URL mà từ đó bạn tải API JavaScript của Maps để xem tham số key
của URL đó. Nếu giá trị khóa bắt đầu bằng ' ABQIAA' ;, bạn đang sử dụng khóa v2. Nếu có khóa v2, bạn phải nâng cấp lên khóa v3 trong quá trình di chuyển để có thể:
Khóa được chuyển khi tải API Maps JavaScript v3.
Tìm hiểu thêm về cách tạo khoá API.
Xin lưu ý rằng nếu bạn là khách hàng API Google Maps for Work, bạn có thể đang sử dụng mã ứng dụng khách với thông số client
thay vì thông số key
. Mã ứng dụng khách vẫn được hỗ trợ trong API JavaScript phiên bản 3 của Maps và không cần trải qua quy trình nâng cấp khoá.
Đang tải API
Sửa đổi đầu tiên bạn cần thực hiện đối với mã của mình bao gồm
cách bạn tải API. Trong phiên bản 2, bạn tải API JavaScript của Maps thông qua yêu cầu đến http://maps.google.com/maps
. Nếu đang tải Maps JavaScript API phiên bản 3, bạn cần thực hiện các thay đổi sau:
- Tải API từ
//maps.googleapis.com/maps/api/js
- Xoá thông số
file
.
- Cập nhật thông số
key
bằng khoá phiên bản 3 mới. Khách hàng dùng API Google Maps for Work nên sử dụng thông số client
.
- (Chỉ dành cho Gói cao cấp của Nền tảng Google Maps) Đảm bảo bạn cung cấp thông số
client
như được giải thích trong Hướng dẫn dành cho nhà phát triển Gói cao cấp của Nền tảng Google Maps.
- Hãy xoá thông số
v
để yêu cầu phiên bản phát hành mới nhất hoặc thay đổi giá trị của thông số này cho phù hợp với lược đồ phiên bản 3.
- (Không bắt buộc) Thay thế thông số
hl
bằng
language
và giữ nguyên giá trị của thông số đó.
- (Không bắt buộc) Thêm thông số
libraries
để
tải thư viện
không bắt buộc.
Trong trường hợp đơn giản nhất, v3 boottrap sẽ chỉ chỉ định thông số khóa API của bạn:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
Ví dụ bên dưới yêu cầu phiên bản mới nhất của API JavaScript đối với Maps phiên bản 2 bằng tiếng Đức:
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
Ví dụ bên dưới là yêu cầu tương đương cho phiên bản 3.
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
Ra mắt không gian tên google.maps
Đây có thể là thay đổi đáng chú ý nhất trong API JavaScript phiên bản 3 của Maps là việc ra mắt không gian tên google.maps
. Theo mặc định, API phiên bản 2 đặt tất cả đối tượng trong Không gian tên chung, điều này có thể dẫn đến việc đặt tên cho những xung đột. Trong phiên bản 3, tất cả đối tượng đều nằm trong không gian tên google.maps
.
Khi di chuyển ứng dụng sang phiên bản 3, bạn sẽ phải thay đổi mã để sử dụng không gian tên mới. Rất tiếc, việc tìm kiếm "G" và
thay thế bằng "google.maps." sẽ không hoàn toàn hoạt động; nhưng, đó là một quy tắc chung
để áp dụng khi xem xét mã của bạn. Dưới đây là một số ví dụ về các lớp tương đương trong phiên bản 2 và v3.
phiên bản 2 |
phiên bản 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 |
Xoá mã lỗi thời
API JavaScript phiên bản 3 của Maps có song song với hầu hết các chức năng trong phiên bản 2; tuy nhiên, có một số lớp không còn được hỗ trợ nữa. Trong quá trình di chuyển, bạn nên thay thế các lớp này bằng các thư viện tiện ích của bên thứ ba hoặc xóa các tệp tham chiếu này khỏi mã của bạn. Có nhiều thư viện JavaScript tuyệt vời cung cấp chức năng tương tự, chẳng hạn như Closed hoặc jQuery.
Các lớp sau đây không có song song trong API JavaScript JavaScript phiên bản 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 |
|
So sánh mã
Hãy so sánh hai ứng dụng khá đơn giản đã được viết bằng API v2 và 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>
Như bạn có thể thấy, có sự khác biệt giữa hai ứng dụng. Những thay đổi đáng chú ý bao gồm:
- Địa chỉ mà API được tải đã thay đổi.
- Các phương thức
GBrowserIsCompatible()
và GUnload()
không còn bắt buộc trong phiên bản 3 và đã bị xoá khỏi API.
- Đối tượng
GMap2
được thay thế bằng
google.maps.Map
làm đối tượng trung tâm trong API.
- Các thuộc tính hiện được tải thông qua lớp Tuỳ chọn. Trong ví dụ trên, chúng ta đặt 3 thuộc tính cần thiết để tải bản đồ —
center
, zoom
và mapTypeId
— thông qua đối tượng MapOptions
cùng dòng.
- Giao diện người dùng mặc định được bật theo mặc định trong phiên bản 3. Bạn có thể tắt tính năng này bằng cách đặt thuộc tính
disableDefaultUI
thành đúng (true) trong đối tượng MapOptions
.
Tóm tắt
Đến thời điểm này, bạn đã nắm được một số điểm chính liên quan trong quá trình di chuyển từ phiên bản 2 sang phiên bản 3 của API Maps JavaScript.
Bạn có thể cần biết thêm những thông tin khác, nhưng sẽ tuỳ thuộc vào
đơn đăng ký của bạn. Trong các phần sau, chúng tôi đưa ra hướng dẫn di chuyển cho
các trường hợp cụ thể mà bạn có thể gặp phải. Ngoài ra, có một số tài nguyên có thể giúp ích cho bạn trong quá trình nâng cấp.
Nếu bạn có vấn đề hoặc thắc mắc về bài viết này, vui lòng sử dụng đường liên kết GỬI PHẢN HỒI ở đầu trang này.
Tài liệu tham khảo chi tiết
Phần này cung cấp thông tin so sánh chi tiết về các tính năng phổ biến nhất của cả API JavaScript phiên bản 2 và phiên bản 3. Mỗi phần của tệp đối chiếu được thiết kế để đọc riêng lẻ. Bạn không nên đọc toàn bộ tài liệu tham khảo này. Thay vào đó, hãy sử dụng tài liệu này để hỗ trợ quá trình di chuyển của bạn theo từng trường hợp.
- Sự kiện – Đăng ký và xử lý sự kiện.
- Điều khiển – thao tác điều khiển điều khiển xuất hiện trên bản đồ.
- Lớp phủ – thêm và chỉnh sửa đối tượng trên bản đồ.
- Loại bản đồ – các ô tạo nên bản đồ cơ sở.
- Lớp – thêm và chỉnh sửa nội dung dưới dạng một
nhóm, chẳng hạn như các lớp KML hoặc Lớp lưu lượng truy cập.
- Dịch vụ – hoạt động với dịch vụ mã hóa địa lý, chỉ đường hoặc Chế độ xem phố của Google.
Sự kiện
Mô hình sự kiện cho Maps JavaScript API v3 tương tự như mô hình được sử dụng trong phiên bản 2, mặc dù nhiều thay đổi đã được thay đổi.
Sự kiện mới hỗ trợ MVC
API phiên bản 3 thêm một loại sự kiện mới để phản ánh các thay đổi về trạng thái của MVC. Hiện tại, có hai loại sự kiện:
- Các sự kiện của người dùng (chẳng hạn như sự kiện "click" chuột) được truyền từ DOM sang API JavaScript của Maps. Các sự kiện này riêng biệt và
khác với các sự kiện DOM chuẩn.
- Thông báo thay đổi trạng thái MVC phản ánh các thay đổi trong đối tượng API Maps và được đặt tên theo quy ước
property_changed
.
Mỗi đối tượng API Maps xuất một số sự kiện được đặt tên. Những ứng dụng quan tâm đến các sự kiện cụ thể sẽ đăng ký trình nghe sự kiện cho các sự kiện đó và thực thi mã khi các sự kiện đó được nhận. Cơ chế
hướng sự kiện này giống nhau trong cả API Maps JavaScript v2 và v3, ngoại trừ việc không gian tên đã thay đổi từ GEvent
thành 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.');
});
Xoá trình nghe sự kiện
Vì lý do hiệu suất, bạn nên xoá trình nghe sự kiện khi không còn cần đến nữa. Việc xoá trình nghe sự kiện cũng hoạt động theo cách tương tự trong phiên bản 2 và
v3:
- Khi bạn tạo một trình nghe sự kiện, hệ thống sẽ trả về đối tượng mờ (GEventListener ở phiên bản 2, MapsEventListener trong phiên bản 3).
- Khi bạn muốn xoá trình nghe sự kiện, hãy chuyển đối tượng này đến phương thức
removeListener()
(GEvent.removeListener()
trong phiên bản 2 hoặc google.maps.event.removeListener()
trong phiên bản 3) để xoá
trình nghe sự kiện.
Nghe sự kiện DOM
Nếu bạn muốn thu thập và phản hồi các sự kiện DOM (Mô hình đối tượng tài liệu),
v3 sẽ cung cấp phương thức tĩnh google.maps.event.addDomListener()
tương đương với phương thức GEvent.addDomListener()
trong phiên bản 2.
Sử dụng đối số đã truyền trong các sự kiện
Sự kiện giao diện người dùng thường truyền một đối số sự kiện mà trình nghe sự kiện có thể truy cập sau đó. Hầu hết các đối số sự kiện trong phiên bản 3 đã được đơn giản hóa để nhất quán hơn các đối tượng trong API. (Hãy tham khảo Tài liệu tham khảo v3 để biết chi tiết).
Không có đối số overlay
nào trong trình nghe sự kiện phiên bản 3. Nếu bạn đăng ký một sự kiện click
trên bản đồ v3, thì lệnh gọi lại sẽ chỉ xảy ra khi người dùng nhấp vào bản đồ cơ sở. Bạn có thể đăng ký thêm các lệnh gọi lại trên lớp phủ có thể nhấp nếu cần phản ứng với các lượt nhấp đó.
// 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
});
});
Các chế độ kiểm soát
API JavaScript cho Maps hiển thị các thành phần điều khiển trên giao diện người dùng, cho phép người dùng tương tác với bản đồ của bạn. Bạn có thể sử dụng API để tuỳ chỉnh cách các tùy chọn điều khiển này hiển thị.
Thay đổi về các kiểu điều khiển
Chúng tôi đã ra mắt một số thay đổi cho các loại control
bằng API phiên bản 3.
- API v3 hỗ trợ thêm các loại bản đồ bao gồm bản đồ địa hình và khả năng thêm các loại bản đồ tùy chỉnh.
- Thành phần điều khiển phân cấp v2
GHierarchicalMapTypeControl
không còn hoạt động nữa.
Bạn có thể đạt được hiệu quả tương tự bằng cách sử dụng nút điều khiển google.maps.MapTypeControlStyle.HORIZONTAL_BAR
.
- Bố cục ngang do
GMapTypeControl
cung cấp trong phiên bản 2 không có sẵn trong phiên bản 3.
Thêm các chế độ điều khiển vào bản đồ
Với API JavaScript cho Maps phiên bản 2, bạn sẽ thêm các chế độ điều khiển vào bản đồ thông qua phương thức addControl()
của đối tượng bản đồ. Trong phiên bản 3, thay vì truy cập hoặc sửa đổi trực tiếp các chế độ điều khiển, bạn sẽ sửa đổi đối tượng MapOptions
được liên kết. Mẫu
dưới đây cho biết cách tùy chỉnh bản đồ để thêm
các tùy chọn điều khiển sau:
- các nút cho phép người dùng chuyển đổi giữa các loại bản đồ có sẵn
- tỷ lệ bản đồ
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);
Điều khiển vị trí trên bản đồ
Các biện pháp kiểm soát vị trí đã thay đổi rất nhiều trong phiên bản 3. Trong phiên bản 2, phương thức addControl()
sẽ lấy một thông số thứ hai không bắt buộc cho phép bạn chỉ định vị trí của tùy chọn điều khiển tương ứng với các góc của bản đồ.
Trong phiên bản 3, bạn đặt vị trí của một tùy chọn điều khiển thông qua thuộc tính position
của các tùy chọn điều khiển. Vị trí của các tùy chọn điều khiển này là không tuyệt đối; thay vào đó, API sẽ bố trí các tùy chọn điều khiển thông minh theo "flowing" các chế độ điều khiển đó xung quanh các phần tử bản đồ hiện có trong các ràng buộc nhất định (chẳng hạn như kích thước bản đồ).
Điều này đảm bảo rằng các chế độ điều khiển mặc định tương thích với chế độ điều khiển.
Xem phần Kiểm soát vị trí trong phiên bản 3 để biết thêm thông tin.
Mã sau đây xác định lại vị trí các mẫu ở trên:
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);
Điều khiển tùy chỉnh
API JavaScript cho phép bạn tạo các điều khiển điều hướng tùy chỉnh.
Để tuỳ chỉnh các thành phần điều khiển với API phiên bản 2, bạn sẽ tạo lớp con của lớp GControl
và xác định các trình xử lý cho phương thức initialize()
và getDefaultPosition()
.
Không có lớp tương đương trong lớp GControl
ở phiên bản 3. Thay vào đó, các chế độ điều khiển sẽ được biểu thị dưới dạng các phần tử DOM. Để thêm một thành phần điều khiển tuỳ chỉnh bằng API v3, hãy tạo một cấu trúc DOM cho thành phần điều khiển đó trong một hàm khởi tạo con của Node
(ví dụ: một phần tử <div>
) và thêm trình nghe sự kiện để xử lý mọi sự kiện DOM. Đẩy Node
vào mảng map' controls[position]
để thêm một phiên bản của điều khiển tùy chỉnh vào bản đồ của bạn.
Khi triển khai lớp HomeControl
tuân thủ các yêu cầu về giao diện nêu trên (xem tài liệu về Kiểm soát tùy chỉnh để biết thông tin chi tiết), các mã mẫu sau đây sẽ hướng dẫn bạn cách thêm một thành phần điều khiển tùy chỉnh cho bản đồ.
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);
Lớp phủ
Lớp phủ phản ánh các đối tượng mà bạn "add" vào bản đồ để chỉ định các điểm, đường kẻ, khu vực hoặc bộ sưu tập các đối tượng.
Thêm và xóa lớp phủ
Các loại đối tượng mà Lớp phủ biểu thị
là giống nhau giữa phiên bản 2 và phiên bản 3, tuy nhiên, chúng được xử lý
theo cách khác nhau.
Các lớp phủ trong API phiên bản 2 đã được thêm vào và xóa khỏi bản đồ bằng cách sử dụng phương thức
addOverlay()
và removeOverlay()
của
đối tượng GMap2
. Trong phiên bản 3, bạn chỉ định một bản đồ cho Lớp phủ thông qua
thuộc tính map
của lớp tùy chọn lớp phủ được liên kết.
Bạn cũng có thể trực tiếp thêm hoặc xoá lớp phủ bằng cách gọi phương thức
setMap()
của đối tượng lớp phủ và chỉ định bản đồ
mong muốn. Việc đặt thuộc tính bản đồ thành null
sẽ xóa lớp phủ.
Không có phương thức clearOverlays()
nào trong phiên bản 3.
Nếu muốn quản lý một tập hợp lớp phủ, bạn nên tạo một mảng để lưu giữ các lớp phủ đó. Khi sử dụng mảng này, bạn có thể gọi setMap()
trên mỗi lớp phủ trong mảng (truyền null
nếu cần xoá).
Bút có thể kéo
Theo mặc định, các điểm đánh dấu có thể nhấp vào nhưng không thể kéo được. Hai mẫu sau đây thêm một điểm đánh dấu có thể kéo:
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
});
Biểu tượng
Bạn có thể xác định biểu tượng tùy chỉnh để hiển thị thay cho điểm đánh dấu mặc định.
Để sử dụng hình ảnh tuỳ chỉnh trong phiên bản 2, bạn có thể tạo một thực thể GIcon
từ G_DEFAULT_ICON type
và chỉnh sửa thực thể đó. Nếu
hình ảnh của bạn lớn hơn hoặc nhỏ hơn biểu tượng mặc định, bạn phải
chỉ định hình ảnh đó bằng một thực thể GSize
.
API v3 đơn giản hoá quá trình này.
Bạn chỉ cần đặt thuộc tính icon
của điểm đánh dấu thành URL của hình ảnh tùy chỉnh. API sẽ tự động định kích thước biểu tượng.
API JavaScript của Maps cũng cung cấp hỗ trợ cho các biểu tượng phức tạp.
Một biểu tượng phức tạp có thể bao gồm nhiều ô, hình dạng phức tạp, hoặc chỉ định "stack order" cách hình ảnh hiển thị so với các lớp phủ khác. Để thêm hình dạng vào một điểm đánh dấu trong phiên bản 2, bạn cần chỉ định thuộc tính bổ sung trong mỗi thực thể GIcon
và truyền thuộc tính này dưới dạng một tuỳ chọn đến hàm khởi tạo GMarker
. Trong phiên bản 3, các biểu tượng
được chỉ định theo cách này sẽ đặt các thuộc tính icon
của chúng thành đối tượng thuộc loại Icon
.
Bóng đánh dấu không được hỗ trợ trong phiên bản 3.
Các ví dụ sau đây hiển thị một lá cờ bãi biển tại Bãi biển Bondi ở Úc và phần trong suốt của biểu tượng không thể nhấp vào được:
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
});
Hình nhiều đường
Một đa giác bao gồm một loạt các LatLng
, cùng với một loạt các phân đoạn dòng kết nối các vị trí đó theo một trình tự sắp xếp.
Việc tạo và hiển thị đối tượng Polyline
trong phiên bản 3 cũng tương tự như sử dụng đối tượng GPolyline
trong phiên bản 2. Các mẫu sau đây
vẽ một đường đa giác địa lý rộng 3 pixel, trong suốt từ Zurich đến
Sydney qua Singapore:
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);
Hình nhiều đường đã mã hoá
Không có tính năng hỗ trợ trong phiên bản 3 để tạo các đối tượng Polyline
trực tiếp từ nhiều dòng đã mã hoá. Thay vào đó, Thư viện Hình học cung cấp các phương thức để mã hoá và giải mã nhiều dòng. Hãy xem phần Thư viện trong API Maps v3 để biết thêm thông tin về cách tải thư viện này.
Các ví dụ bên dưới vẽ cùng một đường đa giác đã mã hoá; mã v3 sử dụng phương thức
decodePath()
từ
vùng chứa tên 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);
Đa giác
Đa giác xác định một vùng trong vòng lặp đóng. Tương tự như đối tượng Polyline
, đối tượng Polygon
bao gồm một loạt điểm trong một trình tự theo thứ tự. Lớp Polygon
v3 giống như lớp GPolygon
trong v2, ngoại trừ một điều đáng chú ý là bạn không cần lặp lại đỉnh bắt đầu ở cuối đường dẫn để đóng vòng lặp. API phiên bản 3
sẽ tự động đóng mọi đa giác bằng cách vẽ một nét vẽ kết nối
toạ độ cuối cùng với toạ độ đầu tiên. Các đoạn mã sau đây
tạo ra một đa giác đại diện cho Tam giác 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);
Hình dạng có thể chỉnh sửa của người dùng
Người dùng có thể chỉnh sửa các đường đa giác và đa giác. Các đoạn mã sau đây tương đương nhau:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
Để có thêm các tính năng vẽ nâng cao, hãy xem
Thư viện bản vẽ
trong tài liệu về phiên bản 3.
Cửa sổ thông tin
InfoWindow
hiển thị nội dung trong một cửa sổ nổi phía trên bản đồ. Có một số khác biệt chính giữa cửa sổ thông tin phiên bản 2 và phiên bản 3:
- API phiên bản 2 chỉ hỗ trợ
GInfoWindow
trên mỗi bản đồ, trong khi API v3 hỗ trợ nhiều InfoWindow
đồng thời trên mỗi bản đồ.
- v3
InfoWindow
sẽ vẫn mở khi bạn nhấp vào bản đồ. GInfoWindow
phiên bản 2 sẽ tự động đóng khi bạn nhấp vào bản đồ. Bạn có thể mô phỏng hành vi của phiên bản 2 bằng cách thêm trình nghe click
trên đối tượng Map
.
- API phiên bản 3 không cung cấp tính năng hỗ trợ gốc cho
InfoWindow
được gắn thẻ.
Lớp phủ mặt đất
Để đưa hình ảnh vào bản đồ, bạn nên sử dụng đối tượng GroundOverlay
. Hàm khởi tạo cho GroundOverlay
về cơ bản giống nhau trong phiên bản 2 và v3: hàm này chỉ định URL của hình ảnh và ranh giới của hình ảnh dưới dạng tham số.
Ví dụ sau đây đặt bản đồ cổ của Newark, NJ trên bản đồ dưới dạng lớp phủ:
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);
Loại bản đồ
Các loại bản đồ v2 và v3 hơi khác nhau, nhưng tất cả
các loại bản đồ cơ bản đều có sẵn trong cả hai phiên bản API. Theo mặc định, v2
sử dụng tiêu chuẩn "painted" ô bản đồ đường phố. Tuy nhiên, v3 yêu cầu phải cung cấp một loại bản đồ cụ thể khi tạo đối tượng google.maps.Map
.
Các loại bản đồ phổ biến
Bốn loại bản đồ cơ bản có sẵn trong cả v2 và v3:
MapTypeId.ROADMAP
(thay thế G_NORMAL_MAP
)
hiển thị chế độ xem bản đồ đường đi.
MapTypeId.SATELLITE
(thay thế G_SATELLITE_MAP
)
hiển thị hình ảnh vệ tinh của Google Earth.
MapTypeId.HYBRID
(thay thế G_HYBRID_MAP
)
hiển thị kết hợp các chế độ xem thông thường và vệ tinh.
MapTypeId.TERRAIN
(thay thế G_PHYSICAL_MAP
)
hiển thị một bản đồ thực tế dựa trên thông tin địa hình.
Dưới đây là ví dụ về phiên bản v2 và v3 đặt bản đồ thành chế độ xem địa hình:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
API JavaScript phiên bản 3 của Maps cũng thực hiện một số thay đổi đối với các loại bản đồ ít phổ biến hơn:
- Các ô bản đồ cho các thiên thể khác với Earth không xuất hiện dưới dạng các loại bản đồ trong API phiên bản 3, nhưng bạn có thể truy cập vào ô này dưới dạng các loại bản đồ tuỳ chỉnh như trong ví dụ này.
- Không có loại bản đồ đặc biệt nào trong phiên bản 3 thay thế loại
G_SATELLITE_3D_MAP
từ phiên bản 2. Thay vào đó, bạn có thể tích hợp trình bổ trợ Google Earth trong bản đồ v3 bằng cách sử dụng thư viện này.
Hình ảnh thu phóng tối đa
Hình ảnh vệ tinh không phải lúc nào cũng có sẵn ở mức thu phóng cao. Nếu bạn muốn biết mức thu phóng cao nhất hiện có trước khi đặt mức thu phóng, hãy sử dụng lớp google.maps.MaxZoomService
. Lớp này sẽ thay thế phương thức GMapType.getMaxZoomAtLatLng()
từ phiên bản 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.");
}
});
Hình ảnh phối cảnh trên không
Khi bật Hình ảnh trên không trong phiên bản 3, các nút điều khiển tương tự như nút điều khiển GLargeZoomControl3D
phiên bản 2, nhưng có thêm một nút điều khiển quảng cáo xen kẽ để xoay vòng qua các hướng được hỗ trợ.
Bạn có thể theo dõi các thành phố hiện có hình ảnh 45° trên
bản đồ này. Khi có hình ảnh 45°, bạn sẽ thấy một tuỳ chọn trình đơn phụ được thêm vào nút Vệ tinh của API Maps.
Lớp
Lớp là các đối tượng trên bản đồ bao gồm một hoặc nhiều lớp phủ. Bạn có thể điều khiển các thao tác này như một đơn vị duy nhất và thường phản ánh tập hợp các đối tượng.
Các lớp được hỗ trợ
API v3 cung cấp quyền truy cập vào nhiều lớp khác nhau. Các lớp này chồng chéo với lớp GLayer
v2 trong các khu vực sau:
-
Đối tượng
KmlLayer
hiển thị các phần tử KML và GeoRSS thành các lớp phủ v3, cung cấp lớp phủ v2
tương đương cho lớp GeoXml
.
- Đối tượng
TrafficLayer
hiển thị một lớp mô tả các điều kiện giao thông, tương tự như lớp phủ v2 GTrafficOverlay
.
Các lớp này khác với các phiên bản 2. Những điểm khác biệt đó được mô tả
dưới đây. Bạn có thể thêm lớp này vào bản đồ bằng cách gọi setMap()
, truyền vào đó đối tượng Map
để hiển thị lớp đó.
Bạn có thể tìm thêm thông tin về các lớp được hỗ trợ trong tài liệu về Lớp.
Lớp KML và GeoRSS
API JavaScript cho Maps hỗ trợ các định dạng dữ liệu KML và GeoRSS để hiển thị thông tin theo vị trí địa lý. Các tệp KML hoặc GeoRSS phải có thể truy cập được công khai nếu bạn muốn đưa các tệp đó vào bản đồ. Ở phiên bản 3, các định dạng dữ liệu này được hiển thị bằng cách sử dụng một thực thể của KmlLayer
, thay thế đối tượng GGeoXml
từ phiên bản 2.
API phiên bản 3 linh hoạt hơn khi hiển thị KML, cho phép bạn ngăn chặn InfoWindows và sửa đổi phản hồi nhấp chuột. Xem tài liệu Lớp KML và GeoRSS của phiên bản 3 để biết thêm chi tiết.
Khi kết xuất KmlLayer
, các quy định hạn chế về kích thước và độ phức tạp sẽ được áp dụng; hãy xem tài liệu về KmlLayer để biết thông tin chi tiết.
Các mẫu sau đây so sánh cách tải tệp 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);
Lớp lưu lượng truy cập
v3 cho phép bạn thêm thông tin giao thông theo thời gian thực (nếu được hỗ trợ) vào bản đồ của bạn bằng cách sử dụng đối tượng TrafficLayer
. Thông tin giao thông được cung cấp tại thời điểm yêu cầu. Những ví dụ sau đây thể hiện thông tin giao thông cho 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);
Không giống như phiên bản 2, không có tuỳ chọn nào cho hàm khởi tạo TrafficLayer
trong phiên bản 3. Sự cố không có trong phiên bản 3.
Dịch vụ
Mã hóa địa lý
API JavaScript của Maps cung cấp một đối tượng geocoder
để tự động địa chỉ mã hóa từ hoạt động đầu vào của người dùng. Nếu bạn muốn mã hoá địa chỉ tĩnh, địa chỉ đã biết, hãy xem tài liệu về API mã hoá địa lý.
API Mã hoá địa lý đã được nâng cấp và nâng cao đáng kể, bổ sung các tính năng mới và thay đổi cách trình bày dữ liệu.
GClientGeocoder
trong API phiên bản 2 đã cung cấp 2 phương thức khác nhau để mã hoá địa lý chuyển tiếp và đảo ngược, cũng như các phương thức bổ sung để tác động đến hiệu suất của phương thức mã hoá địa lý. Ngược lại, đối tượng Geocoder
phiên bản 3 chỉ cung cấp phương thức geocode()
. Phương thức này lấy giá trị cố định chứa đối tượng chứa các thuật ngữ đầu vào (ở dạng đối tượng Yêu cầu mã hóa địa lý) và phương thức gọi lại. Tuỳ thuộc vào việc yêu cầu chứa thuộc tính address
dạng văn bản hay đối tượng LatLng
, API mã hoá địa lý sẽ trả về phản hồi mã hóa địa lý chuyển tiếp hoặc ngược lại. Bạn có thể tác động đến hiệu quả của hoạt động mã hoá địa lý bằng cách chuyển các trường bổ sung vào yêu cầu mã hoá địa lý:
- Việc thêm một đoạn văn bản
address
sẽ kích hoạt mã hoá địa lý chuyển tiếp,
tương đương với việc gọi phương thức getLatLng()
.
- Việc bao gồm đối tượng
latLng
sẽ kích hoạt quy trình mã hoá địa lý ngược,
tương đương với việc gọi phương thức getLocations()
.
- Việc bao gồm thuộc tính
bounds
sẽ cho phép Xu hướng khung nhìn, tương đương với việc gọi phương thức setViewport()
.
- Việc bao gồm thuộc tính
region
sẽ bật tính năng Xu hướng mã khu vực, tương đương với việc gọi phương thức setBaseCountryCode()
.
Phản hồi mã hoá địa lý trong phiên bản 3 rất khác với phản hồi v2. API v3 thay thế cấu trúc lồng nhau mà v2 sử dụng bằng một cấu trúc phẳng hơn, dễ phân tích cú pháp hơn. Ngoài ra, phản hồi v3 cũng chi tiết hơn: mỗi kết quả có một số thành phần địa chỉ để giúp bạn hiểu rõ hơn về độ phân giải của từng kết quả.
Mã sau đây lấy một địa chỉ dạng văn bản và cho thấy kết quả đầu tiên từ việc mã hoá địa lý:
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');
}
Chỉ đường
API JavaScript phiên bản 3 của Maps thay thế lớp GDirections
từ phiên bản 2 bằng lớp DirectionsService
để tính toán đường đi.
Phương thức route()
trong phiên bản 3 thay thế cả phương thức load()
và loadFromWaypoints()
từ API v2. Phương thức này lấy một đối tượng DirectionsRequest
duy nhất chứa các thuật ngữ đầu vào và một phương thức gọi lại để thực thi khi nhận được phản hồi. Các tuỳ chọn có thể được cung cấp bằng giá trị cố định của đối tượng này, tương tự như giá trị cố định của đối tượng GDirectionsOptions
trong phiên bản 2.
Trong API JavaScript phiên bản 3 của Maps, nhiệm vụ gửi yêu cầu chỉ đường đã được tách biệt với nhiệm vụ hiển thị yêu cầu. Việc này hiện được xử lý bằng lớp DirectionsRenderer
. Bạn có thể liên kết một đối tượng DirectionsRenderer
với mọi bản đồ hoặc đối tượng DirectionsResult
thông qua các phương thức setMap()
và setDirections()
của đối tượng đó. Vì trình kết xuất là một MVCObject
, nên trình kết xuất sẽ phát hiện mọi thay đổi đối với các thuộc tính và cập nhật bản đồ khi đường đi liên kết thay đổi.
Đoạn mã sau đây minh họa cách yêu cầu đường đi bộ đến một vị trí cụ thể bằng đường đi bộ từ một địa chỉ. Xin lưu ý rằng chỉ có phiên bản 3 mới có thể cung cấp đường đi bộ cho người đi bộ tại Sở thú 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);
}
});
}
Chế độ xem phố
Chế độ xem phố của Google cung cấp chế độ xem tương tác, 360° từ các địa điểm được chỉ định trong phạm vi bao phủ. API v3 vốn hỗ trợ Chế độ xem phố trong trình duyệt, không giống như v2 yêu cầu trình bổ trợ Flash® hiển thị hình ảnh trong Chế độ xem phố.
Hình ảnh trong Chế độ xem phố được hỗ trợ thông qua việc sử dụng đối tượng StreetViewPanorama
trong phiên bản 3 hoặc đối tượng GStreetviewPanorama
trong phiên bản 2. Các lớp này có các giao diện khác nhau, nhưng có cùng một vai trò: kết nối vùng chứa div
với hình ảnh Chế độ xem phố và cho phép bạn chỉ định vị trí và POV (góc nhìn) của ảnh toàn cảnh trong Chế độ xem phố.
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);
}
Bạn có thể truy cập trực tiếp vào dữ liệu Chế độ xem phố thông qua đối tượng StreetViewService
trong phiên bản 3 hoặc đối tượng GStreetviewClient
tương tự trong phiên bản 2. Cả hai đều cung cấp giao diện tương tự để truy xuất hoặc kiểm tra khả năng sử dụng dữ liệu của Chế độ xem phố, đồng thời cho phép tìm kiếm theo mã vị trí hoặc ảnh toàn cảnh.
Trong phiên bản 3, Chế độ xem phố được bật theo mặc định. Bản đồ này sẽ xuất hiện với
nút điều khiển Người hình mắc áo ở chế độ xem phố và API sẽ sử dụng lại div bản đồ để hiển thị
ảnh toàn cảnh Chế độ xem phố. Đoạn mã sau minh hoạ cách mô phỏng hành vi v2 bằng cách tách ảnh toàn cảnh ở Chế độ xem phố thành một div riêng.
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);
}