UNPKG

angular-cesium

Version:
110 lines 17.4 kB
import { BasicDrawerService } from '../basic-drawer/basic-drawer.service'; import { GraphicsType } from './enums/graphics-type.enum'; import { OptimizedEntityCollection } from './optimized-entity-collection'; /** * General primitives drawer responsible of drawing Cesium primitives. * Drawers the handle Cesium primitives extend it. */ export class EntitiesDrawerService extends BasicDrawerService { constructor(cesiumService, graphicsType, defaultOptions = { collectionMaxSize: -1, collectionSuspensionTime: -1, collectionsNumber: 1, }) { super(); this.cesiumService = cesiumService; this.graphicsType = graphicsType; this.defaultOptions = defaultOptions; this.entityCollections = new Map(); this.graphicsTypeName = GraphicsType[this.graphicsType]; // Fix bad enum compilation for (const i in GraphicsType) { if (GraphicsType[i] === this.graphicsType) { this.graphicsTypeName = i; } } } getFreeEntitiesCollection() { let freeEntityCollection = null; this.entityCollections.forEach(entityCollection => { if (entityCollection.isFree()) { freeEntityCollection = entityCollection; } }); return freeEntityCollection; } init(options) { const finalOptions = options || this.defaultOptions; const dataSources = []; for (let i = 0; i < finalOptions.collectionsNumber; i++) { const dataSource = new Cesium.CustomDataSource(this.graphicsTypeName); dataSources.push(dataSource); this.cesiumService.getViewer().dataSources.add(dataSource); this.entityCollections.set(dataSource.entities, new OptimizedEntityCollection(dataSource.entities, finalOptions.collectionMaxSize, finalOptions.collectionSuspensionTime)); } return dataSources; } add(cesiumProps) { const optimizedEntityCollection = this.getFreeEntitiesCollection(); if (optimizedEntityCollection === null) { throw new Error('No more free entity collections'); } const entityObject = { position: cesiumProps.position !== undefined ? cesiumProps.position : undefined, description: cesiumProps.description !== undefined ? cesiumProps.description : undefined, orientation: cesiumProps.orientation !== undefined ? cesiumProps.orientation : undefined, viewFrom: cesiumProps.viewFrom !== undefined ? cesiumProps.viewFrom : undefined, [this.graphicsTypeName]: cesiumProps, }; if (cesiumProps.name !== undefined) { entityObject.name = cesiumProps.name; } if (cesiumProps.availability !== undefined) { entityObject.availability = cesiumProps.availability; } return optimizedEntityCollection.add(entityObject); } update(entity, cesiumProps) { this.suspendEntityCollection(entity); if (entity.position instanceof Cesium.CallbackProperty) { if (entity.position._isConstant) { entity.position = cesiumProps.position; } } entity.position = cesiumProps.position !== undefined ? cesiumProps.position : undefined; entity.name = cesiumProps.name !== undefined ? cesiumProps.name : entity.name; entity.description = cesiumProps.description !== undefined ? cesiumProps.description : entity.description; entity.orientation = cesiumProps.orientation !== undefined ? cesiumProps.orientation : entity.orientation; entity.viewFrom = cesiumProps.viewFrom !== undefined ? cesiumProps.viewFrom : entity.viewFrom; entity.availability = cesiumProps.availability !== undefined ? cesiumProps.availability : cesiumProps.availability; if (this._propsAssigner) { this._propsAssigner(entity[this.graphicsTypeName], cesiumProps); } else { Object.assign(entity[this.graphicsTypeName], cesiumProps); } } remove(entity) { const optimizedEntityCollection = this.entityCollections.get(entity.entityCollection); optimizedEntityCollection.remove(entity); } removeAll() { this.entityCollections.forEach(entityCollection => { entityCollection.removeAll(); }); } setShow(showValue) { this.entityCollections.forEach(entityCollection => { entityCollection.setShow(showValue); }); } suspendEntityCollection(entity) { const id = entity.entityCollection; if (!this.entityCollections.has(id)) { throw new Error('No EntityCollection for entity.entityCollection'); } const entityCollection = this.entityCollections.get(id); entityCollection.suspend(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMtZHJhd2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWNlc2l1bS8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWNlc2l1bS9zZXJ2aWNlcy9kcmF3ZXJzL2VudGl0aWVzLWRyYXdlci9lbnRpdGllcy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUU7OztHQUdHO0FBRUgsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGtCQUFrQjtJQUkzRCxZQUNVLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGlCQUF3QztRQUM5QyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDckIsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLGlCQUFpQixFQUFFLENBQUM7S0FDckI7UUFFRCxLQUFLLEVBQUUsQ0FBQztRQVJBLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG1CQUFjLEdBQWQsY0FBYyxDQUlyQjtRQVZLLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO1FBYXBFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXhELDJCQUEyQjtRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFlBQVksRUFBRTtZQUM1QixJQUFJLFlBQVksQ0FBQyxDQUFDLENBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7SUFDSCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksb0JB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QUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQVc7UUFDaEIsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUNoRCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsU0FBa0I7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ2hELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxNQUFXO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7U0FDcEU7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzaWNEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYmFzaWMtZHJhd2VyL2Jhc2ljLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IENlc2l1bVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jZXNpdW0vY2VzaXVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JhcGhpY3NUeXBlIH0gZnJvbSAnLi9lbnVtcy9ncmFwaGljcy10eXBlLmVudW0nO1xuaW1wb3J0IHsgRW50aXRpZXNEcmF3ZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2VudGl0aWVzLWRyYXdlci1vcHRpb25zJztcbmltcG9ydCB7IE9wdGltaXplZEVudGl0eUNvbGxlY3Rpb24gfSBmcm9tICcuL29wdGltaXplZC1lbnRpdHktY29sbGVjdGlvbic7XG5cbi8qKlxuICogIEdlbmVyYWwgcHJpbWl0aXZlcyBkcmF3ZXIgcmVzcG9uc2libGUgb2YgZHJhd2luZyBDZXNpdW0gcHJpbWl0aXZlcy5cbiAqICBEcmF3ZXJzIHRoZSBoYW5kbGUgQ2VzaXVtIHByaW1pdGl2ZXMgZXh0ZW5kIGl0LlxuICovXG5cbmV4cG9ydCBjbGFzcyBFbnRpdGllc0RyYXdlclNlcnZpY2UgZXh0ZW5kcyBCYXNpY0RyYXdlclNlcnZpY2Uge1xuICBwcml2YXRlIGVudGl0eUNvbGxlY3Rpb25zID0gbmV3IE1hcDxhbnksIE9wdGltaXplZEVudGl0eUNvbGxlY3Rpb24+KCk7XG4gIHByaXZhdGUgZ3JhcGhpY3NUeXBlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSxcbiAgICBwcml2YXRlIGdyYXBoaWNzVHlwZTogR3JhcGhpY3NUeXBlLFxuICAgIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEVudGl0aWVzRHJhd2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbGxlY3Rpb25NYXhTaXplOiAtMSxcbiAgICAgIGNvbGxlY3Rpb25TdXNwZW5zaW9uVGltZTogLTEsXG4gICAgICBjb2xsZWN0aW9uc051bWJlcjogMSxcbiAgICB9LFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZ3JhcGhpY3NUeXBlTmFtZSA9IEdyYXBoaWNzVHlwZVt0aGlzLmdyYXBoaWNzVHlwZV07XG5cbiAgICAvLyBGaXggYmFkIGVudW0gY29tcGlsYXRpb25cbiAgICBmb3IgKGNvbnN0IGkgaW4gR3JhcGhpY3NUeXBlKSB7XG4gICAgICBpZiAoR3JhcGhpY3NUeXBlW2ldIGFzIGFueSA9PT0gdGhpcy5ncmFwaGljc1R5cGUpIHtcbiAgICAgICAgdGhpcy5ncmFwaGljc1R5cGVOYW1lID0gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZyZWVFbnRpdGllc0NvbGxlY3Rpb24oKTogT3B0aW1pemVkRW50aXR5Q29sbGVjdGlvbiB7XG4gICAgbGV0IGZyZWVFbnRpdHlDb2xsZWN0aW9uID0gbnVsbDtcbiAgICB0aGlzLmVudGl0eUNvbGxlY3Rpb25zLmZvckVhY2goZW50aXR5Q29sbGVjdGlvbiA9PiB7XG4gICAgICBpZiAoZW50aXR5Q29sbGVjdGlvbi5pc0ZyZWUoKSkge1xuICAgICAgICBmcmVlRW50aXR5Q29sbGVjdGlvbiA9IGVudGl0eUNvbGxlY3Rpb247XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJlZUVudGl0eUNvbGxlY3Rpb247XG4gIH1cblxuICBpbml0KG9wdGlvbnM/OiBFbnRpdGllc0RyYXdlck9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMuZGVmYXVsdE9wdGlvbnM7XG4gICAgY29uc3QgZGF0YVNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmFsT3B0aW9ucy5jb2xsZWN0aW9uc051bWJlcjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IENlc2l1bS5DdXN0b21EYXRhU291cmNlKHRoaXMuZ3JhcGhpY3NUeXBlTmFtZSk7XG4gICAgICBkYXRhU291cmNlcy5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgdGhpcy5jZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmRhdGFTb3VyY2VzLmFkZChkYXRhU291cmNlKTtcbiAgICAgIHRoaXMuZW50aXR5Q29sbGVjdGlvbnMuc2V0KFxuICAgICAgICBkYXRhU291cmNlLmVudGl0aWVzLFxuICAgICAgICBuZXcgT3B0aW1pemVkRW50aXR5Q29sbGVjdGlvbihkYXRhU291cmNlLmVudGl0aWVzLCBmaW5hbE9wdGlvbnMuY29sbGVjdGlvbk1heFNpemUsIGZpbmFsT3B0aW9ucy5jb2xsZWN0aW9uU3VzcGVuc2lvblRpbWUpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gIH1cblxuICBhZGQoY2VzaXVtUHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgb3B0aW1pemVkRW50aXR5Q29sbGVjdGlvbiA9IHRoaXMuZ2V0RnJlZUVudGl0aWVzQ29sbGVjdGlvbigpO1xuICAgIGlmIChvcHRpbWl6ZWRFbnRpdHlDb2xsZWN0aW9uID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG1vcmUgZnJlZSBlbnRpdHkgY29sbGVjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlPYmplY3QgPSB7XG4gICAgICBwb3NpdGlvbjogY2VzaXVtUHJvcHMucG9zaXRpb24gIT09IHVuZGVmaW5lZCA/IGNlc2l1bVByb3BzLnBvc2l0aW9uIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IGNlc2l1bVByb3BzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyBjZXNpdW1Qcm9wcy5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgIG9yaWVudGF0aW9uOiBjZXNpdW1Qcm9wcy5vcmllbnRhdGlvbiAhPT0gdW5kZWZpbmVkID8gY2VzaXVtUHJvcHMub3JpZW50YXRpb24gOiB1bmRlZmluZWQsXG4gICAgICB2aWV3RnJvbTogY2VzaXVtUHJvcHMudmlld0Zyb20gIT09IHVuZGVmaW5lZCA/IGNlc2l1bVByb3BzLnZpZXdGcm9tIDogdW5kZWZpbmVkLFxuICAgICAgW3RoaXMuZ3JhcGhpY3NUeXBlTmFtZV06IGNlc2l1bVByb3BzLFxuICAgIH07XG5cbiAgICBpZiAoY2VzaXVtUHJvcHMubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRpdHlPYmplY3QubmFtZSA9IGNlc2l1bVByb3BzLm5hbWU7XG4gICAgfVxuICAgIGlmIChjZXNpdW1Qcm9wcy5hdmFpbGFiaWxpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50aXR5T2JqZWN0LmF2YWlsYWJpbGl0eSA9IGNlc2l1bVByb3BzLmF2YWlsYWJpbGl0eTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW1pemVkRW50aXR5Q29sbGVjdGlvbi5hZGQoZW50aXR5T2JqZWN0KTtcbiAgfVxuXG4gIHVwZGF0ZShlbnRpdHk6IGFueSwgY2VzaXVtUHJvcHM6IGFueSkge1xuICAgIHRoaXMuc3VzcGVuZEVudGl0eUNvbGxlY3Rpb24oZW50aXR5KTtcblxuICAgIGlmIChlbnRpdHkucG9zaXRpb24gaW5zdGFuY2VvZiBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSkge1xuICAgICAgaWYgKGVudGl0eS5wb3NpdGlvbi5faXNDb25zdGFudCkge1xuICAgICAgICBlbnRpdHkucG9zaXRpb24gPSBjZXNpdW1Qcm9wcy5wb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgZW50aXR5LnBvc2l0aW9uID0gY2VzaXVtUHJvcHMucG9zaXRpb24gIT09IHVuZGVmaW5lZCA/IGNlc2l1bVByb3BzLnBvc2l0aW9uIDogdW5kZWZpbmVkO1xuICAgIGVudGl0eS5uYW1lID0gY2VzaXVtUHJvcHMubmFtZSAhPT0gdW5kZWZpbmVkID8gY2VzaXVtUHJvcHMubmFtZSA6IGVudGl0eS5uYW1lO1xuICAgIGVudGl0eS5kZXNjcmlwdGlvbiA9IGNlc2l1bVByb3BzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyBjZXNpdW1Qcm9wcy5kZXNjcmlwdGlvbiA6IGVudGl0eS5kZXNjcmlwdGlvbjtcbiAgICBlbnRpdHkub3JpZW50YXRpb24gPSBjZXNpdW1Qcm9wcy5vcmllbnRhdGlvbiAhPT0gdW5kZWZpbmVkID8gY2VzaXVtUHJvcHMub3JpZW50YXRpb24gOiBlbnRpdHkub3JpZW50YXRpb247XG4gICAgZW50aXR5LnZpZXdGcm9tID0gY2VzaXVtUHJvcHMudmlld0Zyb20gIT09IHVuZGVmaW5lZCA/IGNlc2l1bVByb3BzLnZpZXdGcm9tIDogZW50aXR5LnZpZXdGcm9tO1xuICAgIGVudGl0eS5hdmFpbGFiaWxpdHkgPSBjZXNpdW1Qcm9wcy5hdmFpbGFiaWxpdHkgIT09IHVuZGVmaW5lZCA/IGNlc2l1bVByb3BzLmF2YWlsYWJpbGl0eSA6IGNlc2l1bVByb3BzLmF2YWlsYWJpbGl0eTtcblxuICAgIGlmICh0aGlzLl9wcm9wc0Fzc2lnbmVyKSB7XG4gICAgICB0aGlzLl9wcm9wc0Fzc2lnbmVyKGVudGl0eVt0aGlzLmdyYXBoaWNzVHlwZU5hbWVdLCBjZXNpdW1Qcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50aXR5W3RoaXMuZ3JhcGhpY3NUeXBlTmFtZV0sIGNlc2l1bVByb3BzKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoZW50aXR5OiBhbnkpIHtcbiAgICBjb25zdCBvcHRpbWl6ZWRFbnRpdHlDb2xsZWN0aW9uID0gdGhpcy5lbnRpdHlDb2xsZWN0aW9ucy5nZXQoZW50aXR5LmVudGl0eUNvbGxlY3Rpb24pO1xuICAgIG9wdGltaXplZEVudGl0eUNvbGxlY3Rpb24ucmVtb3ZlKGVudGl0eSk7XG4gIH1cblxuICByZW1vdmVBbGwoKSB7XG4gICAgdGhpcy5lbnRpdHlDb2xsZWN0aW9ucy5mb3JFYWNoKGVudGl0eUNvbGxlY3Rpb24gPT4ge1xuICAgICAgZW50aXR5Q29sbGVjdGlvbi5yZW1vdmVBbGwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNob3coc2hvd1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5lbnRpdHlDb2xsZWN0aW9ucy5mb3JFYWNoKGVudGl0eUNvbGxlY3Rpb24gPT4ge1xuICAgICAgZW50aXR5Q29sbGVjdGlvbi5zZXRTaG93KHNob3dWYWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1c3BlbmRFbnRpdHlDb2xsZWN0aW9uKGVudGl0eTogYW55KSB7XG4gICAgY29uc3QgaWQgPSBlbnRpdHkuZW50aXR5Q29sbGVjdGlvbjtcbiAgICBpZiAoIXRoaXMuZW50aXR5Q29sbGVjdGlvbnMuaGFzKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBFbnRpdHlDb2xsZWN0aW9uIGZvciBlbnRpdHkuZW50aXR5Q29sbGVjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUNvbGxlY3Rpb24gPSB0aGlzLmVudGl0eUNvbGxlY3Rpb25zLmdldChpZCk7XG4gICAgZW50aXR5Q29sbGVjdGlvbi5zdXNwZW5kKCk7XG4gIH1cbn1cblxuIl19