Как обновить одно свойство Geo Json Feature в MapBox и отразить его в режиме реального времени? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть MapBox JS с внедрением тысяч функций, загружаемых через Geo Json. Одно из требований - разрешить пользователям выбирать маркер и иметь возможность обновлять некоторые данные на нем. Я делаю это, обрабатывая обработчик '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 , являются ссылками на исходные функции и таким образом, его можно легко изменить, но, похоже, это не так. единственная альтернатива, которую я вижу для этого, - это запрос функций из источника, поиск исходного объекта функции, его обновление и сброс данных в источнике, но это кажется слишком большими накладными расходами.

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

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

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

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

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

  • На шаге 1 сохраните копию Geo JSON
  • На шаге 4 обновите эту копию новой информацией (ie, обновите свойства отдельной функции, к которой вы прикоснулись)
  • На шаге 5 снова вызовите map.setData().
0 голосов
/ 05 мая 2020

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

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

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

...