Листовка: обновите фильтр GeoJson?

Я хотел бы заполнить слой GeoJson данными и затем динамически фильтровать, какие функции показывать.

Я получил функцию фильтра, но я не знаю, как изменить фильтр, а затем обновить слой.

Есть ли способ обновить фильтр после добавления данных?

Ответ 1

Я сделал это, добавив каждый тип функции в другую LayerGroup на основе свойства этой функции. например.

GeoJSON

var data =[
  {
   type: "Feature",
   properties: {
      type: "type1"
   },
   geometry: {
      type: "Point",
      coordinates: [-1.252,52.107]
   }
  },
  {
   type: "Feature",
   properties: {
      type: "type2"
   },
   geometry: {
      type: "Point",
      coordinates: [-2.252,54.107]
   }
  }
];

Создайте GeoJSON Layer

//array to store layers for each feature type
var mapLayerGroups = [];

//draw GEOJSON - don't add the GEOJSON layer to the map here
L.geoJson(data, {onEachFeature: onEachFeature})//.addTo(map);

/*
 *for all features create a layerGroup for each feature type and add the feature to the    layerGroup
*/
function onEachFeature(feature, featureLayer) {

    //does layerGroup already exist? if not create it and add to map
    var lg = mapLayerGroups[feature.properties.type];

    if (lg === undefined) {
        lg = new L.layerGroup();
        //add the layer to the map
        lg.addTo(map);
        //store layer
        mapLayerGroups[feature.properties.type] = lg;
    }

    //add the feature to the layer
    lg.addLayer(featureLayer);      
}

Затем вы можете вызвать функции map.addLayer/removeLayer, например.

//Show layerGroup with feature of "type1"
showLayer("type1");

/*
* show/hide layerGroup   
*/
function showLayer(id) {
    var lg = mapLayerGroups[id];
    map.addLayer(lg);   
}
function hideLayer(id) {
    var lg = mapLayerGroups[id];
    map.removeLayer(lg);   
}

Ответ 2

В методе GeoJSON addData первая проверка заключается в том, что данные представляют собой набор функций, и в этом случае метод получает вызов для каждой функции.

Затем фильтр применяется следующим образом:

var options = this.options;
if (options.filter && !options.filter(geojson)) { return; }

Итак, если фильтр отфильтровывает данные при его добавлении, он не сохраняется и не запоминается нигде. Изменение фильтра не приведет к внезапному появлению данных.

Вы можете сохранить ссылку на geojson и повторно инициализировать слой при изменении фильтра.

Ответ 3

См. пример ниже, у вас есть карта и слой myBus.

map.removeLayer(myBus);

...add your data edit something ...

myBus.addTo(map);