Leaflet GeoJSONレイヤーの追加/削除


30

Leaflet APIを使用して、さまざまなズームレイヤーでさまざまなGeoJSONレイヤーを表示しようとしています。3つのレイヤーすべてを一度に読み込んで表示できます(実際にすべてを一度に表示したくないのですが)。さまざまなズームレベルで読み込んで表示できます。

ズームレベル1〜6で、地図に1つのGeoJSONレイヤーが表示されるようにコードを設定しています。レベル7〜10では別のレベルが表示され、レベル11+では3番目のレベルが表示されます。それらを表示することはできます。私が今仕事をしようとしているのは、表示されている場合は他の人をオフにすることです。1-6から7-10に移動すると(1-6レイヤーが正しくオフになることを意味します)、7-10から11+に移動しません(7-10レイヤーが固着することを意味します)。理由(同じコードを使用)。

GeoJSONレイヤーのajaxは次のとおりです。

function getJson(defaultStyle, map, simp, geojsonLayer){
var url = 'file' + simp + '.json';
map.removeLayer(geojsonLayer);
geojsonLayer.clearLayers();
$.getJSON(url, function(data){
    geojsonLayer = L.geoJson(data, {
        style: defaultStyle,
        onEachFeature: onEachFeature
    });
    geojsonLayer.addTo(map);
});
}

そして、ズームに応じてajaxを呼び出すメイン関数があります。simpCounterは最初は0に設定されています。

map.on('zoomend', function(e) {
if (map.getZoom() >= 7 && map.getZoom() <= 10) {
    if (simpCounter == 0 || simpCounter == 2) {
    getJson(defaultStyle, map, 60, geojsonLayer);
    simpCounter = 1;
    }
} else if (map.getZoom() >= 11) {
    if (simpCounter == 0 || simpCounter == 1) {
    getJson(defaultStyle, map, 35, geojsonLayer);
    simpCounter = 2;
    }
}
});

繰り返しますが、最初の遷移では古いレイヤーが正しくオフになりますが、2番目の遷移ではオフになりません。助けてくれてありがとう。


明確にするために、jsonを11+でオンにし、7-10ではオフにしませんか?
-RomaH

それは正しいです。
ジョシュ

回答:


28

代わりにこれを試してください:

function getJson(simp){  //Removed unneeded arguments here
    var url = 'file' + simp + '.json';
    map.removeLayer(geojsonLayer);
    //geojsonLayer.clearLayers();  I don't believe this needed.
    $.getJSON(url, function(data){
        geojsonLayer = L.geoJson(data, {
            style: defaultStyle,
            onEachFeature: onEachFeature
        });
        geojsonLayer.addTo(map);
    });
}

そして、あなたの呼び出し関数のために:

map.on('zoomend', function(e) {
    if (map.getZoom() >= 7 && map.getZoom() <= 10) {
        if (simpCounter == 0 || simpCounter == 2) {
        getJson(60);
        simpCounter = 1;
        }
    } else if (map.getZoom() >= 11) {
        if (simpCounter == 0 || simpCounter == 1) {
        getJson(35);
        simpCounter = 2;
        }
    } else if (map.getZoom() <= 7) { //Return to original data
        if (simpCounter == 1 || simpCounter == 2) {
        getJson(XX); //Fill out with correct file name
        simpCounter = 0;
        }
    }
});

引数を渡すときmapgeojsonLayerおよびdefaultStyle呼び出しでgetJson(defaultStyle, map, 60, geojsonLayer);オブジェクトの新しいインスタンスを作成しています。次に、画面に反映される可能性のあるインスタンスで作業を実行しますが、「メインループ」に戻ると、基本的にそれが行ったすべてを忘れて前の状態に戻ります。

私はあなたがを定義しているdefaultStyleと推測しているので、グローバルスコープのmap初期geojsonLayer集団を呼び出すだけでよいので、渡す必要はありません。調整により、グローバルmapを変更し、関数呼び出しが終了した後も変更が持続するようにしました。

このソリューションは私のために働いた。ここで作成したファイルの内容全体を見ることができます:http : //pastebin.com/yMYQJ2jK

また、1〜7の最終ズームレベルを定義して、初期ズームレベルに戻ったときに初期JSONデータを確認できるようにします。そうしないと、ページをリロードしない限り失われ、呼び出されません


ありがとう。変数を渡すと一時インスタンスが作成されることを知りませんでした。
ジョシュ

ええ、あなたが行っていた変更を維持する唯一の方法は、returnステートメントでそれを返すことです。javascriptでグローバルを使用するのが一般的と思われるため、この方法で行うのがタスクを完了するのに最も簡単です。
RomaH

それは理にかなっている。最近、ベストプラクティスの本でグローバルを使用しないように読みましたが、どうやら別の方法を誤用していたようです。ありがとう。
ジョシュ

グローバルを使用しないことは、すべてのプログラミング言語でのベストプラクティスです。バグを追跡するのは簡単です。しかし、ベストプラクティスは経験則にすぎません。ほとんどのページ内のJavaScriptの使用は、副作用を簡単に管理できるほど十分に軽いようです。モジュール全体または外部jsを記述している場合は、グローバルを避けます。
ローマ

1

リーフレットには、データ構造のレイヤーグループコレクションタイプと、チェックボックスのイベントリスナーとしてコーディングした後にオンとオフを切り替えることができるレイヤーコントロールインターフェイスがあります。


1

複数のgeoJSONレイヤーを削除する方法を示すために、以下の例を作成しました。

///adding geoJSON data

          var myGeoJSON = L.geoJSON(myData, {

            onEachFeature: function (feature, layer) {
                layer.myTag = "myGeoJSON"
            }

        });


////// function to remove geoJSON layers 

    var removeMarkers = function() {
        map.eachLayer( function(layer) {

          if ( layer.myTag &&  layer.myTag === "myGeoJSON") {
            map.removeLayer(layer)
              }

            });

    }

//// calling function 

removeMarkers();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.