Фильтрация маркеров присваивает им новые идентификаторы

#leaflet #mapbox

#листовка #mapbox

Вопрос:

Я пытаюсь создать карту, на которой пользователь может фильтровать маркеры, используя некоторые свойства объекта GeoJSON. Фильтр работает нормально, проблема в том, что каждый раз, когда я применяю фильтр, маркерам присваиваются новые идентификаторы, как вы можете видеть в консоли при запуске следующего примера:

http://jsfiddle.net/lmartins/z8wBW/

Способ применения фильтра, по сути, таков, как описано в примерах Mapbox:

 $('.menu-ui a').on('click', function() {
    // For each filter link, get the 'data-filter' attribute value.
    var filter = $(this).data('filter');
    $(this).addClass('active').siblings().removeClass('active');

    systemLocations.setFilter(function(f) {
        // If the data-filter attribute is set to "all", return
        // all (true). Otherwise, filter on markers that have
        // a value set to true based on the filter name.
        return (filter === 'all') ? true : f.properties[filter] === true;
    });


    return false;
});
 

Пример Mapbox можно найти здесь: https://www.mapbox.com/mapbox.js/example/v1.0.0/markers-with-multiple-filters /

Каким-либо образом я могу избежать изменения идентификаторов маркеров?

Спасибо

Комментарии:

1. Простой ответ: просто не меняйте их. Как вы генерируете идентификаторы? Могут ли они быть унаследованы от данных GeoJSON?

2. Я не меняю их, это делает библиотека. Но ваш комментарий заставил меня задуматься, есть ли способ вручную назначить идентификаторы. Возможно, в этом случае они не изменились бы. Я изучу это.

3. Вы пробовали что-то вроде onEachFeature: function(f, l) { l._fid = f.id; } ? (Извините, что не прочитал ваш код в jsfiddle)

4. @IljaZverev да, мои решения в конечном итоге повторяли эту функцию, по существу перестраивая FeatureLayer всякий раз, когда фильтры меняются

Ответ №1:

Как предполагает Илья, идентификаторы листовок являются внутренней деталью — все, что имеет префикс a _ в библиотеке листовок, означает, что оно не является частью внешнего API и не является чем-то, на стабильность чего вы можете рассчитывать. Фильтрация маркеров удаляет и воссоздает слои и, таким образом, изменяет идентификаторы. Лучшим способом было бы напрямую добавлять идентификаторы в ваши данные GeoJSON и полагаться на них.

Комментарии:

1. В итоге я сделал что-то более простое, по существу перестроив FeatureLayer при обновлении фильтров. Tks.