olcs
Version:
OpenLayers Cesium integration and plugin library
152 lines • 14.5 kB
JavaScript
import { getUid } from './util.js';
import olcsAbstractSynchronizer from './AbstractSynchronizer.js';
import { tileLayerToImageryLayer, updateCesiumLayerProperties } from './core.js';
import BaseVectorLayer from 'ol/layer/BaseVector.js';
import LayerGroup from 'ol/layer/Group.js';
export default class RasterSynchronizer extends olcsAbstractSynchronizer {
cesiumLayers_;
ourLayers_;
/**
* This object takes care of one-directional synchronization of
* Openlayers raster layers to the given Cesium globe.
*/
constructor(map, scene) {
super(map, scene);
this.cesiumLayers_ = scene.imageryLayers;
this.ourLayers_ = new Cesium.ImageryLayerCollection();
}
addCesiumObject(object) {
this.cesiumLayers_.add(object);
this.ourLayers_.add(object);
}
destroyCesiumObject(object) {
object.destroy();
}
removeSingleCesiumObject(object, destroy) {
this.cesiumLayers_.remove(object, destroy);
this.ourLayers_.remove(object, false);
}
removeAllCesiumObjects(destroy) {
for (let i = 0; i < this.ourLayers_.length; ++i) {
this.cesiumLayers_.remove(this.ourLayers_.get(i), destroy);
}
this.ourLayers_.removeAll(false);
}
/**
* Creates an array of Cesium.ImageryLayer.
* May be overriden by child classes to implement custom behavior.
* The default implementation handles tiled imageries in EPSG:4326 or
* EPSG:3859.
*/
convertLayerToCesiumImageries(olLayer, viewProj) {
const result = tileLayerToImageryLayer(this.map, olLayer, viewProj);
return result ? [result] : null;
}
createSingleLayerCounterparts(olLayerWithParents) {
const olLayer = olLayerWithParents.layer;
const uid = getUid(olLayer).toString();
const viewProj = this.view.getProjection();
console.assert(!!viewProj);
const cesiumObjects = this.convertLayerToCesiumImageries(olLayer, viewProj);
if (cesiumObjects) {
const listenKeyArray = [];
[olLayerWithParents.layer].concat(olLayerWithParents.parents).forEach((olLayerItem) => {
listenKeyArray.push(olLayerItem.on(['change:opacity', 'change:visible'], () => {
// the compiler does not seem to be able to infer this
console.assert(!!cesiumObjects);
for (let i = 0; i < cesiumObjects.length; ++i) {
updateCesiumLayerProperties(olLayerWithParents, cesiumObjects[i]);
}
}));
});
if (olLayer instanceof BaseVectorLayer) {
let previousStyleFunction = olLayer.getStyleFunction();
// there is no convenient way to detect a style function change in OL
listenKeyArray.push(olLayer.on('change', () => {
const currentStyleFunction = olLayer.getStyleFunction();
if (previousStyleFunction === currentStyleFunction) {
return;
}
previousStyleFunction = currentStyleFunction;
for (let i = 0; i < cesiumObjects.length; ++i) {
const csObj = cesiumObjects[i];
// clear cache and set new style
// @ts-ignore TS2341
if (csObj._imageryCache) {
// @ts-ignore TS2341
csObj._imageryCache = {};
}
const ip = csObj.imageryProvider;
if (ip) {
// @ts-ignore TS2341
ip.tileCache?.clear();
// @ts-ignore TS2341
ip.styleFunction_ = currentStyleFunction;
}
}
this.scene.requestRender();
}));
}
for (let i = 0; i < cesiumObjects.length; ++i) {
updateCesiumLayerProperties(olLayerWithParents, cesiumObjects[i]);
}
// there is no way to modify Cesium layer extent,
// we have to recreate when OpenLayers layer extent changes:
listenKeyArray.push(olLayer.on('change:extent', (e) => {
for (let i = 0; i < cesiumObjects.length; ++i) {
this.cesiumLayers_.remove(cesiumObjects[i], true); // destroy
this.ourLayers_.remove(cesiumObjects[i], false);
}
delete this.layerMap[getUid(olLayer)]; // invalidate the map entry
this.synchronize();
}));
listenKeyArray.push(olLayer.on('change', (e) => {
// when the source changes, re-add the layer to force update
for (let i = 0; i < cesiumObjects.length; ++i) {
const position = this.cesiumLayers_.indexOf(cesiumObjects[i]);
if (position >= 0) {
this.cesiumLayers_.remove(cesiumObjects[i], false);
this.cesiumLayers_.add(cesiumObjects[i], position);
}
}
}));
this.olLayerListenKeys[uid].push(...listenKeyArray);
}
return Array.isArray(cesiumObjects) ? cesiumObjects : null;
}
/**
* Order counterparts using the same algorithm as the Openlayers renderer:
* z-index then original sequence order.
*/
orderLayers() {
const layers = [];
const zIndices = {};
const queue = [this.mapLayerGroup];
while (queue.length > 0) {
const olLayer = queue.splice(0, 1)[0];
layers.push(olLayer);
zIndices[getUid(olLayer)] = olLayer.getZIndex() || 0;
if (olLayer instanceof LayerGroup) {
const sublayers = olLayer.getLayers();
if (sublayers) {
// Prepend queue with sublayers in order
queue.unshift(...sublayers.getArray());
}
}
}
// We assume sort is stable (which has been in the spec since a long time already).
// See https://caniuse.com/mdn-javascript_builtins_array_sort_stable
layers.sort((layer1, layer2) => zIndices[getUid(layer1)] - zIndices[getUid(layer2)]);
layers.forEach((olLayer) => {
const olLayerId = getUid(olLayer).toString();
const cesiumObjects = this.layerMap[olLayerId];
if (cesiumObjects) {
cesiumObjects.forEach((cesiumObject) => { this.raiseToTop(cesiumObject); });
}
});
}
raiseToTop(counterpart) {
this.cesiumLayers_.raiseToTop(counterpart);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFzdGVyU3luY2hyb25pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29sY3MvUmFzdGVyU3luY2hyb25pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyx3QkFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQXdCLHVCQUF1QixFQUFFLDJCQUEyQixFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSXRHLE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sVUFBVSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sa0JBQW1CLFNBQVEsd0JBQXNDO0lBQzVFLGFBQWEsQ0FBeUI7SUFDdEMsVUFBVSxDQUF5QjtJQUMzQzs7O09BR0c7SUFDSCxZQUFZLEdBQVEsRUFBRSxLQUFZO1FBQ2hDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQW9CO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFvQjtRQUN0QyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELHdCQUF3QixDQUFDLE1BQW9CLEVBQUUsT0FBZ0I7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFD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