2010-09-28 12 views
13

我的地圖在城市內有數百個標記。通常不超過20英里半徑。 我讀過文檔,並沒有找到一種方法來設置init,以自動平移每個標記之間,不管距離。 默認行爲是平移如果關閉,如果很遠就跳轉。 我明白他們爲什麼會這樣做,因爲地圖不會在選定的縮放級別加載整個世界,並且如果距離太大,它可能會搞砸。不過,我認爲它可以以最少的投訴處理20英里半徑。谷歌地圖v3 - 我可以確保每次平滑平移嗎?

如果有人有任何想法,我很樂意聽到他們。 謝謝

回答

15

平滑平移的閾值不取決於當前中心和新目標之間的距離。這取決於變化是否會需要一個完整的頁面滾動(水平和垂直)或不:

API Reference報價:

啞劇(經緯度:經緯度)

改變中心的地圖到給定的LatLng。如果變化小於地圖的寬度和高度,則過渡將平滑動畫。

因此,只要您縮小以使您的視口的高度和寬度爲20英里,則應保證20英里以內距離的平滑平移。

+1

從來沒有少,有沒有辦法覆蓋呢? – 2010-09-29 00:29:40

+0

@Kai:我不認爲有使用API​​。你可以自己實現動畫,但這可能不值得(這取決於這個特性的重要性)。 – 2010-09-29 00:49:23

+0

我認爲這個功能並不重要,但客戶似乎也這麼認爲。由於導航也在側面的手風琴菜單中列出,因此用戶可以通過沿列表向下移動地圖來跳轉地圖,並且在這樣做的同時,他們可能會失去跟蹤標記與熟悉區域相關的位置的蹤跡。 – 2010-09-29 01:00:34

0

正如丹尼爾所提到的,如果兩點距離太遠,內置的panTo()函數將不起作用。如果出現這種情況,您可以自己手動設置動畫效果:對於每個縮放級別,計算出距離爲100像素的距離。現在,當你必須平移到某一點時,你可以使用這些信息來確定panTo()函數是否會動畫或跳轉。如果移動的距離非常大以至於無法生成動畫,則應手動執行動畫 - 計算當前地圖中心與目標之間的某些中間航點,然後按順序對其進行平移。

+0

這是真的,但我不想破解系統。我可以計算點之間的距離並以合理的增量設置不可見標記,然後平移到每個點直到達到目的地。但是,這聽起來像是我的項目範圍太大了,所以我不會這樣做......如果我還有多餘的時間玩它,那麼也許。謝謝 – 2010-09-29 18:31:07

10

下面是平移順利,也是一個解決方案允許其他點擊請求被queue'd了,而以前的鍋已在進行中:

var panPath = []; // An array of points the current panning action will use 
var panQueue = []; // An array of subsequent panTo actions to take 
var STEPS = 50;  // The number of steps that each panTo action will undergo 

function panTo(newLat, newLng) { 
    if (panPath.length > 0) { 
    // We are already panning...queue this up for next move 
    panQueue.push([newLat, newLng]); 
    } else { 
    // Lets compute the points we'll use 
    panPath.push("LAZY SYNCRONIZED LOCK"); // make length non-zero - 'release' this before calling setTimeout 
    var curLat = map.getCenter().lat(); 
    var curLng = map.getCenter().lng(); 
    var dLat = (newLat - curLat)/STEPS; 
    var dLng = (newLng - curLng)/STEPS; 

    for (var i=0; i < STEPS; i++) { 
     panPath.push([curLat + dLat * i, curLng + dLng * i]); 
    } 
    panPath.push([newLat, newLng]); 
    panPath.shift();  // LAZY SYNCRONIZED LOCK 
    setTimeout(doPan, 20); 
    } 
} 

function doPan() { 
    var next = panPath.shift(); 
    if (next != null) { 
    // Continue our current pan action 
    map.panTo(new google.maps.LatLng(next[0], next[1])); 
    setTimeout(doPan, 20); 
    } else { 
    // We are finished with this pan - check if there are any queue'd up locations to pan to 
    var queued = panQueue.shift(); 
    if (queued != null) { 
     panTo(queued[0], queued[1]); 
    } 
    } 
} 
+0

這是我發現的V3的最佳解決方案。爲我完美工作。您可以通過增加STEPS var來控制平滑度。 – user2618844 2016-07-20 18:59:36