0

Google マップで KML ファイルを表示するために geoxml3 を使用しています。さまざまな KML レイヤーをオン/オフできるスクリプトを作成しました。すべてのレイヤーが期待どおりにオンになりますが、1 つのレイヤーをオフにしようとすると、別のレイヤーがオフになります。

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 に答える