0

我正在使用 geoxml3 在 Google 地图上显示 KML 文件。我制作了可以打开和关闭不同 KML 图层的脚本。尽管每一层都按预期打开,但在尝试关闭一层时,会关闭另一层。

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);

我确定问题出在函数 toggle() 中:

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

在这里测试一下。加载图层需要很长时间,因为它们是未压缩 (KML) 格式。我读到 geoxml3 应该支持KMZ 文件,我什至复制了这个示例中的每个文件,但它对我不起作用。有人知道为什么吗?

4

2 回答 2

1

最后我得到了正确的代码,其中函数 toggle() 是:

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 来解析图层,而不是单击输入而是元素。所以脚本变得非常短。

于 2012-05-17T22:11:04.080 回答
0

你有一个问题,geo.showDocument你传递的参数 (geo.docs与你的 layers.data 数组的指示方式不同,你不能这样得到合理的结果。你应该找到另一种方法来告诉 geoxml3 哪个文档隐藏,例如基于 geo.docs 数组的每个单元格的 url 属性,这将更一致地匹配 layers.data 数组。

对于 KMZ 解析问题,您需要使用 geoxml3 库的另一个分支,使用 svn 签出此地址:http ://geoxml3.googlecode.com/svn/branches/kmz 。它仍在开发中,因此不排除错误。

于 2012-05-17T15:07:48.217 回答