2012-05-29 55 views
2

我目前正在構建一個Google Maps項目,該項目將根據用戶輸入動態加載和卸載各種KMZ文件。它可以很好地適用於大約8層的加載/卸載,但是隨後Google Maps發生414錯誤。我將問題追溯到API生成的存儲字符串中,以引用每個KML層。谷歌地圖KML加載 - 414請求URI太大

下面是運行時單擊某個層的代碼:

function showLayer(layername) { 
    if (layers[layername].kml === undefined) { 
    layers[layername].kml = loadKML(layers[layername].file, layers[layername].options); 
    } 
    layers[layername].kml.setMap(map); 
    redrawRoutes(layers[layername].kml); 
} 

而且loadKML功能:

function loadKML(file, options) { 
    var path = kmlDir + file; 
    options = options || { preserveViewport: true }; 
    layer = new google.maps.KmlLayer(path, options); 
    return layer; 
} 

基本上我的目標是隻裝載每個KML文件一次,其存儲在一個對象,並在隨後的加載/卸載中引用它。這裏的問題是JavaScript對象裏面是new google.maps.KmlLayer產生,大長字符串

"kml:cj5TNh3iqySpI_DAGiDgbSJESQ-dakZTiMY09US6imjvFNPMTIIYNAg|ks:;dc:cg;ts:44610546|kv:3|api:3" 

並追加該請求每次URI。這會相當快速地加起來,並且在7-8追加之後,URI太長,並且任何後續請求都被忽略。

有沒有辦法使用這個長請求字符串,我可以強制它使用自定義字符串,或者每次只清除URI?我只會處理大約6個文件,我真的希望能夠處理儘可能多的圖層加載/卸載。

回答

3

您正試圖優化Google已擁有的內容。 Google緩存的KML文件及其關聯的圖塊,因此銷燬和重新創建圖層的懲罰很小。只要KML層的網址保持不變,您應該銷燬然後重新創建圖層。

無論當前位於地圖上的KML文件的數量如何,Google都會將它們呈現爲單個圖塊疊加層。您的用戶每次通過setMap添加/刪除KML圖層時都必須下載新的圖像圖像。

您的KML文件只會每幾小時訪問一次。據推測,Google試圖將爲該請求發佈的緩存標頭授予KML文件。但是,沒有具體定義Google在緩存標頭丟失時將緩存KML的時間。

Google也實施了最小緩存時間,因此即使您要通過強大的緩存標頭指定您的KML文件應在1分鐘後過期,Google仍會緩存該文件的預設時間(以及未公開)。標準解決方法是將額外的查詢字符串參數添加到KML url,以便生成以前未緩存的新/唯一地址。

+0

這是更多你在說什麼? https://gist.github.com/2837721 不完全確定你的意思是'毀滅'。我可以'setMap(null)'層,但據我所知,這就是我所能做的。這個代碼目前還沒有達到卸載層的效果。仍然遇到URI錯誤。 – colinwd

+0

是的,這就是我所說的基本知識。我有非常相似的代碼,從來沒有達到requestURI限制。 –