I've got this pretty close but I'm struggling to understand how to pass multiple user submitted form checkbox values through to the Leaflet geoJSON filter function and only display those points.
What I have so far...
$('#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);
});
});
And an example of my geoJSON...
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [
"-76.286955",
"45.335969"
]
},
properties: {
id: 2,
name: "Mississippi River",
body_of_water: null,
url: ":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
}
}
This works fine if the user has only submitted one checkbox, the map filters exactly how I want. But how would I pass multiple values to this?
I've seen people suggest using...
return (feature.properties[value] && feature.properties[value])
But how would I pass multiple values into a return statement like that, as the user could select 1 or 20 checkboxes.
I've got this pretty close but I'm struggling to understand how to pass multiple user submitted form checkbox values through to the Leaflet geoJSON filter function and only display those points.
What I have so far...
$('#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);
});
});
And an example of my 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
}
}
This works fine if the user has only submitted one checkbox, the map filters exactly how I want. But how would I pass multiple values to this?
I've seen people suggest using...
return (feature.properties[value] && feature.properties[value])
But how would I pass multiple values into a return statement like that, as the user could select 1 or 20 checkboxes.
Share Improve this question asked Aug 17, 2016 at 15:28 olliekavolliekav 1653 silver badges9 bronze badges 1- Cross-posted as gis.stackexchange./questions/207327/… – PolyGeo Commented Aug 17, 2016 at 22:42
1 Answer
Reset to default 6If I understand correctly, you should just loop through all your submittedValues
array items and perform your test.
E.g. you could use submittedValues.every()
to test that every checked box value is true
for the given feature
:
filter: function (feature, layer) {
return submittedValues.every(function (element) {
return feature.properties[element.value];
});
}
Of course you could do exactly the same with a classic for
loop:
filter: function (feature, layer) {
for (var i = 0; i < submittedValues.length; i += 1) {
if (!feature.properties[submittedValues[i].value]) {
return false;
}
}
return true;
}
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745089138a4610582.html
评论列表(0条)