2012-05-16 80 views
0

我正在使用geoxml3在Google地圖上顯示KML文件。我製作了可以打開和關閉不同KML圖層的腳本。雖然每層都按預期打開,但試圖關閉一層時關閉另一層。 geoxml3 - 帶有KML圖層控件的Google地圖

var G = google.maps; 
var layers = new function() {this.data = [ 
{id:'japan',url:'kvadrati.kml'}, 
{id:'d1', url:'Didzis_21.03-03.04.kml'}, 
{id:'d2', url:'Didzis_04.04-17.04.kml'}, 
... ]}; 

function toggle() {for (var i=0; i<layers.data.length; i++) { 
if (this.id == layers.data[i].id) { 
if (layers.data[i].parsed) { 
if (layers.data[i].on) 
{geo.hideDocument(geo.docs[i]); layers.data[i].on = false} 
else {geo.showDocument(geo.docs[i]); layers.data[i].on = true}} 
else {geo.parse(layers.data[i].url); layers.data[i].parsed = true; layers.data[i].on = true}} 
};}; 

function initialize() { 
var options = { 
    center:new G.LatLng(34.9, 137.3), 
    zoom:10, 
    mapTypeId:G.MapTypeId.TERRAIN, 
    scaleControl:true, 
    overviewMapControl:true, 
    mapTypeControlOptions:{style:G.MapTypeControlStyle.DROPDOWN_MENU} 
}; 
map = new G.Map(document.getElementById('map'), options); 
geo = new geoXML3.parser({ 
      map:map, 
      zoom:false, 
      singleInfoWindow:true, 
      infoWindowOptions:{maxWidth:100}, 
      processStyles:true, 
      markerOptions:{shadow:''} 
     }); 
var el = document.getElementsByTagName('input'); 
for (var i=0; i<el.length; i++) { 
    el[i].type = 'checkbox'; 
    G.event.addDomListener(el[i], 'click', toggle)}; 
}; 
G.event.addDomListener(window, 'load', initialize); 

我敢肯定,問題是功能切換(),其中顯示:

geo.[show/hide]Document(geo.docs[i]); 

Test it here。 加載圖層需要相當長的時間,因爲它們處於未壓縮(KML)格式。我讀geoxml3應該支持KMZ files,我甚至複製了這個例子中的每個文件,但它不適合我。任何人都知道這是爲什麼?

回答

1

最後我得到了正確的代碼,其中功能切換()是:

function toggle() { 
for (var i=0; i<layers.length; i++) { 
var x = layers[i]; 
var xurl = './layers/' + x.url; 
if (this.id == x.id) 
{if (x.render) 
{for (var n=0; n<geo.docs.length; n++) 
{var y = geo.docs[n]; 
if (y.url == xurl) 
{if (x.on) {geo.hideDocument(y); x.on = false} else {geo.showDocument(y); x.on = true}} 
}} 
else {geo.parse(xurl); x.render = true; x.on = true}}}}; 

很瘋狂的功能,很多if語句,但我想它不可能比這更簡單的或清潔劑。

編輯:

function toggle() {var x = this; 
if (x.r) {(x.on) ? geo.hideDocument(geo.docs[x.n]) : geo.showDocument(geo.docs[x.n])} 
else {geo.parse(x.href); x.r = true; x.n = geo.docs.length}; x.on = !x.on}; 

移除層陣列,沒有必要,現在,我使用從錨標記HREF解析的層,而不是點擊輸入,但是一個元素。所以劇本很短。

0

你必須與geo.showDocument的問題,要傳遞的參數(geo.docs沒有以同樣的方式爲您layers.data陣列indiced,你不能有一個合理的結果的方式。 你應該另找告訴geoxml3要隱藏哪個文檔,例如基於geo.docs數組的每個單元格的url屬性,這將更一致地匹配layers.data數組。

對於KMZ解析問題,您需要使用geoxml3庫的另一個分支,用svn檢查這個地址:http://geoxml3.googlecode.com/svn/branches/kmz。它仍在開發中,所以不排除錯誤。

+0

你試過用geoxml3解析KMZ嗎?我無法獲得KMZ渲染的工作頁面。如果只有那些可下載的例子,比如檔案,以確保它真的有效。 –

+0

不,我沒有,我只使用多分支。看起來主要功能並沒有真正的不同,geoxml3.js文件負責確定傳遞的URL是否對應於一個zip文件。 – vicould