кластеризация openlayers очень медленная с постоянно меняющимися позициями - PullRequest
1 голос
/ 07 января 2020

при использовании clusterSource в openlayers (5/6) я могу красиво кластеризовать объекты.

За исключением vectorsource, который является источником моего кластерного источника, данные постоянно меняются. У меня есть веб-розетки, которые снабжают меня информацией о местонахождении вещей (например, корабли в Маринетрафи c или самолеты на Flightradar24). У меня было ощущение, что с каждым изменением основного источника моя кластеризация выполняется повсеместно. Есть ли способ отправить это обновление по телефону? или вызвать его вручную?

Я могу буферизовать входной поток и обрабатывать большее количество сообщений одновременно (например, 1000 обновлений позиции каждые 3 секунды). И я хочу, чтобы кластеризация происходила ПОСЛЕ того, как я обработал эти 1000 сообщений. Теперь он становится настолько медленным, что я чувствую, что это происходит при каждом сообщении (так, 1000 раз каждые 3 секунды)

Другая оптимальная опция - кластеризация только тех элементов, которые в данный момент видны (с буфером по краям сторона расстояния кластера) Это, по моему мнению, сэкономило бы много вычислений.

Кто-нибудь здесь может мне помочь?

прямо сейчас я получил что-то вроде этого (в мета-коде):

const features = {};  //my own reference collection
const buffer = [];  //it's get filled somewhere else (constantly)

function processBuffer() {

  //here we like to pause the clustering logic

  buffer.forEach(function(message){
    let feature = features[message.id];

    if (feature) {
      //existing feature
      feature.getGeometry().setCoordinates(message.coord);
    } else {
      //new feature
      feature = ... create feature ...
      vectorSource.addFeature(feature);
    }
  });

  //here we like to continue the clustering logic

  //reset buffer
  buffer.length = 0;
}

setInterval(processBuffer, 3000);

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Замена всех функций в источнике через массив с использованием .clear() и .addFeatures() должна быть намного более эффективной.

0 голосов
/ 08 января 2020

Если у вас слишком много данных, вы не должны показывать их все.

  • Использовать минимальное и максимальное разрешение для векторного слоя
  • Не отправлять данные с сервера, который вы не можете показать им в вашем мгновенном bbox.
0 голосов
/ 07 января 2020

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

Есть также несколько советов, которые можно сделать для повышения производительности, хотя кластеризация не является явным.

Я предлагаю измерить время выполнения l oop, если это займет много времени, карта может на самом деле не будут отображаться достаточно часто и, следовательно, чувствовать себя не отвечающими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...