如何引用现有GeoJSON传单对象的数据?

时间:2016-09-29 17:51:49

标签: javascript leaflet geojson

我们正在尝试使用GeoJSON构建Leaflet Map。我们的数据来自实时流,因此我们首先使用空数据初始化GeoJSON:

var myLayer = L.geoJson([], {
  style: function(feature) {
    var color = getDataband(LATENCY_BANDS, feature.properties.latency).color;

    return { 
      fillColor: color
    };
  },

  pointToLayer: function(feature, latlng) {
    return L.circleMarker(latlng, geojsonMarkerOptions);
  },

  filter: function(feature, layer) {
    var latency = feature.properties.latency;

    for (var i = 0; i < ENABLED_LATENCY_BANDS.length; i++) {
      if (ENABLED_LATENCY_BANDS[i].contains(latency)) {
        return true;
      }
    }

    return false;
  }
});

然后我们通过调用:

逐个添加数据点,因为消息来自实时流
var geojsonFeature = {
  "type": "Feature",
  "properties": {
    "latency": sample.latency
  },
  "geometry": {
    "type": "Point",
    "coordinates": [location.longitude, location.latitude]
  }
};

myLayer.addData(geojsonFeature);

但是,我们的过滤器会根据用户输入动态更改。因此,我们需要删除所有现有数据,并在用户输入更改时将所有数据重新添加到地图,以便新过滤器应用于所有现有数据和新数据。我们尝试在用户输入更改时调用以下内容:

    map.removeLayer(myLayer);
    myLayer.addTo(map);

但是,当myLayer重新添加到地图时,旧数据将被清除,只显示新数据。

我们似乎应该在调用myLayer之前重新初始化myLayer.addTo(map)对象,但我们不知道如何使用现有的要素数据重新初始化myLayer。文档没有解释如何引用GeoJSON传单对象的数据。

我们如何引用GeoJSON传单对象的数据?

感谢。

1 个答案:

答案 0 :(得分:1)

filter选项仅在实例化和使用.addData()方法时有效。此外,当一个功能被过滤掉时,它不仅仅是“隐藏”,而是未记录在内存中(即不在该组内)。

奇怪的是,如果您更改过滤条件,则删除组并将其添加回地图会消除旧数据。

无论如何,可能没有关于如何&#34;引用GeoJSON Leaflet对象数据的文档&#34;在你想要实现的意义上,因为它是依赖于实现的。

在您的情况下,您需要在隐藏的组/数组中累积您的功能,以便每当您的过滤条件发生变化时,您都可以通过新的过滤器重新评估这些功能。

例如,您可以执行以下操作:

var accumulatedFeatures = [];

// When data arrives
accumulatedFeatures.push(geojsonFeature);
myLayer.addData(geojsonFeature);

// When filter conditions change
myLayer.clearLayers(); // http://leafletjs.com/reference-1.0.0.html#layergroup-clearlayers
myLayer.addData(accumulatedFeatures); // Re-evaluate all data through new filter