Ограничения производительности в OpenLayers 4.6.5 с использованием нескольких слоев

В настоящее время я работаю над ГИС, содержащей большое количество слоев (до 20 / 30). Карта рендерит тайлы очень медленно.

Ранее он был написан для OpenLayers 2.x, и мы не столкнулись с этим узким местом производительности.

Наши слои используют WMS-источники и тайлы, которые объявлены следующим образом

function createTileLayer(options){
    let source = new ol.source.TileWMS({
        url: serverURL, // Our GeoServer instance
        params: {
            'LAYERS': options.id
            'BGCOLOR': options.backgroundColor,
            'TRANSPARENT': options.transparent,
            'VERSION': options.version,
            'FORMAT': 'image/png'
        },
        serverType: 'geoserver',
        projection: 'EPSG:2100', // Managed by Proj4J
        transition: 0
    });

    let layerTile = new ol.layer.Tile({
        source: source,
        visible: options.visible,
    });

    return layerTile;
}

Объявление карты само по себе довольно просто:

let map = new ol.Map({
        target: document.getElementById('app'),
        layers: Layers, // All the layers we created before
        view: new ol.View({
            center: ol.proj.fromLonLat([5.497853028599662, 34.82203273834541]),
            zoom: 18,
            projection: 'EPSG:2100'
        }),
        loadTilesWhileAnimating: true,
        loadTilesWhileInteracting: true,
        renderer: 'canvas'
    });
}

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

Хромированный профилирующий экран

Результаты - почти непригодная карта. Я знаю, что количество слоев велико, но проблема не была в OpenLayers 2.x (или, по крайней мере, производительность была лучше).

Один из возможных обходных путей - использовать только один источник TileWMS и передать ему список всех наших слоев в параметре "LAYERS". Это значительно повышает скорость, поскольку GeoServer выполняет всю работу по визуализации, но мы теряем некоторые возможности, такие как управление прозрачностью каждого слоя.

Я мог бы сделать что-то не так в запросе / рендеринге плиток таким образом, о котором я не знаю. Спасибо за любую помощь.

1 ответ

Наиболее вероятная проблема заключается в том, что вы не выходите за границы тайлов, которые GeoWebCache (что и использует GeoServer) для рендеринга тайлов. Смотрите эту страницу в руководстве, где перечислены критерии, которые должны быть выполнены, чтобы это работало.

Лучший способ сделать это - использовать запрос WMTS (где решетки и т. Д. Согласовываются между клиентом и сервером, а не предполагаются). Вы даже можете заставить OpenLayers провести переговоры за вас, запросив документ getCapabilities.

Другие вопросы по тегам