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

How to reference the data of an existing GeoJSON leaflet object?

本文关键字:GeoJSON 单对象 数据 何引用 引用      更新时间:2023-09-26

我们有一个传单地图,我们正在尝试使用GeoJSON构建。我们的数据来自实时流,因此我们首先使用空数据初始化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被重新添加到map中时,旧的数据被清除,只出现新的数据。

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

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

谢谢。

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

奇怪的是,你的旧数据是通过删除组并将其添加回映射来清除的,无论你是否更改了过滤条件。

无论如何,在你试图实现的意义上,可能没有关于如何"引用GeoJSON传单对象的数据"的文档,因为它依赖于实现。

在你的例子中,你需要在一个隐藏的组/数组中积累你的特征,这样当你的过滤器条件改变时,你可以通过新的过滤器重新评估这些特征。

例如,可以这样做:

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