2016-10-05 6 views
0

Недавно я спросил около referencing the data of an existing GeoJSON Leaflet object. Моя карта Leaflet состоит из данных, поступающих в поток к моему объекту GeoJSON Leaflet. Входы пользователя могут изменять фильтр для данных GeoJSON, поэтому чтобы фильтр применялся как к существующим, так и к новым данным, я отслеживаю свои данные в массиве с именем myFeatures. Всякий раз, когда фильтры изменить или элемент в myFeatures изменений, я делаю следующее:Как изменить или удалить некоторые существующие данные в объекте GeoJSON Leaflet?

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

Когда я нажимаю на индивидуальной функции, появляется всплывающее окно. Тем не менее, всплывающее окно довольно быстро уходит, благодаря вызову clearLayers и addData. :(

Есть ли какое-то способ остановить всплывающий отклоняя в этой ситуации

Или - лучше спросить - есть ли способ изменения существующих данных в объекте GeoJSON или удалить некоторые (не все) данных от объекта GeoJSON?

Для того чтобы обеспечить некоторый контекст, мой GeoJSON показывает маркеры окружности для каждой функции. Маркеры круга окрашены в зависимости от свойства этой функции. Свойство может меняться с течением времени, поэтому стиль маркера должен быть обновлен. Маркер также истекает через некоторое время и должен быть удален с карты, но другие маркеры должны оставаться на карте.

ответ

1

Есть, конечно, лучшие способы сделать это, но если вы не хотите слишком сильно модифицировать свою архитектуру кода, вы можете просто создать свои всплывающие окна на определенном уровне, который вы не очистите при добавлении новых данных ,

Чтобы дать Вам идею (маркеры играют ниже роли 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, вам сложно найти идеальный ответ для вашего дела, но я надеюсь, что всплывающий слой (также here in my fiddle) даст вам хорошее направление.

+0

Ваш отдельный слой для всплывающих окон. Благодарю. Но мне любопытно, каковы «лучшие способы сделать это»? – carmenism