Cảm ơn Giles Gardam cho câu trả lời của mình, nhưng nó chỉ đề cập đến kinh độ và không phải là vĩ độ. Một giải pháp hoàn chỉnh sẽ tính toán mức thu phóng cần thiết cho vĩ độ và mức thu phóng cần thiết cho kinh độ, sau đó lấy mức nhỏ hơn (xa hơn) của cả hai.
Đây là một hàm sử dụng cả vĩ độ và kinh độ:
function getBoundsZoomLevel(bounds, mapDim) {
var WORLD_DIM = { height: 256, width: 256 };
var ZOOM_MAX = 21;
function latRad(lat) {
var sin = Math.sin(lat * Math.PI / 180);
var radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
}
function zoom(mapPx, worldPx, fraction) {
return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);
}
var ne = bounds.getNorthEast();
var sw = bounds.getSouthWest();
var latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI;
var lngDiff = ne.lng() - sw.lng();
var lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;
var latZoom = zoom(mapDim.height, WORLD_DIM.height, latFraction);
var lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction);
return Math.min(latZoom, lngZoom, ZOOM_MAX);
}
Demo on jsfiddle
Thông số:
Giá trị tham số "giới hạn" phải là một google.maps.LatLngBounds
đối tượng.
Giá trị tham số "mapDim" phải là một đối tượng có thuộc tính "chiều cao" và "chiều rộng" đại diện cho chiều cao và chiều rộng của phần tử DOM hiển thị bản đồ. Bạn có thể muốn giảm các giá trị này nếu bạn muốn đảm bảo đệm. Đó là, bạn có thể không muốn các điểm đánh dấu bản đồ trong giới hạn quá gần với cạnh của bản đồ.
Nếu bạn đang sử dụng thư viện jQuery, mapDim
giá trị có thể đạt được như sau:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Nếu bạn đang sử dụng thư viện Prototype, giá trị mapDim có thể được lấy như sau:
var mapDim = $('mapElementId').getDimensions();
Giá trị trả về:
Giá trị trả về là mức thu phóng tối đa vẫn sẽ hiển thị toàn bộ giới hạn. Giá trị này sẽ nằm giữa 0
và mức thu phóng tối đa, bao gồm.
Mức thu phóng tối đa là 21. (Tôi tin rằng nó chỉ là 19 cho API Google Maps v2.)
Giải trình:
Google Maps sử dụng phép chiếu Mercator. Trong phép chiếu Mercator, các đường kinh độ cách đều nhau, nhưng các đường vĩ độ thì không. Khoảng cách giữa các đường vĩ độ tăng khi chúng đi từ xích đạo đến các cực. Trong thực tế, khoảng cách có xu hướng về vô cực khi nó đạt đến cực. Tuy nhiên, bản đồ Google Maps không hiển thị các vĩ độ trên khoảng 85 độ Bắc hoặc dưới khoảng -85 độ Nam. ( tham khảo ) (Tôi tính mức cắt thực tế ở +/- 85.05112877980658 độ.)
Điều này làm cho việc tính toán các phân số cho giới hạn phức tạp hơn đối với vĩ độ so với kinh độ. Tôi đã sử dụng một công thức từ Wikipedia để tính toán phần vĩ độ. Tôi giả sử điều này khớp với phép chiếu được sử dụng bởi Google Maps. Rốt cuộc, trang tài liệu Google Maps mà tôi liên kết đến ở trên có chứa một liên kết đến cùng một trang Wikipedia.
Ghi chú khác:
- Mức thu phóng nằm trong khoảng từ 0 đến mức thu phóng tối đa. Thu phóng mức 0 là bản đồ được thu nhỏ hoàn toàn. Cấp độ cao hơn phóng to bản đồ hơn nữa. ( tham khảo )
- Ở mức thu phóng 0, toàn bộ thế giới có thể được hiển thị trong một khu vực có kích thước 256 x 256 pixel. ( tham khảo )
- Đối với mỗi mức thu phóng cao hơn, số pixel cần thiết để hiển thị cùng một khu vực nhân đôi cả về chiều rộng và chiều cao. ( tham khảo )
- Bản đồ bao bọc theo hướng dọc, nhưng không theo hướng vĩ độ.