Leaflet:在 GeoJSON 层中使用动态过滤器

Leaflet: Use dynamic filters in GeoJSON layer

我已经很接近了,但我很难理解如何将多个用户提交的表单复选框值传递给 Leaflet geoJSON 过滤器功能并只显示这些点。

到目前为止我有什么...

$('#map-filters').on("submit", function(e){
    e.preventDefault();
    map.spin(true,spinOpts);
    submittedValues = $(this).serializeArray();
    var filteredLocations = L.markerClusterGroup({ chunkedLoading: true }),
        filteredLocationsAjax = new L.GeoJSON.AJAX(Routes.filtered_locations_path({format: 'json'}), {
          style: style,
          pointToLayer: pointToLayer,
          onEachFeature: onEachFeature,
          filter: function(feature, layer) {
            if(submittedValues.length <= 1) {
              return feature.properties[submittedValues[0].value];
            } else {
              How do I return multiple values?
            }
          }
        });
    filteredLocationsAjax.on('data:loaded', function () {
      map.removeLayer(allLocations);
      filteredLocations.addLayer(filteredLocationsAjax);
      map.addLayer(filteredLocations);
      map.spin(false);
    });
  });

以及我的 geoJSON 示例...

{
  type: "Feature",
  geometry: {
  type: "Point",
  coordinates: [
    "-76.286955",
    "45.335969"
  ]
},
  properties: {
    id: 2,
    name: "Mississippi River",
    body_of_water: null,
    url: "http://0.0.0.0:5000/locations/2",
    observations_count: 1,
    ph: true,
    water_temperature: true,
    oxygen: true,
    phosphates_threshold: true,
    clarity: true,
    nitrites: true,
    nitrates: true,
    issues_count: 3,
    water_quality: true,
    algae: true
  }
}

如果用户只提交了一个复选框,这会很好地工作,地图过滤正是我想要的。但是我如何将多个值传递给它呢?

我看到有人建议使用...

return (feature.properties[value] && feature.properties[value])

但是我如何将多个值传递到这样的 return 语句中,因为用户可以 select 1 或 20 个复选框。

如果我理解正确,你应该循环遍历所有 submittedValues 数组项并执行测试。

例如对于给定的 feature:

,您可以使用 submittedValues.every() 来测试每个复选框的值是否为 true
filter: function (feature, layer) {
  return submittedValues.every(function (element) {
    return feature.properties[element.value];
  });
}

当然你可以用经典的 for 循环做同样的事情:

filter: function (feature, layer) {
  for (var i = 0; i < submittedValues.length; i += 1) {
    if (!feature.properties[submittedValues[i].value]) {
        return false;
    }
  }
  return true;
}