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

标签 javascript jquery filter leaflet geojson

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

user checkboxes

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

$('#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
  }
}

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

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

返回 (feature.properties[value] && feature.properties[value])

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

最佳答案

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

例如你可以使用 submittedValues.every()测试给定 feature 的每个复选框值是否为 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;
}

关于javascript - Leaflet:在 GeoJSON 层中使用动态过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39000727/

相关文章:

javascript - 过滤对象数组并计算 Javascript 中过滤后的元素

JavaScript 页内搜索和替换

javascript - 如何匹配但排除正则表达式模式?

javascript - 似乎无法让 AngularJS 单向绑定(bind)工作

javascript - 如何自动移动滚动条

jquery如何过滤表单中未选中的复选框

html - 基于白名单为(X)HTML编写XSS过滤器

javascript - 根据第一个下拉列表的选定值填充第二个下拉列表

javascript - chrome 扩展不会在当前窗口中附加文本

javascript - 如何防止注册多个重复事件?