2013-04-22 6 views
12

Ich möchte eine GeoJson-Ebene mit Daten füllen und dann dynamisch filtern, welche Features angezeigt werden sollen.Broschüre: GeoJson-Filter aktualisieren?

Ich habe die Filterfunktion zu arbeiten, aber ich weiß nicht, wie Sie den Filter ändern und dann die Schicht aktualisieren.

Gibt es eine Möglichkeit, den Filter zu aktualisieren, nachdem ich die Daten hinzugefügt habe?

Antwort

13

Ich tat dies, indem ich jeden Feature-Typ basierend auf einer Eigenschaft des Features zu einem anderen LayerGroup hinzufügte. z.B.

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] 
    } 
    } 
]; 

Erstellen Sie die GeoJSON Schicht

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

Dann können Sie die map.addLayer/removeLayer Funktionen Leaflet rufen z.B.

//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

In der GeoJSONaddData Methode wird zuerst überprüft, ob die Daten eine Sammlung von Features sind. In diesem Fall wird die Methode für jedes Feature aufgerufen.

Dann wird der Filter angewendet wie folgt:

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

Also, wenn der Filter die Daten herausfiltert, wenn Sie es hinzufügen, wird es nicht überall gespeichert oder in Erinnerung erhalten. Durch das Ändern des Filters werden die Daten nicht plötzlich wieder angezeigt.

Sie können einen Verweis auf den Geojson beibehalten und die Ebene neu initialisieren, wenn Sie den Filter ändern.

+0

Danke, reinitialisiert Schicht bedeuten addLayer/removeLayer? – dani

+0

Ich vermute, Sie können 'initialize (newgeojson, options)' auch aufrufen, aber ich habe es nicht ausprobiert. Entfernen und Hinzufügen wird mit Sicherheit funktionieren. – flup

+0

Eigentlich 'map.removeLayer (gj)' dann 'map.addLayer (gj)' funktioniert nicht. –

0

Siehe Beispiel unten, Sie haben eine Karte und eine myBus-Schicht.

map.removeLayer(myBus); 

...add your data edit something ... 

myBus.addTo(map);