SORU
18 Mayıs 2011, ÇARŞAMBA


Google Maps hesaplamak için Nasıl V3 - zoom seviyesi belirli bir sınır için

Bir yol için belirli bir sınırları Google Maps kullanarak yakınlaştırma düzeyini V3 API, getBoundsZoomLevel benzer hesaplamak için arıyorum (V2) API.

Yapmak istediğim şey burada:

// These are exact bounds previously captured from the map object
var sw = new google.maps.LatLng(42.763479, -84.338918);
var ne = new google.maps.LatLng(42.679488, -84.524313);
var bounds = new google.maps.LatLngBounds(sw, ne);
var zoom = // do some magic to calculate the zoom level

// Set the map to these exact bounds
map.setCenter(bounds.getCenter());
map.setZoom(zoom);

// NOTE: fitBounds() will not work

Ne yazık ki, fitBounds kullanamam() özel kullanım için yöntem. Peki haritada uydurma işaretleri için çalışır, ama kesin sınırları ayarı çalışmıyor. İşte fitBounds kullanamıyorum neden bir örnek() yöntemi.

map.fitBounds(map.getBounds()); // not what you expect

CEVAP
7 Kasım 2012, ÇARŞAMBA


Giles için teşekkürler cevabı için Gardam, ama sadece enlem ve boylam değil adresleri. Tam bir çözüm yakınlaştırma düzeyi için gerekli enlem ve boylam düzeyi için gerekli zoom, ve sonra daha küçük (Daha fazla) iki hesaplanması gerekmektedir.

Burada her iki enlem ve boylam kullanan bir fonksiyonu

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:

"Parametre değeri google.maps.LatLngBounds bir nesne olmalıdır. sınırları

"MapDim" parametre değeri olan bir nesne "" ve "genişlik göster görüntüler" DOM öğesinin genişliği ve yüksekliği temsil eden özellikler. yüksekliğinde olmalıdır Eğer doldurma sağlamak istiyorsanız bu değerleri azaltmak için isteyebilirsiniz. Yani, sınırları içerisinde harita işaretleri haritanın kenarına çok yakın olmak istemeyebilirsiniz.

Eğer jQuery Kütüphanesi kullanıyorsanız, mapDim değeri aşağıdaki gibi elde edilebilir

var $mapDiv = $('#mapElementId');
var mapDim = { height: $mapDiv.height(), width: $mapDiv.width() };

Eğer Prototip kitaplığı kullanıyorsanız, mapDim değeri aşağıdaki gibi elde edilebilir

var mapDim = $('mapElementId').getDimensions();

Dönüş Değeri:

Dönüş değeri hala tüm sınırları görüntülenecek maksimum yakınlaştırma düzeyi. Bu değer 0 zoom maksimum seviyede dahil) arasında olacaktır.

Maksimum yakınlaştırma düzeyi 21. (Google Maps v2 API) için sadece 19 olduğuna inanıyorum


Açıklama:

Google Maps Mercator projeksiyon kullanır. Mercator projeksiyon boylam çizgileri eşit aralıklı, ama enlem çizgileri değildir. Enlem çizgileri arasındaki mesafe kutuplara ekvatordan giderler olarak artırın. Aslında mesafe kutuplara ulaştığında karşı sonsuz eğilimindedir. Google Maps bir harita, ancak, yaklaşık 85 derece yukarıda enlem Kuzey ya da yaklaşık -85 derece Güney altında göstermiyor. (reference) (g /-85.05112877980658 derece gerçek kesme hesaplamak.)

Bu sınırları için kesirler hesaplama enlem boylam için Daha için daha da karmaşık hale getirir. formula from Wikipedia enlem fraksiyonu hesaplamak için kullanılır. Bu projeksiyon Google Maps tarafından kullanılan maçlar varsayıyorum. Sonuçta, yukarıda ben link Google Maps Dokümantasyon sayfasında aynı Wikipedia sayfası için bir bağlantı içerir.

Diğer Notlar:

  1. Seviyesi en fazla yakınlaştırmak için 0 seviye aralığı Zoom. 0 harita tamamen dışarı yakınlaştırma yakınlaştırma düzeyi. Yüksek düzeyde daha fazla göster zoom. (reference)
  2. Zoom At 0 level tüm dünyanın 256 x 256 piksel bir alanda görüntülenebilir. (reference)
  3. Her yüksek yakınlaştırma düzeyi için her iki piksel genişliği ve yüksekliği iki katına çıkar aynı alanı görüntülemek için gereken sayı. (reference)
  4. Enlem yönünde uzunlamasına yönde, ama haritalar sarın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elly

    Elly

    3 EKİM 2005
  • hytchme

    hytchme

    9 Mart 2014
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010