2013-04-22 12 views
12

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

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

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

ответ

13

Я сделал это, добавив каждый тип функции к другому 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 слой

//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); 
} 
1

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

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

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

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

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

+0

Спасибо, повторно инициализирует слой addLayer/removeLayer? – dani

+0

Я подозреваю, что вы можете также вызвать 'initialize (newgeojson, options)', но я не пробовал. Удаление и добавление будут работать точно. – flup

+0

На самом деле 'map.removeLayer (gj)' then' map.addLayer (gj) 'не работает. –

0

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

map.removeLayer(myBus); 

...add your data edit something ... 

myBus.addTo(map);