angular-cesium
Version:
Angular library for working with Cesium.
99 lines • 13.5 kB
JavaScript
import { Injectable } from '@angular/core';
/**
* The service manages `ac-map` instances. `ac-map` register itself to this service.
* This allows retrieval of maps provided services outside of `ac-map` scope.
*/
export class MapsManagerService {
constructor() {
this.defaultIdCounter = 0;
this._Maps = new Map();
this.eventRemoveCallbacks = [];
}
getMap(id) {
if (!id) {
return this.firstMap;
}
return this._Maps.get(id);
}
_registerMap(id, acMap) {
if (!this.firstMap) {
this.firstMap = acMap;
}
const mapId = id ? id : this.generateDefaultId();
if (this._Maps.has(mapId)) {
throw new Error(`Map with id: ${mapId} already exist`);
}
this._Maps.set(mapId, acMap);
return mapId;
}
_removeMapById(id) {
return this._Maps.delete(id);
}
generateDefaultId() {
this.defaultIdCounter++;
return 'default-map-id-' + this.defaultIdCounter;
}
/**
* Binds multiple 2D map's cameras together.
* @param mapsConfiguration - binding options.
* mapId - the id of the maps to bind.
* sensitivity - the amount the camera position should change in order to sync other maps.
* bindZoom - should bind zoom level
*/
sync2DMapsCameras(mapsConfiguration) {
const DEFAULT_SENSITIVITY = 0.01;
this.unsyncMapsCameras();
const maps = mapsConfiguration.map(config => {
const map = this.getMap(config.id);
if (!map) {
throw new Error(`Couldn't find map with id: ${config.id}`);
}
return { map, options: { sensitivity: config.sensitivity, bindZoom: config.bindZoom } };
});
maps.forEach(masterMapConfig => {
const masterMap = masterMapConfig.map;
const options = masterMapConfig.options;
const masterCamera = masterMap.getCameraService().getCamera();
const masterCameraCartographic = masterCamera.positionCartographic;
masterCamera.percentageChanged = options.sensitivity || DEFAULT_SENSITIVITY;
const removeCallback = masterCamera.changed.addEventListener(() => {
maps.forEach(slaveMapConfig => {
const slaveMap = slaveMapConfig.map;
const slaveMapOptions = slaveMapConfig.options;
if (slaveMap === masterMap) {
return;
}
const slaveCamera = slaveMap.getCameraService().getCamera();
const slaveCameraCartographic = slaveCamera.positionCartographic;
const position = Cesium.Ellipsoid.WGS84.cartographicToCartesian({
longitude: masterCameraCartographic.longitude,
latitude: masterCameraCartographic.latitude,
height: slaveMapOptions.bindZoom ? masterCameraCartographic.height : slaveCameraCartographic.height,
});
if (slaveMap.getCesiumViewer().scene.mode !== Cesium.SceneMode.MORPHING) {
slaveCamera.setView({
destination: position,
orientation: {
heading: slaveCamera.heading,
pitch: slaveCamera.pitch,
},
});
}
});
});
this.eventRemoveCallbacks.push(removeCallback);
});
}
/**
* Unsyncs maps cameras
*/
unsyncMapsCameras() {
this.eventRemoveCallbacks.forEach(removeCallback => removeCallback());
this.eventRemoveCallbacks = [];
}
}
MapsManagerService.decorators = [
{ type: Injectable }
];
MapsManagerService.ctorParameters = () => [];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcy1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNlc2l1bS9zcmMvbGliL2FuZ3VsYXItY2VzaXVtL3NlcnZpY2VzL21hcHMtbWFuYWdlci9tYXBzLW1hbmFnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDOzs7R0FHRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFNN0I7UUFMUSxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIsVUFBSyxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO1FBRTFDLHlCQUFvQixHQUFlLEVBQUUsQ0FBQztJQUc5QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQVc7UUFDaEIsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN0QjtRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVksQ0FBQyxFQUFVLEVBQUUsS0FBcUI7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFFRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVB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QUNGLENBQUMsQ0FBQztxQkFDSjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQzs7O1lBckdGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjTWFwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hYy1tYXAvYWMtbWFwLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogIFRoZSBzZXJ2aWNlIG1hbmFnZXMgYGFjLW1hcGAgaW5zdGFuY2VzLiBgYWMtbWFwYCByZWdpc3RlciBpdHNlbGYgdG8gdGhpcyBzZXJ2aWNlLlxyXG4gKiAgVGhpcyBhbGxvd3MgcmV0cmlldmFsIG9mIG1hcHMgcHJvdmlkZWQgc2VydmljZXMgb3V0c2lkZSBvZiBgYWMtbWFwYCBzY29wZS5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE1hcHNNYW5hZ2VyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBkZWZhdWx0SWRDb3VudGVyID0gMDtcclxuICBwcml2YXRlIF9NYXBzID0gbmV3IE1hcDxzdHJpbmcsIEFjTWFwQ29tcG9uZW50PigpO1xyXG4gIHByaXZhdGUgZmlyc3RNYXA6IGFueTtcclxuICBwcml2YXRlIGV2ZW50UmVtb3ZlQ2FsbGJhY2tzOiBGdW5jdGlvbltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgZ2V0TWFwKGlkPzogc3RyaW5nKTogQWNNYXBDb21wb25lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5maXJzdE1hcDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9NYXBzLmdldChpZCk7XHJcbiAgfVxyXG5cclxuICBfcmVnaXN0ZXJNYXAoaWQ6IHN0cmluZywgYWNNYXA6IEFjTWFwQ29tcG9uZW50KTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5maXJzdE1hcCkge1xyXG4gICAgICB0aGlzLmZpcnN0TWFwID0gYWNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWFwSWQgPSBpZCA/IGlkIDogdGhpcy5nZW5lcmF0ZURlZmF1bHRJZCgpO1xyXG4gICAgaWYgKHRoaXMuX01hcHMuaGFzKG1hcElkKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCB3aXRoIGlkOiAke21hcElkfSBhbHJlYWR5IGV4aXN0YCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9NYXBzLnNldChtYXBJZCwgYWNNYXApO1xyXG4gICAgcmV0dXJuIG1hcElkO1xyXG4gIH1cclxuXHJcbiAgX3JlbW92ZU1hcEJ5SWQoaWQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuX01hcHMuZGVsZXRlKGlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVEZWZhdWx0SWQoKTogc3RyaW5nIHtcclxuICAgIHRoaXMuZGVmYXVsdElkQ291bnRlcisrO1xyXG4gICAgcmV0dXJuICdkZWZhdWx0LW1hcC1pZC0nICsgdGhpcy5kZWZhdWx0SWRDb3VudGVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmluZHMgbXVsdGlwbGUgMkQgbWFwJ3MgY2FtZXJhcyB0b2dldGhlci5cclxuICAgKiBAcGFyYW0gbWFwc0NvbmZpZ3VyYXRpb24gLSBiaW5kaW5nIG9wdGlvbnMuXHJcbiAgICogbWFwSWQgLSB0aGUgaWQgb2YgdGhlIG1hcHMgdG8gYmluZC5cclxuICAgKiBzZW5zaXRpdml0eSAtIHRoZSBhbW91bnQgdGhlIGNhbWVyYSBwb3NpdGlvbiBzaG91bGQgY2hhbmdlIGluIG9yZGVyIHRvIHN5bmMgb3RoZXIgbWFwcy5cclxuICAgKiBiaW5kWm9vbSAtIHNob3VsZCBiaW5kIHpvb20gbGV2ZWxcclxuICAgKi9cclxuICBzeW5jMkRNYXBzQ2FtZXJhcyhtYXBzQ29uZmlndXJhdGlvbjogeyBpZDogc3RyaW5nOyBzZW5zaXRpdml0eT86IG51bWJlcjsgYmluZFpvb20/OiBib29sZWFuIH1bXSkge1xyXG4gICAgY29uc3QgREVGQVVMVF9TRU5TSVRJVklUWSA9IDAuMDE7XHJcbiAgICB0aGlzLnVuc3luY01hcHNDYW1lcmFzKCk7XHJcbiAgICBjb25zdCBtYXBzOiB7IG1hcDogQWNNYXBDb21wb25lbnQ7IG9wdGlvbnM/OiB7IHNlbnNpdGl2aXR5PzogbnVtYmVyOyBiaW5kWm9vbT86IGJvb2xlYW4gfSB9W10gPSBtYXBzQ29uZmlndXJhdGlvbi5tYXAoY29uZmlnID0+IHtcclxuICAgICAgY29uc3QgbWFwID0gdGhpcy5nZXRNYXAoY29uZmlnLmlkKTtcclxuICAgICAgaWYgKCFtYXApIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgbWFwIHdpdGggaWQ6ICR7Y29uZmlnLmlkfWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4ge21hcCwgb3B0aW9uczoge3NlbnNpdGl2aXR5OiBjb25maWcuc2Vuc2l0aXZpdHksIGJpbmRab29tOiBjb25maWcuYmluZFpvb219fTtcclxuICAgIH0pO1xyXG5cclxuICAgIG1hcHMuZm9yRWFjaChtYXN0ZXJNYXBDb25maWcgPT4ge1xyXG4gICAgICBjb25zdCBtYXN0ZXJNYXAgPSBtYXN0ZXJNYXBDb25maWcubWFwO1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gbWFzdGVyTWFwQ29uZmlnLm9wdGlvbnM7XHJcbiAgICAgIGNvbnN0IG1hc3RlckNhbWVyYSA9IG1hc3Rlck1hcC5nZXRDYW1lcmFTZXJ2aWNlKCkuZ2V0Q2FtZXJhKCk7XHJcbiAgICAgIGNvbnN0IG1hc3RlckNhbWVyYUNhcnRvZ3JhcGhpYyA9IG1hc3RlckNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYztcclxuICAgICAgbWFzdGVyQ2FtZXJhLnBlcmNlbnRhZ2VDaGFuZ2VkID0gb3B0aW9ucy5zZW5zaXRpdml0eSB8fCBERUZBVUxUX1NFTlNJVElWSVRZO1xyXG4gICAgICBjb25zdCByZW1vdmVDYWxsYmFjayA9IG1hc3RlckNhbWVyYS5jaGFuZ2VkLmFkZEV2ZW50TGlzdGVuZXIoKCkgPT4ge1xyXG4gICAgICAgIG1hcHMuZm9yRWFjaChzbGF2ZU1hcENvbmZpZyA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzbGF2ZU1hcCA9IHNsYXZlTWFwQ29uZmlnLm1hcDtcclxuICAgICAgICAgIGNvbnN0IHNsYXZlTWFwT3B0aW9ucyA9IHNsYXZlTWFwQ29uZmlnLm9wdGlvbnM7XHJcbiAgICAgICAgICBpZiAoc2xhdmVNYXAgPT09IG1hc3Rlck1hcCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3Qgc2xhdmVDYW1lcmEgPSBzbGF2ZU1hcC5nZXRDYW1lcmFTZXJ2aWNlKCkuZ2V0Q2FtZXJhKCk7XHJcbiAgICAgICAgICBjb25zdCBzbGF2ZUNhbWVyYUNhcnRvZ3JhcGhpYyA9IHNsYXZlQ2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljO1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBDZXNpdW0uRWxsaXBzb2lkLldHUzg0LmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKHtcclxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBtYXN0ZXJDYW1lcmFDYXJ0b2dyYXBoaWMubG9uZ2l0dWRlLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogbWFzdGVyQ2FtZXJhQ2FydG9ncmFwaGljLmxhdGl0dWRlLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHNsYXZlTWFwT3B0aW9ucy5iaW5kWm9vbSA/IG1hc3RlckNhbWVyYUNhcnRvZ3JhcGhpYy5oZWlnaHQgOiBzbGF2ZUNhbWVyYUNhcnRvZ3JhcGhpYy5oZWlnaHQsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoc2xhdmVNYXAuZ2V0Q2VzaXVtVmlld2VyKCkuc2NlbmUubW9kZSAhPT0gQ2VzaXVtLlNjZW5lTW9kZS5NT1JQSElORykge1xyXG4gICAgICAgICAgICBzbGF2ZUNhbWVyYS5zZXRWaWV3KHtcclxuICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogcG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgb3JpZW50YXRpb246IHtcclxuICAgICAgICAgICAgICAgIGhlYWRpbmc6IHNsYXZlQ2FtZXJhLmhlYWRpbmcsXHJcbiAgICAgICAgICAgICAgICBwaXRjaDogc2xhdmVDYW1lcmEucGl0Y2gsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmV2ZW50UmVtb3ZlQ2FsbGJhY2tzLnB1c2gocmVtb3ZlQ2FsbGJhY2spO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVbnN5bmNzIG1hcHMgY2FtZXJhc1xyXG4gICAqL1xyXG4gIHVuc3luY01hcHNDYW1lcmFzKCkge1xyXG4gICAgdGhpcy5ldmVudFJlbW92ZUNhbGxiYWNrcy5mb3JFYWNoKHJlbW92ZUNhbGxiYWNrID0+IHJlbW92ZUNhbGxiYWNrKCkpO1xyXG4gICAgdGhpcy5ldmVudFJlbW92ZUNhbGxiYWNrcyA9IFtdO1xyXG4gIH1cclxufVxyXG4iXX0=