Как обновить отдельное свойство GeoJson Feature в MapBox и отразить его в реальном времени?

У меня есть внедрение MapBox JS с тысячами функций, загружаемых через GeoJson. Одно из требований - разрешить пользователям выбирать маркер и иметь возможность обновлять некоторые данные на нем. Я делаю это, обрабатывая обработчик 'click' и показывая окно, которое позволяет вводить некоторые новые данные, и кнопку обновления, которая вызывает сервер и возвращает ответ. Простой сценарий.

Однако при изменении значения свойства в обратном вызове новые данные не отображаются при следующем щелчке. У меня есть следующий пример, демонстрирующий упрощенную версию моего процесса. обновление происходит в строке №160.

        // When a click event occurs on a feature open a popup at the
        // location of the feature, which allows upadting
        map.on('click', 'places', function(e) {
            var coordinates = e.features[0].geometry.coordinates.slice();
            var description = e.features[0].properties.description;

            // Ensure that if the map is zoomed out such that multiple
            // copies of the feature are visible, the popup appears
            // over the copy being pointed to.
            while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
                coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
            }


            new mapboxgl.Popup()
                .setLngLat(coordinates)
                .setHTML(description)
                .addTo(map);

            // change the description value. this is only a POC. 
            // real applications will update data on a server and only then update the description.
            // is this a copy or a reference to the feature?!?
            e.features[0].properties.description = "my new description"; // update happens here - #160
        });

Я предполагал, что функции, возвращаемые обработчиком click в разделе e.features, являются ссылками на исходные функции и, таким образом, могут быть легко изменены, но, похоже, это не так. единственная альтернатива, которую я вижу для этого, - это запрос функций из источника, поиск исходного объекта функции, его обновление и сброс данных в источнике, но это кажется слишком большими накладными расходами.

Какой здесь правильный подход?


person kob490    schedule 05.05.2020    source источник


Ответы (2)


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

Это и другие демонстрации полностью повторно setData при каждом новом (или, в вашем случае , обновлено).

Вы уже испытываете замедление / рывки из-за перезагрузки данных или только собираетесь внедрить?

person Joe Sorocin    schedule 05.05.2020
comment
собираюсь реализовать. Кажется, тогда нет никакого способа выполнить операцию map.getSource (). setData () для всех данных. Я попытаюсь реализовать, но задаюсь вопросом, как он выдержит действительно тяжелые наборы данных. - person kob490; 05.05.2020

Если я правильно понимаю, ваш рабочий процесс:

  1. Загрузить GeoJSON с сервера
  2. Добавить GeoJSON на карту
  3. Пользователь вызывает обновление на сервере
  4. Загрузить частичный GeoJSON с сервера?
  5. ...что-то...
  6. Карта теперь отображает самую последнюю версию GeoJSON

У вас есть несколько альтернатив для шага 5.

Самый простой:

  • На шаге 1 сохраните копию GeoJSON
  • На шаге 4 обновите эту копию новой информацией (т. Е. Обновите свойства отдельного объекта, к которому вы прикоснулись).
  • На шаге 5 снова вызовите map.setData().
person Steve Bennett    schedule 05.05.2020