如何修改或删除一些现有的数据在GeoJSON传单对象

How to modify or remove some existing data in GeoJSON Leaflet object?

本文关键字:数据 单对象 GeoJSON 何修改 修改 删除      更新时间:2023-09-26

最近我询问了关于引用现有GeoJSON传单对象的数据的问题。我的传单地图由数据流传入我的GeoJSON传单对象。用户输入可以更改GeoJSON数据的过滤器,因此为了使过滤器应用于现有和新数据,我在一个名为myFeatures的数组中跟踪我的数据。每当过滤器更改或myFeatures中的项更改时,我执行以下操作:

myGeoJson.clearLayers();
myGeoJson.addData(myFeatures);

这是根据新更新的特征数据或过滤器的变化使我的地图更新。

当我初始化GeoJSON对象时,我正在应用弹出窗口到GeoJSON对象:

var myGeoJson = L.geoJson(myFeatures, {
  style: function(feature) {
    ...
  },
  pointToLayer: function(feature, latlng) {
    return L.circleMarker(latlng, geojsonMarkerOptions);
  },
  filter: function(feature, layer) {
    ...
  },
  onEachFeature: function(feature, layer) {
    if (feature.properties && feature.properties.popupContent) {
      layer.bindPopup(feature.properties.popupContent);
    }
  }
});

当我点击一个单独的功能,弹出窗口出现。然而,由于clearLayersaddData被调用,弹出窗口很快就消失了。(

在这种情况下,有什么方法可以阻止弹出窗口消失吗?

或者-更好的问题-是否有一种方法来修改GeoJSON对象中的现有数据或从GeoJSON对象中删除一些(不是全部)数据?

为了提供一些上下文,我的GeoJSON显示了每个特性的圆形标记。圆形标记根据特征的属性着色。该属性实际上可以随着时间的推移而改变,因此需要更新标记的样式。一个标记也会在一段时间后超时,需要从地图上删除,但其他标记需要留在地图上。

当然有更好的方法来做到这一点,但是如果你不想过多地修改你的代码架构,你可以在一个特定的层中创建你的弹出窗口,当你添加新数据时,你不会清除它。

给你一个想法(在你的例子中,标记在myGeoJson的作用下面):

var popup_id = {};
var popup_layer = new L.layerGroup();
var markers = new L.layerGroup();
$.each(testData, function(index, p) {
   var marker = L.marker(L.latLng(p.lat, p.lon));
   markers.addLayer(marker);
   popup = new L.popup({offset:  new L.Point(0, -30)});
   popup.setLatLng(L.latLng(p.lat, p.lon));
   popup.setContent(p.text);
   popup_id[p.id] = popup;
   marker.on('click', function() {
      popup_id[p.id].openPopup();
      popup_layer.addLayer(popup_id[p.id]);
      markers.clearLayers();
   })
});
popup_layer.addTo(map);
markers.addTo(map);

您还可以在字典popup_id中跟踪所有弹出窗口。由于您还没有为我们提供JSfiddle,因此很难为您的情况找到完美的答案,但我希望弹出层(也在我的小提琴中)给您一个好的方向。