我们正在尝试使用GeoJSON构建Leaflet Map。我们的数据来自实时流,因此我们首先使用空数据初始化GeoJSON:
var myLayer = L.geoJson([], {
style: function(feature) {
var color = getDataband(LATENCY_BANDS, feature.properties.latency).color;
return {
fillColor: color
};
},
pointToLayer: function(feature, latlng) {
return L.circleMarker(latlng, geojsonMarkerOptions);
},
filter: function(feature, layer) {
var latency = feature.properties.latency;
for (var i = 0; i < ENABLED_LATENCY_BANDS.length; i++) {
if (ENABLED_LATENCY_BANDS[i].contains(latency)) {
return true;
}
}
return false;
}
});
然后我们通过调用:
逐个添加数据点,因为消息来自实时流var geojsonFeature = {
"type": "Feature",
"properties": {
"latency": sample.latency
},
"geometry": {
"type": "Point",
"coordinates": [location.longitude, location.latitude]
}
};
myLayer.addData(geojsonFeature);
但是,我们的过滤器会根据用户输入动态更改。因此,我们需要删除所有现有数据,并在用户输入更改时将所有数据重新添加到地图,以便新过滤器应用于所有现有数据和新数据。我们尝试在用户输入更改时调用以下内容:
map.removeLayer(myLayer);
myLayer.addTo(map);
但是,当myLayer
重新添加到地图时,旧数据将被清除,只显示新数据。
我们似乎应该在调用myLayer
之前重新初始化myLayer.addTo(map)
对象,但我们不知道如何使用现有的要素数据重新初始化myLayer
。文档没有解释如何引用GeoJSON传单对象的数据。
我们如何引用GeoJSON传单对象的数据?
感谢。
答案 0 :(得分:1)
filter
选项仅在实例化和使用.addData()
方法时有效。此外,当一个功能被过滤掉时,它不仅仅是“隐藏”,而是未记录在内存中(即不在该组内)。
奇怪的是,如果您更改过滤条件,则删除组并将其添加回地图会消除旧数据。
无论如何,可能没有关于如何&#34;引用GeoJSON Leaflet对象数据的文档&#34;在你想要实现的意义上,因为它是依赖于实现的。
在您的情况下,您需要在隐藏的组/数组中累积您的功能,以便每当您的过滤条件发生变化时,您都可以通过新的过滤器重新评估这些功能。
例如,您可以执行以下操作:
var accumulatedFeatures = [];
// When data arrives
accumulatedFeatures.push(geojsonFeature);
myLayer.addData(geojsonFeature);
// When filter conditions change
myLayer.clearLayers(); // http://leafletjs.com/reference-1.0.0.html#layergroup-clearlayers
myLayer.addData(accumulatedFeatures); // Re-evaluate all data through new filter