@eliorar/angular-cesium
Version:
Angular library for working with Cesium.
98 lines • 13.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { Cartographic, Ellipsoid, SceneMode } from 'cesium';
import * as i0 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 = Ellipsoid.WGS84.cartographicToCartesian(new Cartographic(masterCameraCartographic.longitude, masterCameraCartographic.latitude, slaveMapOptions.bindZoom ? masterCameraCartographic.height : slaveCameraCartographic.height));
if (slaveMap.getCesiumViewer().scene.mode !== 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.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MapsManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
MapsManagerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MapsManagerService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: MapsManagerService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcy1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNlc2l1bS9zcmMvbGliL2FuZ3VsYXItY2VzaXVtL3NlcnZpY2VzL21hcHMtbWFuYWdlci9tYXBzLW1hbmFnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLFFBQVEsQ0FBQzs7QUFHMUQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQU03QjtRQUxRLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFFMUMseUJBQW9CLEdBQWUsRUFBRSxDQUFDO0lBRzlDLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBVztRQUNoQixJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWSxDQUFDLEVBQVUsRUFBRSxLQUFxQjtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEtBQUssZ0JB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QUFDLEtBQUs7NkJBQ3pCO3lCQUNGLENBQUMsQ0FBQztxQkFDSjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQzs7K0dBckdVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDYXJ0b2dyYXBoaWMsIEVsbGlwc29pZCwgU2NlbmVNb2RlfSBmcm9tICdjZXNpdW0nO1xuaW1wb3J0IHtBY01hcENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hYy1tYXAvYWMtbWFwLmNvbXBvbmVudCc7XG5cbi8qKlxuICogIFRoZSBzZXJ2aWNlIG1hbmFnZXMgYGFjLW1hcGAgaW5zdGFuY2VzLiBgYWMtbWFwYCByZWdpc3RlciBpdHNlbGYgdG8gdGhpcyBzZXJ2aWNlLlxuICogIFRoaXMgYWxsb3dzIHJldHJpZXZhbCBvZiBtYXBzIHByb3ZpZGVkIHNlcnZpY2VzIG91dHNpZGUgb2YgYGFjLW1hcGAgc2NvcGUuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNYXBzTWFuYWdlclNlcnZpY2Uge1xuICBwcml2YXRlIGRlZmF1bHRJZENvdW50ZXIgPSAwO1xuICBwcml2YXRlIF9NYXBzID0gbmV3IE1hcDxzdHJpbmcsIEFjTWFwQ29tcG9uZW50PigpO1xuICBwcml2YXRlIGZpcnN0TWFwOiBhbnk7XG4gIHByaXZhdGUgZXZlbnRSZW1vdmVDYWxsYmFja3M6IEZ1bmN0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIGdldE1hcChpZD86IHN0cmluZyk6IEFjTWFwQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5maXJzdE1hcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX01hcHMuZ2V0KGlkKTtcbiAgfVxuXG4gIF9yZWdpc3Rlck1hcChpZDogc3RyaW5nLCBhY01hcDogQWNNYXBDb21wb25lbnQpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5maXJzdE1hcCkge1xuICAgICAgdGhpcy5maXJzdE1hcCA9IGFjTWFwO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcElkID0gaWQgPyBpZCA6IHRoaXMuZ2VuZXJhdGVEZWZhdWx0SWQoKTtcbiAgICBpZiAodGhpcy5fTWFwcy5oYXMobWFwSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcCB3aXRoIGlkOiAke21hcElkfSBhbHJlYWR5IGV4aXN0YCk7XG4gICAgfVxuICAgIHRoaXMuX01hcHMuc2V0KG1hcElkLCBhY01hcCk7XG4gICAgcmV0dXJuIG1hcElkO1xuICB9XG5cbiAgX3JlbW92ZU1hcEJ5SWQoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9NYXBzLmRlbGV0ZShpZCk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRGVmYXVsdElkKCk6IHN0cmluZyB7XG4gICAgdGhpcy5kZWZhdWx0SWRDb3VudGVyKys7XG4gICAgcmV0dXJuICdkZWZhdWx0LW1hcC1pZC0nICsgdGhpcy5kZWZhdWx0SWRDb3VudGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIG11bHRpcGxlIDJEIG1hcCdzIGNhbWVyYXMgdG9nZXRoZXIuXG4gICAqIEBwYXJhbSBtYXBzQ29uZmlndXJhdGlvbiAtIGJpbmRpbmcgb3B0aW9ucy5cbiAgICogbWFwSWQgLSB0aGUgaWQgb2YgdGhlIG1hcHMgdG8gYmluZC5cbiAgICogc2Vuc2l0aXZpdHkgLSB0aGUgYW1vdW50IHRoZSBjYW1lcmEgcG9zaXRpb24gc2hvdWxkIGNoYW5nZSBpbiBvcmRlciB0byBzeW5jIG90aGVyIG1hcHMuXG4gICAqIGJpbmRab29tIC0gc2hvdWxkIGJpbmQgem9vbSBsZXZlbFxuICAgKi9cbiAgc3luYzJETWFwc0NhbWVyYXMobWFwc0NvbmZpZ3VyYXRpb246IHsgaWQ6IHN0cmluZzsgc2Vuc2l0aXZpdHk/OiBudW1iZXI7IGJpbmRab29tPzogYm9vbGVhbiB9W10pIHtcbiAgICBjb25zdCBERUZBVUxUX1NFTlNJVElWSVRZID0gMC4wMTtcbiAgICB0aGlzLnVuc3luY01hcHNDYW1lcmFzKCk7XG4gICAgY29uc3QgbWFwczogeyBtYXA6IEFjTWFwQ29tcG9uZW50OyBvcHRpb25zPzogeyBzZW5zaXRpdml0eT86IG51bWJlcjsgYmluZFpvb20/OiBib29sZWFuIH0gfVtdID0gbWFwc0NvbmZpZ3VyYXRpb24ubWFwKGNvbmZpZyA9PiB7XG4gICAgICBjb25zdCBtYXAgPSB0aGlzLmdldE1hcChjb25maWcuaWQpO1xuICAgICAgaWYgKCFtYXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIG1hcCB3aXRoIGlkOiAke2NvbmZpZy5pZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHttYXAsIG9wdGlvbnM6IHtzZW5zaXRpdml0eTogY29uZmlnLnNlbnNpdGl2aXR5LCBiaW5kWm9vbTogY29uZmlnLmJpbmRab29tfX07XG4gICAgfSk7XG5cbiAgICBtYXBzLmZvckVhY2gobWFzdGVyTWFwQ29uZmlnID0+IHtcbiAgICAgIGNvbnN0IG1hc3Rlck1hcCA9IG1hc3Rlck1hcENvbmZpZy5tYXA7XG4gICAgICBjb25zdCBvcHRpb25zID0gbWFzdGVyTWFwQ29uZmlnLm9wdGlvbnM7XG4gICAgICBjb25zdCBtYXN0ZXJDYW1lcmEgPSBtYXN0ZXJNYXAuZ2V0Q2FtZXJhU2VydmljZSgpLmdldENhbWVyYSgpO1xuICAgICAgY29uc3QgbWFzdGVyQ2FtZXJhQ2FydG9ncmFwaGljID0gbWFzdGVyQ2FtZXJhLnBvc2l0aW9uQ2FydG9ncmFwaGljO1xuICAgICAgbWFzdGVyQ2FtZXJhLnBlcmNlbnRhZ2VDaGFuZ2VkID0gb3B0aW9ucy5zZW5zaXRpdml0eSB8fCBERUZBVUxUX1NFTlNJVElWSVRZO1xuICAgICAgY29uc3QgcmVtb3ZlQ2FsbGJhY2sgPSBtYXN0ZXJDYW1lcmEuY2hhbmdlZC5hZGRFdmVudExpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgbWFwcy5mb3JFYWNoKHNsYXZlTWFwQ29uZmlnID0+IHtcbiAgICAgICAgICBjb25zdCBzbGF2ZU1hcCA9IHNsYXZlTWFwQ29uZmlnLm1hcDtcbiAgICAgICAgICBjb25zdCBzbGF2ZU1hcE9wdGlvbnMgPSBzbGF2ZU1hcENvbmZpZy5vcHRpb25zO1xuICAgICAgICAgIGlmIChzbGF2ZU1hcCA9PT0gbWFzdGVyTWFwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2xhdmVDYW1lcmEgPSBzbGF2ZU1hcC5nZXRDYW1lcmFTZXJ2aWNlKCkuZ2V0Q2FtZXJhKCk7XG4gICAgICAgICAgY29uc3Qgc2xhdmVDYW1lcmFDYXJ0b2dyYXBoaWMgPSBzbGF2ZUNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYztcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IEVsbGlwc29pZC5XR1M4NC5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihcbiAgICAgICAgICAgIG5ldyBDYXJ0b2dyYXBoaWMoXG4gICAgICAgICAgICAgICAgbWFzdGVyQ2FtZXJhQ2FydG9ncmFwaGljLmxvbmdpdHVkZSxcbiAgICAgICAgICAgICAgICBtYXN0ZXJDYW1lcmFDYXJ0b2dyYXBoaWMubGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgc2xhdmVNYXBPcHRpb25zLmJpbmRab29tID8gbWFzdGVyQ2FtZXJhQ2FydG9ncmFwaGljLmhlaWdodCA6IHNsYXZlQ2FtZXJhQ2FydG9ncmFwaGljLmhlaWdodClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHNsYXZlTWFwLmdldENlc2l1bVZpZXdlcigpLnNjZW5lLm1vZGUgIT09IFNjZW5lTW9kZS5NT1JQSElORykge1xuICAgICAgICAgICAgc2xhdmVDYW1lcmEuc2V0Vmlldyh7XG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgICAgICAgb3JpZW50YXRpb246IHtcbiAgICAgICAgICAgICAgICBoZWFkaW5nOiBzbGF2ZUNhbWVyYS5oZWFkaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiBzbGF2ZUNhbWVyYS5waXRjaCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRSZW1vdmVDYWxsYmFja3MucHVzaChyZW1vdmVDYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zeW5jcyBtYXBzIGNhbWVyYXNcbiAgICovXG4gIHVuc3luY01hcHNDYW1lcmFzKCkge1xuICAgIHRoaXMuZXZlbnRSZW1vdmVDYWxsYmFja3MuZm9yRWFjaChyZW1vdmVDYWxsYmFjayA9PiByZW1vdmVDYWxsYmFjaygpKTtcbiAgICB0aGlzLmV2ZW50UmVtb3ZlQ2FsbGJhY2tzID0gW107XG4gIH1cbn1cbiJdfQ==