전단지 GeoJSON 레이어 추가 / 제거


30

Leaflet API를 사용하여 다른 줌 레이어에서 다른 GeoJSON 레이어를 표시하려고합니다. 세 레이어를 모두 한 번에로드하고 표시 할 수 있습니다 (실제로 모든 레이어가 한 번에 표시되는 것을 원하지는 않지만). 다른 줌 레벨로로드하여 표시 할 수 있습니다.

확대 / 축소 수준 1-6에서지도에 하나의 GeoJSON 레이어가 표시되도록 코드를 설정했습니다. 7-10 레벨에서는 다른 것을 보여줄 것이고 11+ 레벨에서는 3 분의 1을 보일 것입니다. 그것들을 표시하면 작동합니다. 내가 지금 일하려고하는 것은 다른 하나가 표시되면 다른 것을 끄는 것입니다. 1-6에서 7-10으로 이동하면 (1-6 레이어가 올바르게 꺼짐을 의미) 7-10에서 11+ (7-10 레이어가 붙어 있음을 의미)가 아니며 그림을 볼 수 없습니다 왜 (같은 코드를 사용하는지).

GeoJSON 레이어의 아약스는 다음과 같습니다.

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

그리고 줌에 따라 아약스를 호출하는 주요 기능이 있습니다. 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;
    }
}
});

다시 한 번, 첫 번째 전환은 이전 레이어를 올바르게 끄지 만 두 번째 전환은 그렇지 않습니다. 도와 주셔서 감사합니다.


명확히하기 위해, 11 이상 동안 json을 켜고 7-10을 끄지 않습니까?
RomaH

맞아요.
Josh

답변:


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

언제 인수를 전달하는 map, geojsonLayerdefaultStyle호출에 getJson(defaultStyle, map, 60, geojsonLayer);당신은 객체의 새로운 인스턴스를 만들 수 있습니다. 그런 다음 화면에 반영 될 수있는 인스턴스에 대한 작업을 수행하지만 일단 '메인 루프'로 돌아 가면 기본적으로 방금 수행 한 모든 것을 잊어 버리고 이전 상태로 돌아갑니다.

내가 추측하고 있기 때문에 당신은 정의 defaultStyle, map그리고 초기 geojsonLayer당신은 그냥 전화를해야 전역에 인구는 필요 전달할 없습니다. 조정을 통해 전역을 변경하여 map함수 호출이 완료 된 후에도 변경 사항이 유지됩니다.

이 솔루션은 저에게 효과적이었습니다. 내가 작성한 전체 파일 내용을 볼 수 있습니다 : http://pastebin.com/yMYQJ2jK

또한 1-7의 최종 확대 / 축소 수준을 정의하여 초기 확대 / 축소 수준으로 돌아갈 때 초기 JSON 데이터를 볼 수 있습니다. 그렇지 않으면 페이지를 다시로드하지 않으면 손실되고 다시 호출되지 않습니다!


감사. 변수를 전달하면 임시 인스턴스가 생성된다는 것을 알지 못했습니다.
Josh

예, 변경 사항을 유지하는 유일한 방법은 return진술 과 함께 전달하는 것입니다 . 자바 스크립트에서 전역을 사용하는 것이 일반적 이므로이 방법을 사용하면 작업을 완료하는 것이 가장 쉽습니다.
RomaH

말이 되네요 최근에 모범 사례 책에서 전 세계를 사용하지 말라고 읽었지만 대안을 잘못 사용하고있는 것 같습니다. 감사.
Josh

전역을 사용하지 않는 모든 프로그래밍 언어에서 모범 사례입니다. 버그를 추적하는 것이 더 쉽습니다. 그러나 모범 사례는 단지 경험의 법칙 일뿐입니다. 대부분의 자바 스크립트 인 페이지 사용은 부작용을 쉽게 관리 할 수있을 정도로 가벼워 보입니다. 전체 모듈 또는 외부 js를 작성하는 경우 전역을 피할 수 있습니다.
RomaH

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.