J'utilise Leaflet.js pour une carte. Maintenant, je veux supprimer les couches ajoutées de la carte. En cliquant sur le bouton d'entrée #, toutes les cases à cocher cochées doivent être remplacées par des cases non cochées et toutes les couches correspondantes doivent être supprimées de la carte.
Pour supprimer une couche de la carte, l'identifiant de la couche est nécessaire. Cet identifiant est égal à l'identifiant de la case à cocher correspondante. C'est pourquoi j'utilise jQuery pour obtenir les identifiants de toutes les cases à cocher cochées et stocker leur valeur dans un objet, appelé ici someObj.idsChecked.
Quand j'essaie d'utiliser la valeur stockée val pour supprimer une couche, il ne fonctionne pas alors que le console.log affiche la valeur recherchée. Ici par exemple: mapcat52.
En insérant l’id précédent codé en dur dans la fonction comme map.removeLayer (mapcat52) cela fonctionne comme prévu.
Où est l'erreur dans mon code ou dans mes pensées?
Toute aide est très appréciée.
Le HTML
<input type="button" id="selectnone" value="deselect all" />
<!-- checkboxes -->
<input id="mapcat52" type="checkbox" name="maplayer" class="maplayer">
<label for="mapcat52">Map Layer One</label>
<input id="mapcat53" type="checkbox" name="maplayer" class="maplayer">
<label for="mapcat53">Map Layer Two</label>
...
Le JS:
$('#selectnone').click(function() {
var someObj = {};
someObj.idsChecked = [];
$("input:checkbox").each(function() {
if ($(this).is(":checked")) {
someObj.idsChecked.Push($(this).attr("id"));
}
}).attr('checked', false);
$.each(someObj.idsChecked,function(id, val) {
// displays the wanted value, e.g. "mapcat52" if checkbox with this id is checked
console.log(val);
// does not work: inserted value
map.removeLayer(val);
// works: hard coded value of the leaflet.js/input id
map.removeLayer(mapcat52);
});
});
Selon l'API Leaflet, doc http://leafletjs.com/reference.html#map-removelayer , removeLayer prend un paramètre ILayer: removeLayer( <ILayer> layer )
mais vous lui transmettez une chaîne: $(this).attr("id")
Il semble que vous ayez déjà l’objet calque dans une variable: mapcat52. Vous pouvez enregistrer les objets de calque lorsque vous les créez, puis les rechercher par ID pour les transmettre à removeLayer:
var layers = new Array();
// create layer
var mapcat52 = new MyCustomLayer(latlng);
// save to layers list
layers["mapcat52"] = mapcat52;
...
// remove layers
$.each(someObj.idsChecked, function(id, val) {
// look up layer object by id
var layerObj = layers[val];
// remove layer
map.removeLayer(layerObj);
});
Je dirais que la meilleure façon de supprimer/ajouter (basculer) des couches de la carte serait d’utiliser un LayerGroup .
Avant d'ajouter des couches individuelles à la carte, ajoutez-les plutôt à un groupe de couches, puis ajoutez ce groupe de couches à votre carte.
Ensuite, lorsque vous devez supprimer les couches, appelez simplement la fonction clearLayers ().
Découvrez l'API pour LayerGroup http://leafletjs.com/reference.html#layergroup
Exemple
var map = L.map('leafletMap', {minZoom:11}).setView([37.8, -96], 11);
var assetLayerGroup = new L.LayerGroup();
var marker1 = L.marker([39.61, -105.02]).bindPopup('This is Littleton, CO.');
var marker2 = L.marker([39.74, -104.99]).bindPopup('This is Denver, CO.'),
assetLayerGroup.addLayer(marker1);
assetLayerGroup.addLayer(marker2);
Lorsque la case à cocher est cochée
assetLayerGroup.clearLayers();
J'ai écrit l'exemple ci-dessous pour montrer comment supprimer plusieurs couches de geoJSON.
/// ajout de données geoJSON
var myGeoJSON = L.geoJSON(myData, {
onEachFeature: function (feature, layer) {
layer.myTag = "myGeoJSON"
}
});
////// fonction pour supprimer les couches geoJSON
var removeMarkers = function() {
map.eachLayer( function(layer) {
if ( layer.myTag && layer.myTag === "myGeoJSON") {
map.removeLayer(layer)
}
});
}
//// fonction appelante
removeMarkers ();