我的地圖在城市內有數百個標記。通常不超過20英里半徑。 我讀過文檔,並沒有找到一種方法來設置init,以自動平移每個標記之間,不管距離。 默認行爲是平移如果關閉,如果很遠就跳轉。 我明白他們爲什麼會這樣做,因爲地圖不會在選定的縮放級別加載整個世界,並且如果距離太大,它可能會搞砸。不過,我認爲它可以以最少的投訴處理20英里半徑。谷歌地圖v3 - 我可以確保每次平滑平移嗎?
如果有人有任何想法,我很樂意聽到他們。 謝謝
我的地圖在城市內有數百個標記。通常不超過20英里半徑。 我讀過文檔,並沒有找到一種方法來設置init,以自動平移每個標記之間,不管距離。 默認行爲是平移如果關閉,如果很遠就跳轉。 我明白他們爲什麼會這樣做,因爲地圖不會在選定的縮放級別加載整個世界,並且如果距離太大,它可能會搞砸。不過,我認爲它可以以最少的投訴處理20英里半徑。谷歌地圖v3 - 我可以確保每次平滑平移嗎?
如果有人有任何想法,我很樂意聽到他們。 謝謝
平滑平移的閾值不取決於當前中心和新目標之間的距離。這取決於變化是否會需要一個完整的頁面滾動(水平和垂直)或不:
從API Reference報價:
啞劇(經緯度:經緯度)
改變中心的地圖到給定的LatLng。如果變化小於地圖的寬度和高度,則過渡將平滑動畫。
因此,只要您縮小以使您的視口的高度和寬度爲20英里,則應保證20英里以內距離的平滑平移。
正如丹尼爾所提到的,如果兩點距離太遠,內置的panTo()函數將不起作用。如果出現這種情況,您可以自己手動設置動畫效果:對於每個縮放級別,計算出距離爲100像素的距離。現在,當你必須平移到某一點時,你可以使用這些信息來確定panTo()函數是否會動畫或跳轉。如果移動的距離非常大以至於無法生成動畫,則應手動執行動畫 - 計算當前地圖中心與目標之間的某些中間航點,然後按順序對其進行平移。
這是真的,但我不想破解系統。我可以計算點之間的距離並以合理的增量設置不可見標記,然後平移到每個點直到達到目的地。但是,這聽起來像是我的項目範圍太大了,所以我不會這樣做......如果我還有多餘的時間玩它,那麼也許。謝謝 – 2010-09-29 18:31:07
看到這個其他SO回答有關使用JavaScript的setInterval
功能來創建你的地圖上呼籲panBy
周期函數:Can Google Maps be set to a slow constant pan? Like a globe revolution?
這可以用於平移x個象素在地圖上的每個調用panBy,讓您減慢panBy速度(因爲你只是告訴gmaps轉到一個短距離)。
下面是平移順利,也是一個解決方案允許其他點擊請求被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]);
}
}
}
這是我發現的V3的最佳解決方案。爲我完美工作。您可以通過增加STEPS var來控制平滑度。 – user2618844 2016-07-20 18:59:36
從來沒有少,有沒有辦法覆蓋呢? – 2010-09-29 00:29:40
@Kai:我不認爲有使用API。你可以自己實現動畫,但這可能不值得(這取決於這個特性的重要性)。 – 2010-09-29 00:49:23
我認爲這個功能並不重要,但客戶似乎也這麼認爲。由於導航也在側面的手風琴菜單中列出,因此用戶可以通過沿列表向下移動地圖來跳轉地圖,並且在這樣做的同時,他們可能會失去跟蹤標記與熟悉區域相關的位置的蹤跡。 – 2010-09-29 01:00:34