Cevabı için Giles Gardam'a teşekkürler, ancak enlem değil sadece boylamı ele alıyor. Tam bir çözüm, enlem için gereken yakınlaştırma seviyesini ve boylam için gerekli yakınlaştırma düzeyini hesaplamalı ve sonra ikisinden daha küçük olanı (daha fazla) almalıdır.
Hem enlem hem de boylam kullanan bir işlev:
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
Parametreler:
"Bounds" parametre değeri bir google.maps.LatLngBounds
nesne .
"MapDim" parametre değeri, haritayı görüntüleyen DOM öğesinin yüksekliğini ve genişliğini temsil eden "height" ve "width" özelliklerine sahip bir nesne olmalıdır. Dolguyu sağlamak istiyorsanız bu değerleri azaltmak isteyebilirsiniz. Yani, sınırlar içindeki harita işaretleyicilerinin haritanın kenarına çok yakın olmasını istemeyebilirsiniz.
JQuery kitaplığını kullanıyorsanız, mapDim
değer aşağıdaki gibi elde edilebilir:
var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };
Prototip kitaplığı kullanıyorsanız, mapDim değeri aşağıdaki gibi elde edilebilir:
var mapDim = $('mapElementId').getDimensions();
Geri dönüş değeri:
Dönüş değeri, tüm sınırları görüntüleyecek maksimum zum seviyesidir. Bu değer arasında 0
ve maksimum zum düzeyi dahil (dahil) olacaktır.
Maksimum yakınlaştırma düzeyi 21'dir. (Google Maps API v2 için yalnızca 19 olduğunu düşünüyorum.)
Açıklama:
Google Haritalar bir Mercator projeksiyonu kullanır. Bir Mercator projeksiyonunda, boylam çizgileri eşit aralıklıdır, ancak enlem çizgileri değildir. Enlem çizgileri arasındaki mesafe, ekvatordan kutuplara gittikçe artar. Aslında mesafe, kutuplara ulaştıkça sonsuzluğa doğru yönelir. Bununla birlikte, bir Google Haritalar haritası yaklaşık 85 derecenin kuzeyinden veya yaklaşık -85 derecenin güneyinden enlemler göstermez. ( referans ) (Gerçek kesimi +/- 85.05112877980658 derecede hesaplıyorum.)
Bu, sınırlar için kesirlerin, enlem için boylamdan daha karmaşık olmasını sağlar. Enlem oranını hesaplamak için Wikipedia'dan bir formül kullandım . Bunun Google Haritalar tarafından kullanılan projeksiyonla eşleştiğini düşünüyorum. Sonuçta, yukarıda bağlantı verdiğim Google Haritalar dokümantasyon sayfası aynı Wikipedia sayfasına bir bağlantı içeriyor.
Diğer notlar:
- Zoom seviyeleri 0 ile maksimum zoom seviyesi arasında değişir. Zoom seviyesi 0, haritanın tamamen uzaklaştırılmış halidir. Daha yüksek seviyeler haritayı daha da yakınlaştırır. ( başvuru )
- 0 zum seviyesinde tüm dünya 256 x 256 piksel olan bir alanda görüntülenebilir. ( başvuru )
- Her yüksek yakınlaştırma seviyesi için, aynı alanı görüntülemek için gereken piksel sayısı hem genişlik hem de yükseklik açısından iki katına çıkar. ( başvuru )
- Haritalar boylamsal yönde sarılır, ancak enlemsel yönde sarılmaz.