Terima kasih kepada Giles Gardam untuk jawabannya, tetapi hanya membahas garis bujur dan bukan garis lintang. Solusi lengkap harus menghitung level zoom yang diperlukan untuk garis lintang dan tingkat zoom yang diperlukan untuk garis bujur, dan kemudian mengambil yang lebih kecil (lebih jauh) dari keduanya.
Berikut adalah fungsi yang menggunakan lintang dan bujur:
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
Parameter:
Nilai parameter "batas" harus menjadi google.maps.LatLngBounds
objek.
Nilai parameter "mapDim" harus berupa objek dengan properti "height" dan "width" yang mewakili tinggi dan lebar elemen DOM yang menampilkan peta. Anda mungkin ingin mengurangi nilai-nilai ini jika Anda ingin memastikan bantalan. Artinya, Anda mungkin tidak ingin penanda peta di dalam batas terlalu dekat dengan tepi peta.
Jika Anda menggunakan perpustakaan jQuery, mapDim
nilainya dapat diperoleh sebagai berikut:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Jika Anda menggunakan pustaka Prototipe, nilai mapDim dapat diperoleh sebagai berikut:
var mapDim = $('mapElementId').getDimensions();
Nilai Pengembalian:
Nilai kembali adalah tingkat pembesaran maksimum yang masih akan menampilkan seluruh batas. Nilai ini akan berada di antara 0
dan tingkat zoom maksimum, inklusif.
Level zoom maksimum adalah 21. (Saya yakin itu hanya 19 untuk Google Maps API v2.)
Penjelasan:
Google Maps menggunakan proyeksi Mercator. Dalam proyeksi Mercator, garis bujur sama spasi, tetapi garis lintang tidak. Jarak antara garis lintang meningkat saat mereka bergerak dari garis khatulistiwa ke kutub. Bahkan jaraknya cenderung menuju infinity saat mencapai kutub. Namun, peta Google Maps tidak menunjukkan garis lintang di atas sekitar 85 derajat Utara atau di bawah sekitar -85 derajat Selatan. ( referensi ) (Saya menghitung cutoff aktual pada +/- 85.05112877980658 derajat.)
Ini membuat perhitungan fraksi untuk batas lebih rumit untuk lintang daripada untuk bujur. Saya menggunakan rumus dari Wikipedia untuk menghitung fraksi lintang. Saya menganggap ini cocok dengan proyeksi yang digunakan oleh Google Maps. Lagi pula, halaman dokumentasi Google Maps yang saya tautkan di atas berisi tautan ke halaman Wikipedia yang sama.
Catatan lain:
- Tingkat zoom berkisar dari 0 hingga tingkat zoom maksimum. Level zoom 0 adalah peta yang sepenuhnya diperbesar. Level yang lebih tinggi memperbesar peta lebih jauh. ( referensi )
- Pada tingkat zoom 0 seluruh dunia dapat ditampilkan di area yang 256 x 256 piksel. ( referensi )
- Untuk setiap tingkat zoom yang lebih tinggi, jumlah piksel yang diperlukan untuk menampilkan area yang sama menggandakan lebar dan tinggi. ( referensi )
- Peta membungkus dalam arah longitudinal, tetapi tidak dalam arah latitudinal.