2016-10-05 68 views
0

最近我問了referencing the data of an existing GeoJSON Leaflet object。我的Leaflet地圖由流入我的GeoJSON Leaflet對象的數據組成。用戶輸入可以更改GeoJSON數據的過濾器,因此爲了使過濾器適用於現有數據和新數據,我正在使用名爲myFeatures的數組跟蹤我的數據。當過濾器更換或myFeatures改變一個項目,我做到以下幾點:如何修改或刪除GeoJSON Leaflet對象中的一些現有數據?

myGeoJson.clearLayers(); 
myGeoJson.addData(myFeatures); 

這是工作,根據新更新的功能,數據或者在過濾器的變化,使我的地圖更新。

我申請彈出窗口的GeoJSON的對象時,我初始化我GeoJSON的對象:

var myGeoJson = L.geoJson(myFeatures, { 
    style: function(feature) { 
    ... 
    }, 

    pointToLayer: function(feature, latlng) { 
    return L.circleMarker(latlng, geojsonMarkerOptions); 
    }, 

    filter: function(feature, layer) { 
    ... 
    }, 

    onEachFeature: function(feature, layer) { 
    if (feature.properties && feature.properties.popupContent) { 
     layer.bindPopup(feature.properties.popupContent); 
    } 
    } 
}); 

當我點擊某個功能時,會出現彈出。但是,由於clearLayersaddData被調用,彈出窗口很快就會解散。 :(

是否有某種方式來阻止彈出在這種情況下解僱

或者 - 更好的問題 - 是有沒有辦法在一個以GeoJSON對象修改現有的數據或刪除某些(不是全部)數據來自GeoJSON對象?

爲了提供一些上下文,我的GeoJSON顯示了每個要素的圓形標記,圓形標記根據要素的屬性進行了着色,該屬性實際上可以隨時間變化,因此標記的樣式需要更新一個標記也會超時一段時間,並且需要從地圖中刪除,但其他標記需要保留在地圖上

回答

1

確實有更好的方法可以做到這一點,但如果您不想過多修改代碼體系結構,則可以在特定的圖層中創建彈出窗口,在添加新數據時不會清除它。

爲了給你一個想法(標記在你的榜樣發揮myGeoJson的作用下圖):

var popup_id = {}; 
var popup_layer = new L.layerGroup(); 
var markers = new L.layerGroup(); 

$.each(testData, function(index, p) { 
    var marker = L.marker(L.latLng(p.lat, p.lon)); 
    markers.addLayer(marker); 
    popup = new L.popup({offset: new L.Point(0, -30)}); 
    popup.setLatLng(L.latLng(p.lat, p.lon)); 
    popup.setContent(p.text); 
    popup_id[p.id] = popup; 
    marker.on('click', function() { 
     popup_id[p.id].openPopup(); 
     popup_layer.addLayer(popup_id[p.id]); 
     markers.clearLayers(); 
    }) 
}); 

popup_layer.addTo(map); 
markers.addTo(map); 

也追蹤您的所有彈出窗口的字典popup_id。 由於您沒有向我們提供JSfiddle,因此您的案例難以找到完美答案,但我希望彈出層(也是here in my fiddle)爲您提供了一個好方向。

+0

您彈出窗口的單獨圖層工作。謝謝。但我很好奇,有什麼「更好的方式做到這一點」? – carmenism

相關問題