Leaflet: Update GeoJson filter?

后端 未结 3 1794
北海茫月
北海茫月 2020-12-28 16:53

I would like to populate a GeoJson layer with data and then dynamically filter what features to show.

I have gotten the filter function to work but I do not know how

相关标签:
3条回答
  • 2020-12-28 17:05

    In the GeoJSON addData method, the first check is if the data is a collection of features, in which case the method gets called for each feature.

    Then the filter is applied as follows:

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

    So if the filter filters out the data when you add it, it does not get stored or remembered anywhere. Changing the filter won't make the data suddenly reappear.

    You can keep a reference to the geojson and re-initialize the layer when you change the filter.

    0 讨论(0)
  • 2020-12-28 17:11

    I did this by adding each feature type to a different LayerGroup based on a property of the feature. e.g.

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

    Create the 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);      
    }
    

    Then you can call the Leaflet map.addLayer/removeLayer functions e.g.

    //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);   
    }
    
    0 讨论(0)
  • 2020-12-28 17:19

    See example below, you have a map and a myBus layer.

    map.removeLayer(myBus);
    
    ...add your data edit something ...
    
    myBus.addTo(map);
    
    0 讨论(0)
提交回复
热议问题