在Leaflet中重新应用GeoJSON的过滤器

时间:2018-05-24 07:28:40

标签: javascript leaflet geojson

在Leaflet中,我使用变量在GeoJSON的过滤器中插入条件,如下所示:

var stareInt = "start";
var elements;

var geojsonStyle = {
 radius: 6,
 fillColor: "#6bad9f",
 color: "#FFF",
 className: 'point',
 pane: "pointPanel",
 weight: 1,
 opacity: 0.9,
 fillOpacity: 0.8
};


elements = L.geoJSON(elem_build, {
pointToLayer: function (feature, latlng) {
    return new L.circleMarker(latlng, geojsonStyle, {
}).on('click', function() {
    this.bindPopup(feature.properties.grad_int).openPopup();
});
},

filter: function(feature, layer) {    
  if (stareInt == "01") {  
    return (feature.properties.grad_int == "very good");
  }
  else if (stareInt == "02") {
    return (feature.properties.grad_int == "good");
  }
  else {
    return feature.properties.grad_int == "bad";            
  }
 },

onEachFeature: onEachFeature
}).addTo(map);

通过单击按钮激活过滤器,如下所示:

$("#buttonA").click(function() {
 map.removeLayer(elements);
 stareInt= "01";
 map.addLayer(elements);
});

但我发现只返回了最后一个状态(在这种情况下,'坏')。

我想我必须重新应用过滤器或类似的东西,因为Leaflet不记得它。

如何让过滤器按钮起作用?

1 个答案:

答案 0 :(得分:2)

请注意,String[] fields = Stream.of(string.split("[+()*]")) .filter(s -> !s.isEmpty()) .toArray(String[]::new); 回调函数在实例化filter时运行一次。当图层(重新)添加到地图时,传单重新应用L.GeoJson上的过滤器。这是设计的。您可以通过查看the source code for L.GeoJson来查看此内容。

一种方法是有三个不同的L.GeoJson实例,每个实例都应用了不同的过滤器:

L.GeoJson

然后,您可以使用外部按钮切换内容:

var elements_verygood = L.geoJson(elem_build, {
    filter: function(feat) { return feat.properties.grad_int == "very good"); }
});

var elements_good = L.geoJson(elem_build, {
    filter: function(feat) { return feat.properties.grad_int == "good"); }
});

var elements_bad = L.geoJson(elem_build, {
    filter: function(feat) { return feat.properties.grad_int == "bad"); }
});

但这也是使用document.getElementById("buttonA").addEventListener('click', function() { map.removeLayer(elements_good); map.removeLayer(elements_bad); map.addLayer(elements_verygood); });

的好方案
L.Control.Layers