Kể từ ngày 26 tháng 5 năm 2021, Maps JavaScript API phiên bản 2 sẽ không còn hoạt động nữa. Do đó, bản đồ v2 của trang web sẽ ngừng hoạt động và trả về lỗi JavaScript. Để tiếp tục sử dụng bản đồ trên trang web, hãy di chuyển sang Maps JavaScript API phiên bản 3. Hướng dẫn này sẽ giúp bạn thực hiện quy 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 chung cho tất cả dự án:
- Mua khoá mới. API JavaScript của Maps hiện sử dụng Google Cloud Console để quản lý 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 Bootstrap API. Hầu hết ứng dụng sẽ tải Maps JavaScript API 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 nhiều vào ứng dụng của bạn. Sau đây là một số thay đổi phổ biến:
- Luôn tham chiếu không gian tên google.maps. Trong phiên bản 3, tất cả mã API Maps JavaScript được lưu trữ trong không gian tên
google.maps.*
thay vì không gian tên toàn cục. Hầu hết các đối tượng cũng đã được đổi tên trong quá trình này. Ví dụ: thay vì GMap2
, giờ đây bạn sẽ tải google.maps.Map
.
- Xoá mọi nội dung tham chiếu đến các phương thức lỗi thời. Một số phương thức tiện ích dùng cho nhiều mục đích đã bị xoá, chẳng hạn như
GDownloadURL
và GLog
.
Hãy thay thế chức năng này bằng thư viện tiện ích của bên thứ ba hoặc xoá 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ã. Nhiều tính năng đã được chuyển sang 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 các thành phần bên ngoài v3.
Bạn có thể sử dụng các thành phần bên ngoài v3 để xác thực mã bằng Trình biên dịch Closure 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à Extern.
- Kiểm thử 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ẽ sớm hoàn thành ứng dụng bản đồ v3 mới!
Các 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 Maps JavaScript API phiên bản 2 và Maps JavaScript API phiên bản 3. Phiên bản mới nhất của API JavaScript của Maps được viết lại 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à API đơn giản.
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í bị xoá. Phần này nêu bật một số điểm khác biệt chính giữa hai bản phát hành.
Một số thay đổi trong API phiên bản 3 bao gồm:
- Thư viện lõi được tinh giản. Nhiều hàm 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 cho API Core, 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ư kết xuất đa giác và đặt điểm đá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 hỗ trợ tốt hơn các địa chỉ dùng chung mà proxy di động và tường lửa của công ty sử dụng.
- Thêm tính năng hỗ trợ cho một số trình duyệt hiện đại và trình duyệt di động. Tính năng hỗ trợ Internet Explorer 6 đã bị xoá.
- Xoá nhiều lớp trợ giúp dùng cho nhiều mục đích (
GLog
hoặc
GDownloadUrl
). Ngày nay, 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ư Closure hoặc jQuery.
- Cách triển khai Chế độ xem đường phố bằng HTML5 sẽ tải trên mọi thiết bị di động.
- Ảnh toàn cảnh Chế độ xem đường phố tuỳ chỉnh bằng ảnh của riêng bạn, cho phép bạn chia sẻ ảnh toàn cảnh về đường trượt tuyết, nhà cần bán hoặc các địa điểm thú vị khác.
- Các tuỳ chỉnh Bản đồ có kiểu cho phép bạn thay đổi cách hiển thị các phần tử trên bản đồ cơ sở cho phù hợp với phong cách hình ảnh riêng của mình.
- Hỗ trợ một số dịch vụ mới, chẳng hạn như ElevationService và Distance Matrix.
- Dịch vụ chỉ đường cải tiến cung cấp các tuyến đường thay thế, tính năng tối ưu hoá tuyến đường (giải pháp gần đúng cho
vấn đề của người bán hàng đi lại), chỉ đường đi xe đạp (có
lớp đi xe đạp), chỉ đường bằng phương tiện công cộng và
chỉ đường có thể kéo.
- Định dạng Địa chỉ được mã hoá đã cập nhật cung cấp thông tin loại chính xác hơn so với giá trị
accuracy
từ API Địa chỉ được mã hoá phiên bản 2.
- Hỗ trợ nhiều Cửa sổ thông tin trên một Bản đồ
Khoá mới của bạn
Maps JavaScript API phiên bản 3 sử dụng hệ thống khoá mới từ phiên bản 2. Có thể bạn đã sử dụng khoá v3 với ứng dụng của mình. Trong trường hợp đó, bạn không cần thay đổi gì. Để xác minh, hãy kiểm tra URL mà bạn tải API JavaScript của Maps để biết tham số key
. Nếu giá trị khoá bắt đầu bằng "ABQIAA", thì bạn đang sử dụng khoá v2. Nếu có khoá phiên bản 2, bạn phải nâng cấp lên khoá phiên bản 3 trong quá trình di chuyển. Khoá phiên bản 3 sẽ:
Khoá này được truyền khi tải API JavaScript của Maps phiên bản 3.
Tìm hiểu thêm về cách tạo khoá API.
Xin lưu ý rằng nếu là khách hàng của API Google Maps cho doanh nghiệp, bạn có thể đang sử dụng mã ứng dụng với thông số client
thay vì thông số key
. Mã ứng dụng vẫn được hỗ trợ trong Maps JavaScript API phiên bản 3 và không cần phải trải qua quy trình nâng cấp khoá.
Tải API
Nội dung sửa đổi đầu tiên mà bạn cần thực hiện đối với mã liên quan đến cách tải API. Trong phiên bản 2, bạn tải API Maps JavaScript thông qua một 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á tham số
file
.
- Cập nhật thông số
key
bằng khoá v3 mới. Khách hàng sử dụng API Google Maps cho doanh nghiệp nên sử dụng thông số client
.
- (Chỉ dành cho gói Google Maps Platform Premium) Đảm bảo rằng bạn cung cấp tham số
client
như đã giải thích trong
Hướng dẫn dành cho nhà phát triển về gói Google Maps Platform Premium.
- Xoá tham 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 tham số đó cho phù hợp với lược đồ phiên bản v3.
- (Không bắt buộc) Thay thế tham số
hl
bằng language
và giữ nguyên giá trị của tham số đó.
- (Không bắt buộc) Thêm tham số
libraries
để tải các thư viện không bắt buộc.
Trong trường hợp đơn giản nhất, trình khởi động v3 sẽ chỉ chỉ định tham số khoá API:
<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 Maps JavaScript API v2 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à một 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>
Giới thiệu không gian tên google.maps
Có lẽ thay đổi đáng chú ý nhất trong Maps JavaScript API phiên bản 3 là việc giới thiệu không gian tên google.maps
. Theo mặc định, API v2 đặt tất cả các đối tượng trong Không gian tên toàn cầu, điều này có thể dẫn đến xung đột tên. 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 hiệu quả; nhưng đây là một nguyên tắc hay để á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à 3.
phiên bản 2 |
v3 |
GMap2 |
google.maps.Map |
GLatLng |
google.maps.LatLng |
GInfoWindow |
google.maps.InfoWindow |
GMapOptions |
google.map.MapOptions |
G_API_VERSION |
google.maps.version |
GPolyStyleOptions |
google.maps.PolygonOptions or
google.maps.PolylineOptions |
Xoá mã lỗi thời
Maps JavaScript API phiên bản 3 có các tính năng tương tự như hầu hết các tính năng trong phiên bản 2; tuy nhiên, có một số lớp không còn được hỗ trợ. Trong quá trình di chuyển, bạn nên thay thế các lớp này bằng thư viện tiện ích của bên thứ ba hoặc xoá các tệp tham chiếu này khỏi mã. 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ư Closure hoặc jQuery.
Các lớp sau đây không có lớp tương đương trong API JavaScript của Maps 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ó một số điểm khác biệt giữa hai ứng dụng này. Sau đây là những thay đổi đáng chú ý:
- Địa chỉ tải API đã 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 các lớp Tuỳ chọn. Trong ví dụ trên, chúng ta đặt ba thuộc tính cần thiết để tải bản đồ –
center
, zoom
và mapTypeId
– thông qua đối tượng MapOptions
nội tuyến.
- 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 true trong đối tượng MapOptions
.
Tóm tắt
Đến đây, bạn đã nắm được một số điểm chính liên quan đến việc di chuyển từ phiên bản 2 sang phiên bản 3 của API Maps JavaScript.
Có thể bạn cần biết thêm thông tin, nhưng điều này sẽ tuỳ thuộc vào ứng dụng 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, bạn có thể tham khảo một số tài nguyên có thể hữu ích trong quá trình nâng cấp.
Nếu bạn gặp vấn đề hoặc có câu hỏi 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.
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 cho cả phiên bản 2 và 3 của API Maps JavaScript. Mỗi phần của tài liệu tham khảo đượ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 theo từng trường hợp.
- Sự kiện – đăng ký và xử lý sự kiện.
- Chế độ điều khiển – thao tác với các chế độ điều khiển di chuyể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ư 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ụ đường phố, chỉ đường hoặc dịch vụ lập bản đồ địa lý của Google.
Sự kiện
Mô hình sự kiện cho Maps JavaScript API phiên bản 3 tương tự như mô hình được sử dụng trong phiên bản 2, mặc dù có nhiều thay đổi về cơ bản.
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 MVC. Hiện 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 chuột "nhấp") được truyền từ DOM đến API JavaScript của Maps. Các sự kiện này tách biệt và khác với các sự kiện DOM tiêu chuẩn.
- Thông báo thay đổi trạng thái MVC phản ánh các thay đổi trong các đối tượng API Maps và được đặt tên theo quy ước
property_changed
.
Mỗi đối tượng Maps API sẽ xuất một số sự kiện được đặt tên. Các ứng dụng quan tâm đến các sự kiện cụ thể nên đăng ký trình nghe sự kiện cho các sự kiện đó và thực thi mã khi nhận được các sự kiện đó. Cơ chế do sự kiện điều khiển này giống nhau trong cả API JavaScript của Maps phiên bản 2 và 3, 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, tốt nhất bạn nên xoá trình nghe sự kiện khi không còn cần thiết 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à phiên bản 3:
- Khi bạn tạo một trình nghe sự kiện, một đối tượng mờ (GEventListener trong phiên bản 2, MapsEventListener trong phiên bản 3) sẽ được trả về.
- Khi bạn muốn xoá trình nghe sự kiện, hãy truyề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.
Theo dõi sự kiện DOM
Nếu bạn muốn ghi lại 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 v2.
Sử dụng đối số đã truyền trong sự kiện
Các sự kiện trên giao diện người dùng thường truyền một đối số sự kiện mà sau đó trình nghe sự kiện có thể truy cập. Hầu hết các đối số sự kiện trong phiên bản 3 đã được đơn giản hoá để nhất quán hơn với các đối tượng trong API. (Hãy tham khảo Tài liệu tham khảo v3 để biết thông tin chi tiết.)
Không có đối số overlay
nào tồn tại 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, 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 của Maps hiển thị các chế độ điều khiể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 chế độ điều khiển này xuất hiện.
Thay đổi về loại chế độ điều khiển
Một số thay đổi đối với các loại control
đã được giới thiệu
với API v3.
- API phiên bản 3 hỗ trợ thêm các loại bản đồ, bao gồm cả bản đồ địa hình và khả năng thêm các loại bản đồ tuỳ chỉnh.
- Bạn không thể sử dụng chế độ điều khiển phân cấp v2,
GHierarchicalMapTypeControl
nữa.
Bạn có thể đạt được hiệu quả tương tự bằng cách sử dụng thành phần đ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ó trong phiên bản 3.
Thêm các nút điều khiển vào bản đồ
Với Maps JavaScript API 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 thành phần điều khiển, bạn sẽ sửa đổi đối tượng MapOptions
được liên kết. Ví dụ dưới đây cho thấy cách tuỳ chỉnh bản đồ để thêm các chế độ đ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 chế độ điều khiển 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 tham số thứ hai không bắt buộc cho phép bạn chỉ định vị trí của thành phần điều khiển so 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 thành phần điều khiển thông qua thuộc tính position
của các tuỳ chọn điều khiển. Vị trí của các chế độ điều khiển này không phải là tuyệt đối; thay vào đó, API sẽ bố trí các chế độ điều khiển một cách thông minh bằng cách "lưu chuyển" các chế độ điều khiển đó xung quanh các phần tử bản đồ hiện có trong các quy tắc ràng buộc nhất định (chẳng hạn như kích thước bản đồ).
Điều này giúp đảm bảo rằng các chế độ điều khiển mặc định tương thích với các chế độ điều khiển của bạn.
Hãy 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 sẽ định vị lại các thành phần điều khiển từ 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);
Chế độ điều khiển tuỳ chỉnh
API JavaScript của Maps cho phép bạn tạo các chế độ điều khiển điều hướng tuỳ chỉnh.
Để tuỳ chỉnh các chế độ điều khiển bằng API v2, bạn sẽ tạo lớp con cho lớp GControl
và xác định trình xử lý cho các phương thức initialize()
và getDefaultPosition()
.
Không có lớp nào tương đương với lớp GControl
trong phiên bản 3. Thay vào đó, các thành phần điều khiển được biểu thị dưới dạng 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 hàm khởi tạo dưới dạng phần tử con của Node
(ví dụ: 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 controls[position]
của bản đồ để thêm một thực thể của thành phần điều khiển tuỳ chỉnh vào bản đồ.
Với việc 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ề Chế độ điều khiển tuỳ chỉnh để biết thông tin chi tiết), các mã mẫu sau đây cho biết cách thêm một chế độ điều khiển tuỳ chỉnh vào 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 "thêm" vào bản đồ để chỉ định các điểm, đường kẻ, khu vực hoặc tập hợp các đối tượng.
Thêm và xoá lớp phủ
Các loại đối tượng được biểu thị bằng một Lớp phủ giống nhau giữa phiên bản 2 và 3, tuy nhiên, các loại đối tượng này được xử lý theo cách khác nhau.
Các lớp phủ trong API v2 đã được thêm vào và xoá khỏi bản đồ bằng các 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 một Lớp phủ thông qua thuộc tính map
của lớp tuỳ 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ẽ xoá 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 để chứa các lớp phủ đó. Khi sử dụng mảng này, bạn có thể gọi setMap()
trên từng lớp phủ trong mảng (chuyển null
nếu cần xoá các lớp phủ đó).
Điểm đánh dấu có thể kéo
Theo mặc định, bạn có thể nhấp vào điểm đánh dấu nhưng không thể kéo điểm đánh dấu. 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 một biểu tượng tuỳ 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à sửa đổi thực thể đó. Nếu hình ảnh 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 phiên bản 3 đơn giản hoá một chút quy 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 tuỳ chỉnh, API sẽ tự động định cỡ biểu tượng.
Maps JavaScript API cũng hỗ trợ 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 thẻ thông tin, hình dạng phức tạp hoặc chỉ định "thứ tự xếp chồng" của cách hình ảnh hiển thị tương ứng với các lớp phủ khác. Để thêm hình dạng vào đ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 phải đặt thuộc tính icon
thành một đối tượng thuộc loại Icon
.
Bóng của điểm đánh dấu không được hỗ trợ trong phiên bản 3.
Các ví dụ sau đây cho thấy một cờ bãi biển tại Bãi biển Bondi ở Úc, trong đó phần trong suốt của biểu tượng không thể nhấp vào:
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 tuyến bao gồm một mảng LatLng
, cùng với một loạt các đoạn thẳng kết nối các vị trí đó theo trình tự có thứ tự.
Việc tạo và hiển thị đối tượng Polyline
trong phiên bản 3 tương tự như việc 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 hình học bán trong suốt, rộng 3 pixel 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á
Phiên bản 3 không hỗ trợ việc tạo đối tượng Polyline
trực tiếp từ các đường đa giác được 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ã đa tuyến. Hãy xem phần Thư viện trong API Maps phiên bản 3 để 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 tuyến được mã hoá; mã v3 sử dụng phương thức decodePath()
từ không gian 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 một vòng lặp kín. Tương tự như đối tượng Polyline
, các đối tượng Polygon
bao gồm một loạt các điểm theo trình tự đã sắp xếp. Lớp Polygon
v3 rất giống với lớp GPolygon
v2, ngoại trừ một điểm đáng chú ý là bạn không còn phải lặp lại đỉnh bắt đầu ở cuối đường dẫn để đóng vòng lặp. API v3 sẽ tự động đóng mọi đa giác bằng cách vẽ một nét nối toạ độ cuối cùng với toạ độ đầu tiên. Các đoạn mã sau đây tạo 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 đa tuyến và đa giác. Các đoạn mã sau đây tương đương với nhau:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
Để biết thêm các tính năng vẽ nâng cao, hãy xem Thư viện vẽ trong tài liệu v3.
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ố điểm 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 phiên bản 3 hỗ trợ nhiều InfoWindow
đồng thời trên mỗi bản đồ.
InfoWindow
phiên bản 3 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 v2 bằng cách thêm trình nghe click
trên đối tượng Map
.
- API v3 không hỗ trợ gốc cho
InfoWindow
có thẻ.
Lớp phủ mặt đất
Để đặt hình ảnh trên bản đồ, bạn nên sử dụng đối tượng GroundOverlay
. Về cơ bản, hàm khởi tạo cho GroundOverlay
giống nhau trong phiên bản 2 và 3: 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 một bản đồ cổ của Newark, New Jersey 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 đồ có trong phiên bản 2 và 3 có đôi chút khác biệt, nhưng tất cả các loại bản đồ cơ bản đều có trong cả hai phiên bản API. Theo mặc định, phiên bản 2 sử dụng các ô bản đồ đường "vẽ" tiêu chuẩn. Tuy nhiên, phiên bản 3 yêu cầu bạn 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
Cả phiên bản 2 và 3 đều có 4 loại bản đồ cơ bản:
MapTypeId.ROADMAP
(thay thế G_NORMAL_MAP
) hiển thị chế độ xem bản đồ đường.
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ị chế độ xem kết hợp chế độ xem thông thường và chế độ xem vệ tinh.
MapTypeId.TERRAIN
(thay thế G_PHYSICAL_MAP
) hiển thị bản đồ thực tế dựa trên thông tin địa hình.
Dưới đây là ví dụ về v2 và v3 thiết lập bản đồ thành chế độ xem địa hình:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API phiên bản 3 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:
- Thẻ thông tin bản đồ cho các thiên thể khác với Trái Đất không có sẵn dưới dạng loại bản đồ trong API phiên bản 3, nhưng có thể được truy cập dưới dạng 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 vào bản đồ phiên bản 3 bằng cách sử dụng thư viện này.
Hình ảnh thu phóng tối đa
Không phải lúc nào bạn cũng có thể xem hình ảnh vệ tinh ở mức thu phóng cao. Nếu bạn muốn biết mức thu phóng cao nhất có sẵn trước khi đặt mức thu phóng, hãy sử dụng lớp google.maps.MaxZoomService
. Lớp này 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 từ trên không
Khi bật tính năng Hình ảnh trên không trong phiên bản 3, các chế độ điều khiển sẽ tương tự như chế độ điều khiển GLargeZoomControl3D
trong phiên bản 2, với một chế độ điều khiển Xoay xen kẽ bổ sung để xoay theo 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°, một tuỳ chọn trình đơn phụ sẽ được thêm vào nút Vệ tinh của Maps API.
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ể thao tác các đối tượng này dưới dạng một đơn vị và thường phản ánh các tập hợp đối tượng.
Các lớp được hỗ trợ
API v3 cung cấp quyền truy cập vào một số lớp khác nhau. Các lớp này chồng chéo với lớp GLayer
v2 ở các khía cạnh sau:
-
Đối tượng
KmlLayer
hiển thị các phần tử KML và GeoRSS thành lớp phủ v3, cung cấp lớp tương đương cho lớp GeoXml
v2.
- Đối tượng
TrafficLayer
hiển thị một lớp mô tả điều kiện giao thông, tương tự như lớp phủ GTrafficOverlay
phiên bản 2.
Các lớp này khác với v2. Các điểm khác biệt được mô tả bên dưới. Bạn có thể thêm các lớp này vào bản đồ bằng cách gọi setMap()
, truyền đối tượng Map
vào để hiển thị lớp.
Bạn có thể xem 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 Maps JavaScript hỗ trợ các định dạng dữ liệu KML và GeoRSS để hiển thị thông tin địa lý. Bạn phải có quyền truy cập công khai vào tệp KML hoặc GeoRSS nếu muốn đưa các tệp đó vào bản đồ. Trong phiên bản 3, các định dạng dữ liệu này được hiển thị bằ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 kết xuất KML, cho phép bạn
chặn InfoWindows và sửa đổi phản hồi lượt nhấp. Xem tài liệu về Lớp KML và GeoRSS phiên bản 3 để biết thêm thông tin chi tiết.
Khi kết xuất KmlLayer
, các hạn chế về kích thước và độ phức tạp sẽ á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
Phiên bản 3 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 đồ bằng cách sử dụng đối tượng TrafficLayer
. Thông tin về lưu lượng truy cập được cung cấp tại thời điểm yêu cầu được thực hiện. Các ví dụ sau đây cho thấy thông tin về tình hình giao thông ở 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. Phiên bản 3 không hỗ trợ sự cố.
Dịch vụ
Mã hoá địa lý
API Maps JavaScript cung cấp một đối tượng geocoder
để mã hoá địa lý các địa chỉ một cách linh động từ dữ liệu đầu vào của người dùng. Nếu bạn muốn mã hoá địa lý các địa chỉ tĩnh, đã biết, hãy xem tài liệu về API Mã hoá địa lý.
API Địa chỉ mã hoá địa lý đã được nâng cấp và cải tiến đá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 hai phương thức khác nhau để mã hoá địa lý thuận và nghịch cũng như các phương thức bổ sung để ảnh hưởng đến cách thực hiện mã hoá địa lý. Ngược lại, đối tượng Geocoder
phiên bản 3 chỉ cung cấp một phương thức geocode()
. Phương thức này sẽ nhận một đối tượng cố định chứa các cụm từ đầu vào (ở dạng đối tượng Yêu cầu mã hoá địa lý) và một phương thức gọi lại. Tuỳ thuộc vào việc yêu cầu có chứa thuộc tính address
dạng văn bản hay đối tượng LatLng
, API Địa chỉ (Geocoding API) sẽ trả về phản hồi mã hoá địa lý thuận hoặc nghịch. Bạn có thể ảnh hưởng đến cách thực hiện việc mã hoá địa lý bằng cách truyền các trường bổ sung vào yêu cầu mã hoá địa lý:
- Việc đưa
address
dạng văn bản vào sẽ kích hoạt tính năng mã hoá địa lý chuyển tiếp, tương đương với việc gọi phương thức getLatLng()
.
- Việc đưa đối tượng
latLng
vào sẽ kích hoạt tính năng mã hoá địa lý đảo ngược, tương đương với việc gọi phương thức getLocations()
.
- Việc đưa thuộc tính
bounds
vào sẽ bật tính năng Căn chỉnh khung nhìn, tương đương với việc gọi phương thức setViewport()
.
- Việc đưa thuộc tính
region
vào sẽ bật tính năng Căn chỉnh mã theo khu vực, tương đương với việc gọi phương thức setBaseCountryCode()
.
Phản hồi về việc mã hoá địa lý trong phiên bản 3 rất khác với phản hồi trong phiên bản 2. 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, các phản hồi v3 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à hiển thị kết quả đầu tiên từ việc mã hoá địa lý địa chỉ đó:
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');
}
Cách tìm
Maps JavaScript API phiên bản 3 thay thế lớp GDirections
của 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()
trong API phiên bản 2. Phương thức này nhận một đối tượng DirectionsRequest
cố định chứa các cụm từ đầ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. Bạn có thể cung cấp các tuỳ chọn trong đối tượng cố định này, tương tự như đối tượng cố định GDirectionsOptions
trong phiên bản 2.
Trong Maps JavaScript API phiên bản 3, tác vụ gửi yêu cầu chỉ đường đã được tách biệt với tác vụ hiển thị yêu cầu. Tác vụ này hiện được xử lý bằng lớp DirectionsRenderer
. Bạn có thể liên kết đối tượng DirectionsRenderer
với bất kỳ bản đồ hoặc đối tượng DirectionsResult
nào thông qua các phương thức setMap()
và setDirections()
. Vì trình kết xuất là một MVCObject
, nên trình kết xuất này sẽ phát hiện mọi thay đổi đối với các thuộc tính của trình kết xuất và cập nhật bản đồ khi các hướng liên kết đã thay đổi.
Mã sau đây minh hoạ cách yêu cầu chỉ đường đi bộ đến một vị trí cụ thể bằng cách sử dụng đường dành cho người đi bộ từ một địa chỉ. Xin lưu ý rằng chỉ phiên bản v3 mới có thể cung cấp chỉ đường đi bộ trên đường dành 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 đường phố
Chế độ xem đường phố của Google cung cấp các chế độ xem 360 độ tương tác từ các vị trí được chỉ định trong phạm vi phủ sóng của chế độ xem này. API phiên bản 3 hỗ trợ Chế độ xem đường phố ngay trong trình duyệt, không giống như phiên bản 2 yêu cầu trình bổ trợ Flash® để hiển thị hình ảnh Chế độ xem đường phố.
Hình ảnh Chế độ xem đường 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ó giao diện khác nhau nhưng đều đóng vai trò giống nhau: kết nối vùng chứa div
với hình ảnh Chế độ xem đường phố và cho phép bạn chỉ định vị trí và POV (góc nhìn) của ảnh toàn cảnh Chế độ xem đường 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 đường 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 tình trạng có sẵn của dữ liệu Chế độ xem đường phố, đồng thời cho phép tìm kiếm theo vị trí hoặc mã hình ảnh toàn cảnh.
Trong phiên bản 3, Chế độ xem đường phố được bật theo mặc định. Bản đồ sẽ xuất hiện cùng với
thành phần điều khiển Pegman của Chế độ xem đường phố và API sẽ sử dụng lại div bản đồ để hiển thị
ảnh toàn cảnh của Chế độ xem đường phố. Mã sau đây minh hoạ cách mô phỏng hành vi của phiên bản 2 bằng cách tách các ảnh toàn cảnh của Chế độ xem đường phố thành một div riêng biệt.
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);
}