9

我採取的方法(n)的標記位置自動適應窗格迄今爲止一直:設置一個谷歌地圖視口的各個位置

function addMarker(query) { 
    var geocoder = new google.maps.Geocoder(); 
    var afterGeocode = $.Deferred(); 

    // Geocode 'query' which is the address of a location. 
    geocoder.geocode( 
      { address: query }, 
      function(results, status){ 

        if(status === 'OK'){ 
         afterGeocode.resolve(results); // Activate deferred. 
        } 
      } 
    ); 

    afterGeocode.then(function(results){ 
     var mOptions = { 
      position: results[0].geometry.location, 
      map: map 
     } 

     // Create and drop in marker. 
     var marker = new google.maps.Marker(mOptions); 
     marker.setAnimation(google.maps.Animation.DROP);  

     var current_bounds = map.getBounds(); // Get current bounds of map 
     // use the extend() function of the latlngbounds object 
     // to incorporate the location of the marker 
     var new_bounds = current_bounds.extend(results[0].geometry.location); 
     map.fitBounds(new_bounds); // fit the map to those bounds 
    }); 
} 

我遇到的問題是,在地圖莫名無論新的標記是否適合當前的視口,縮小一定的量。

我在做什麼錯?

附錄

我添加日誌和一個額外的變量來捕捉地圖界限後過渡作出(new_new_bounds)

current_bounds = // Map bounds before anything is done. 
    {-112.39575760000002, 33.60691883366427}, 
    {-112.39295444655761, 33.639099} 

new_bounds = // From after the extend 
    {-112.39295444655761, 33.60691883366427}, 
    {-112.39575760000002, 33.639099} 

new_new_bounds = // From after the fitbounds 
    {-112.33942438265382, 33.588697452015374}, 
    {-112.44928766390382, 33.657309727063996} 
+0

什麼是new_bounds說它的邊界在擴展之後? – 2011-05-13 21:09:49

+0

更新了診斷程序。 – dclowd9901 2011-05-13 21:26:33

+0

它看起來像從(x1,y1),(x2,y2) - >(x2,y1),(x1,y2)的邊界變化會引發問題。我不是100%,但那是我開始的地方。 – 2011-05-13 23:43:45

回答

8

好的,經過多番爭論後,事實證明問題是地圖邊界與fitBounds()之後的地圖邊界不一樣。會發生什麼(我認爲),是Google 需要您在fitBounds()方法中給出的邊界,然後填充它們。每次將當前邊界發送到fitBounds()時,您不會擬合邊界(x,y),您將擬合邊界(x + m,y + m),其中m =任意邊界。

這就是說,最好的辦法是這樣的:

var current_bounds = map.getBounds(); 
var marker_pos = marker.getPosition(); 

if(!current_bounds.contains(marker_pos)){ 

    var new_bounds = current_bounds.extend(marker_pos); 
    map.fitBounds(new_bounds); 
} 

因此,地圖只能以邊界如果標記放置在當前地圖範圍之外的瀑布。希望這可以幫助任何碰到這個問題的人。

0

一種可能的解釋是,你隨意擺放你的新標記進入z曲線的間隙。 Z曲線遞歸將地圖細分爲4個較小的貼圖,但這也是瓷磚之間存在間隙的原因。更好的方法是對地圖應用使用希爾伯特曲線或摩爾曲線。有一個覆蓋這個問題的專利搜索算法,我認爲它被稱爲quadtrees中的多維範圍查詢。你想尋找尼克的希爾伯特四角樹空間索引博客。

+0

我的回答很難過。我只是使用v3 API提供的標準庫。查詢只是地址或地址的一部分。 – dclowd9901 2011-05-13 22:44:19

+0

dclowd,我修復了我的答案! – Bytemain 2011-05-13 23:17:48