Как повысить скорость загрузки большого редактируемого слоя с помощью OpenLayers?

Я столкнулся с проблемой производительности при быстрой загрузке слоя. Я работаю с OpenLayers 5.3, GeoServer 2.10 и базой данных Oracle 12. У меня есть несколько (3-4) слоев WMS для информации и фона, а также слой WFS, который можно редактировать. Последний имеет более 30000 полилиний и загружается медленно.

Итак, я искал какие-то решения и хотел получить несколько советов:

  • Сначала я попытался изменить свой слой WFS в мозаичной версии, но мне не удалось заставить его работать, или образцы, которые я обнаружил, были недостаточно точными
  • Затем я попытался изменить свой слой WFS в мозаичной версии WMS. Мне удалось заставить его работать, но я заметил, что загрузка этого типа слоя не была более быстрой, а также что метки дублируются в каждой сгенерированной плитке. В решениях, которые я нашел, сказано, что я должен использовать простой слой WMS, чтобы обойти эту проблему ... Ну, хорошо.
  • Я начал несколько тестов с WMTS, но понял, что мой слой будет часто меняться, поэтому я не могу работать с уже созданными тайлами.

Наконец, я думаю, что лучший способ - работать с простым слоем WMS и переключать только необходимые полилинии в объектах на слое WFS, когда мне нужно их редактировать. Но я должен фильтровать данные слоя WMS. Я обнаружил, что это возможно с помощью фильтра CQL в параметрах. Он работает, но размер фильтра ограничен из-за запроса GET. Итак, я нашел образец для изменения запроса в POST. Это снова работает, но на этот раз я заметил, что создание слоя становится очень медленным в зависимости от количества элементов в моем предложении WHERE «ID in (1,2,3,4 ... 999,1000,1001 ...)» .

Вот где я сейчас нахожусь, и я ожидал: как лучше всего решить мою «проблему»?

Прямо сейчас я пытаюсь упростить фильтр CQL, добавив больше столбцов в слой, чтобы создать фильтры лучше, чем простой «ID в (...)», и продолжу следующим образом: заменив мой слой WFS на слой WMS и добавив какой-то специальный код, чтобы управлять им так, как я хочу.

Если у кого-то есть предложение получше для моей ситуации, я все слышу :-)

С наилучшими пожеланиями.


person JCB    schedule 07.03.2019    source источник


Ответы (2)


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

Предположим, у меня есть набор функций markers

var markers = [];

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

var vectorSource = new ol.source.Vector({
    features: markers
});
var vectorLayer = new ol.layer.Vector({
   source: vectorSource
});

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

var vectorSource = new ol.source.Vector();
var vectorLayer = new ol.layer.Vector({
   source: vectorSource
});
 // Add each marker individually
 markers.forEach(function (feature) {
     vectorSource.addFeature(feature);
 });

Возможно, вы можете применить аналогичное решение, но с ломаными линиями вместо точек.

person GiuServ    schedule 08.03.2019

Раньше я показывал плитки WMS, а когда пользователь щелкал «строку», извлекал соответствующую информацию в браузер, рисовал полученную геометрию в виде наложения и редактировал все, что необходимо.

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

Кроме того, возможности визуализации Geoserver для WMS намного мощнее, чем то, что встроено в OpenLayers.

Конечно, существует задержка между обновлением базового WMS, потому что вы отправите обновление на сервер, и только после вы получите подтверждение, вы можете начать обновление слоя WMS (иначе ваше изменение возможно, еще не были обработаны, и обновление просто вернет вам старое состояние). Поэтому вам, возможно, придется придумать что-нибудь, чтобы указать пользователю, что визуальное обновление ожидает после отправки обновления.

person Wouter van Nifterick    schedule 07.03.2019