UNPKG

@eliorar/angular-cesium

Version:

Angular library for working with Cesium.

87 lines 16.1 kB
import { Injectable } from '@angular/core'; import { Cartesian3, Cartographic, Ellipsoid } from 'cesium'; import * as i0 from "@angular/core"; import * as i1 from "../cesium/cesium.service"; export class GeoUtilsService { constructor(cesiumService) { this.cesiumService = cesiumService; } static pointByLocationDistanceAndAzimuth(currentLocation, meterDistance, radianAzimuth, deprecated) { const distance = meterDistance / Ellipsoid.WGS84.maximumRadius; const cartographicLocation = currentLocation instanceof Cartesian3 ? Cartographic.fromCartesian(currentLocation) : currentLocation; const cartesianLocation = currentLocation instanceof Cartesian3 ? currentLocation : Cartesian3.fromRadians(currentLocation.longitude, currentLocation.latitude, currentLocation.height); let resultPosition; let resultDistance; let counter = 0; let distanceFactorRangeMax = 0.1; let distanceFactorRangeMin = -0.1; while (counter === 0 || (counter < 16 && Math.max(resultDistance, meterDistance) / Math.min(resultDistance, meterDistance) > 1.000001)) { const factor = distanceFactorRangeMin + (distanceFactorRangeMax - distanceFactorRangeMin) / 2; resultPosition = GeoUtilsService._pointByLocationDistanceAndAzimuth(cartographicLocation, distance * (1 + factor), radianAzimuth); resultDistance = this.distance(cartesianLocation, resultPosition); if (resultDistance > meterDistance) { distanceFactorRangeMax = distanceFactorRangeMin + (distanceFactorRangeMax - distanceFactorRangeMin) / 2; } else { distanceFactorRangeMin = distanceFactorRangeMin + (distanceFactorRangeMax - distanceFactorRangeMin) / 2; } counter++; } return resultPosition; } static _pointByLocationDistanceAndAzimuth(cartographicLocation, distance, radianAzimuth) { const curLat = cartographicLocation.latitude; const curLon = cartographicLocation.longitude; const destinationLat = Math.asin(Math.sin(curLat) * Math.cos(distance) + Math.cos(curLat) * Math.sin(distance) * Math.cos(radianAzimuth)); let destinationLon = curLon + Math.atan2(Math.sin(radianAzimuth) * Math.sin(distance) * Math.cos(curLat), Math.cos(distance) - Math.sin(curLat) * Math.sin(destinationLat)); destinationLon = ((destinationLon + 3 * Math.PI) % (2 * Math.PI)) - Math.PI; return Cartesian3.fromRadians(destinationLon, destinationLat); } static distance(pos0, pos1) { return Cartesian3.distance(pos0, pos1); } static getPositionsDelta(position0, position1) { return { x: position1.x - position0.x, y: position1.y - position0.y, z: position1.z - position0.z, }; } static addDeltaToPosition(position, delta, updateReference = false) { if (updateReference) { position.x += delta.x; position.y += delta.y; position.z += delta.z; const cartographic = Cartographic.fromCartesian(position); cartographic.height = 0; const cartesian = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height); position.x = cartesian.x; position.y = cartesian.y; position.z = cartesian.z; return position; } else { const cartesian = new Cartesian3(position.x + delta.x, position.y + delta.y, position.z + delta.z); const cartographic = Cartographic.fromCartesian(cartesian); cartographic.height = 0; return Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height); } } static middleCartesian3Point(position0, position1) { return new Cartesian3(position1.x - position0.x / 2, position1.y - position0.y / 2, position1.z - position0.z / 2); } screenPositionToCartesian3(screenPos) { const camera = this.cesiumService.getViewer().camera; return camera.pickEllipsoid(screenPos); } } GeoUtilsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GeoUtilsService, deps: [{ token: i1.CesiumService }], target: i0.ɵɵFactoryTarget.Injectable }); GeoUtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GeoUtilsService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GeoUtilsService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.CesiumService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXV0aWxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNlc2l1bS9zcmMvbGliL2FuZ3VsYXItY2VzaXVtL3NlcnZpY2VzL2dlby11dGlscy9nZW8tdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLFFBQVEsQ0FBQzs7O0FBSzNELE1BQU0sT0FBTyxlQUFlO0lBeUYxQixZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUNoRCxDQUFDO0lBekZELE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxlQUFvQixFQUFFLGFBQXFCLEVBQUUsYUFBcUIsRUFBRSxVQUFXO1FBQ3RILE1BQU0sUUFBUSxHQUFHLGFBQWEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUMvRCxNQUFNLG9CQUFvQixHQUN4QixlQUFlLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDeEcsTUFBTSxpQkFBaUIsR0FDckIsZUFBZSxZQUFZLFVBQVU7WUFDbkMsQ0FBQyxDQUFDLGVBQWU7WUFDakIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxRyxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7UUFDakMsSUFBSSxz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WUFDeEIsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkc7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQXFCLEVBQUUsU0FBcUI7UUFDdkUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JILENBQUM7SUFLRCwwQkFBMEIsQ0FBQyxTQUFtQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7NEdBL0ZVLGVBQWU7Z0hBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q2FydGVzaWFuMywgQ2FydG9ncmFwaGljLCBFbGxpcHNvaWR9IGZyb20gJ2Nlc2l1bSc7XG5pbXBvcnQge0Nlc2l1bVNlcnZpY2V9IGZyb20gJy4uL2Nlc2l1bS9jZXNpdW0uc2VydmljZSc7XG5pbXBvcnQge1ZlYzN9IGZyb20gJy4uLy4uL21vZGVscy92ZWMzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdlb1V0aWxzU2VydmljZSB7XG4gIHN0YXRpYyBwb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY3VycmVudExvY2F0aW9uOiBhbnksIG1ldGVyRGlzdGFuY2U6IG51bWJlciwgcmFkaWFuQXppbXV0aDogbnVtYmVyLCBkZXByZWNhdGVkPykge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gbWV0ZXJEaXN0YW5jZSAvIEVsbGlwc29pZC5XR1M4NC5tYXhpbXVtUmFkaXVzO1xuICAgIGNvbnN0IGNhcnRvZ3JhcGhpY0xvY2F0aW9uID1cbiAgICAgIGN1cnJlbnRMb2NhdGlvbiBpbnN0YW5jZW9mIENhcnRlc2lhbjMgPyBDYXJ0b2dyYXBoaWMuZnJvbUNhcnRlc2lhbihjdXJyZW50TG9jYXRpb24pIDogY3VycmVudExvY2F0aW9uO1xuICAgIGNvbnN0IGNhcnRlc2lhbkxvY2F0aW9uID1cbiAgICAgIGN1cnJlbnRMb2NhdGlvbiBpbnN0YW5jZW9mIENhcnRlc2lhbjNcbiAgICAgICAgPyBjdXJyZW50TG9jYXRpb25cbiAgICAgICAgOiBDYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGN1cnJlbnRMb2NhdGlvbi5sb25naXR1ZGUsIGN1cnJlbnRMb2NhdGlvbi5sYXRpdHVkZSwgY3VycmVudExvY2F0aW9uLmhlaWdodCk7XG5cbiAgICBsZXQgcmVzdWx0UG9zaXRpb247XG4gICAgbGV0IHJlc3VsdERpc3RhbmNlO1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICBsZXQgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IDAuMTtcbiAgICBsZXQgZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiA9IC0wLjE7XG4gICAgd2hpbGUgKFxuICAgICAgY291bnRlciA9PT0gMCB8fFxuICAgICAgKGNvdW50ZXIgPCAxNiAmJiBNYXRoLm1heChyZXN1bHREaXN0YW5jZSwgbWV0ZXJEaXN0YW5jZSkgLyBNYXRoLm1pbihyZXN1bHREaXN0YW5jZSwgbWV0ZXJEaXN0YW5jZSkgPiAxLjAwMDAwMSlcbiAgICAgICkge1xuICAgICAgY29uc3QgZmFjdG9yID0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiArIChkaXN0YW5jZUZhY3RvclJhbmdlTWF4IC0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbikgLyAyO1xuICAgICAgcmVzdWx0UG9zaXRpb24gPSBHZW9VdGlsc1NlcnZpY2UuX3BvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aChjYXJ0b2dyYXBoaWNMb2NhdGlvbiwgZGlzdGFuY2UgKiAoMSArIGZhY3RvciksIHJhZGlhbkF6aW11dGgpO1xuICAgICAgcmVzdWx0RGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKGNhcnRlc2lhbkxvY2F0aW9uLCByZXN1bHRQb3NpdGlvbik7XG5cbiAgICAgIGlmIChyZXN1bHREaXN0YW5jZSA+IG1ldGVyRGlzdGFuY2UpIHtcbiAgICAgICAgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gKyAoZGlzdGFuY2VGYWN0b3JSYW5nZU1heCAtIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4pIC8gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gPSBkaXN0YW5jZUZhY3RvclJhbmdlTWluICsgKGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggLSBkaXN0YW5jZUZhY3RvclJhbmdlTWluKSAvIDI7XG4gICAgICB9XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFBvc2l0aW9uO1xuICB9XG5cbiAgc3RhdGljIF9wb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY2FydG9ncmFwaGljTG9jYXRpb246IGFueSwgZGlzdGFuY2U6IG51bWJlciwgcmFkaWFuQXppbXV0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgY3VyTGF0ID0gY2FydG9ncmFwaGljTG9jYXRpb24ubGF0aXR1ZGU7XG4gICAgY29uc3QgY3VyTG9uID0gY2FydG9ncmFwaGljTG9jYXRpb24ubG9uZ2l0dWRlO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uTGF0ID0gTWF0aC5hc2luKFxuICAgICAgTWF0aC5zaW4oY3VyTGF0KSAqIE1hdGguY29zKGRpc3RhbmNlKSArIE1hdGguY29zKGN1ckxhdCkgKiBNYXRoLnNpbihkaXN0YW5jZSkgKiBNYXRoLmNvcyhyYWRpYW5BemltdXRoKSxcbiAgICApO1xuXG4gICAgbGV0IGRlc3RpbmF0aW9uTG9uID1cbiAgICAgIGN1ckxvbiArXG4gICAgICBNYXRoLmF0YW4yKFxuICAgICAgICBNYXRoLnNpbihyYWRpYW5BemltdXRoKSAqIE1hdGguc2luKGRpc3RhbmNlKSAqIE1hdGguY29zKGN1ckxhdCksXG4gICAgICAgIE1hdGguY29zKGRpc3RhbmNlKSAtIE1hdGguc2luKGN1ckxhdCkgKiBNYXRoLnNpbihkZXN0aW5hdGlvbkxhdCksXG4gICAgICApO1xuXG4gICAgZGVzdGluYXRpb25Mb24gPSAoKGRlc3RpbmF0aW9uTG9uICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSkgLSBNYXRoLlBJO1xuXG4gICAgcmV0dXJuIENhcnRlc2lhbjMuZnJvbVJhZGlhbnMoZGVzdGluYXRpb25Mb24sIGRlc3RpbmF0aW9uTGF0KTtcbiAgfVxuXG4gIHN0YXRpYyBkaXN0YW5jZShwb3MwOiBDYXJ0ZXNpYW4zLCBwb3MxOiBDYXJ0ZXNpYW4zKTogbnVtYmVyIHtcbiAgICByZXR1cm4gQ2FydGVzaWFuMy5kaXN0YW5jZShwb3MwLCBwb3MxKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRQb3NpdGlvbnNEZWx0YShwb3NpdGlvbjA6IENhcnRlc2lhbjMsIHBvc2l0aW9uMTogQ2FydGVzaWFuMyk6IFZlYzMge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwb3NpdGlvbjEueCAtIHBvc2l0aW9uMC54LFxuICAgICAgeTogcG9zaXRpb24xLnkgLSBwb3NpdGlvbjAueSxcbiAgICAgIHo6IHBvc2l0aW9uMS56IC0gcG9zaXRpb24wLnosXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhZGREZWx0YVRvUG9zaXRpb24ocG9zaXRpb246IENhcnRlc2lhbjMsIGRlbHRhOiBWZWMzLCB1cGRhdGVSZWZlcmVuY2UgPSBmYWxzZSk6IENhcnRlc2lhbjMge1xuICAgIGlmICh1cGRhdGVSZWZlcmVuY2UpIHtcbiAgICAgIHBvc2l0aW9uLnggKz0gZGVsdGEueDtcbiAgICAgIHBvc2l0aW9uLnkgKz0gZGVsdGEueTtcbiAgICAgIHBvc2l0aW9uLnogKz0gZGVsdGEuejtcbiAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYyA9IENhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKHBvc2l0aW9uKTtcbiAgICAgIGNhcnRvZ3JhcGhpYy5oZWlnaHQgPSAwO1xuICAgICAgY29uc3QgY2FydGVzaWFuID0gQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhjYXJ0b2dyYXBoaWMubG9uZ2l0dWRlLCBjYXJ0b2dyYXBoaWMubGF0aXR1ZGUsIGNhcnRvZ3JhcGhpYy5oZWlnaHQpO1xuICAgICAgcG9zaXRpb24ueCA9IGNhcnRlc2lhbi54O1xuICAgICAgcG9zaXRpb24ueSA9IGNhcnRlc2lhbi55O1xuICAgICAgcG9zaXRpb24ueiA9IGNhcnRlc2lhbi56O1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjYXJ0ZXNpYW4gPSBuZXcgQ2FydGVzaWFuMyhwb3NpdGlvbi54ICsgZGVsdGEueCwgcG9zaXRpb24ueSArIGRlbHRhLnksIHBvc2l0aW9uLnogKyBkZWx0YS56KTtcbiAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYyA9IENhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKGNhcnRlc2lhbik7XG4gICAgICBjYXJ0b2dyYXBoaWMuaGVpZ2h0ID0gMDtcbiAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGNhcnRvZ3JhcGhpYy5sb25naXR1ZGUsIGNhcnRvZ3JhcGhpYy5sYXRpdHVkZSwgY2FydG9ncmFwaGljLmhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG1pZGRsZUNhcnRlc2lhbjNQb2ludChwb3NpdGlvbjA6IENhcnRlc2lhbjMsIHBvc2l0aW9uMTogQ2FydGVzaWFuMykge1xuICAgIHJldHVybiBuZXcgQ2FydGVzaWFuMyhwb3NpdGlvbjEueCAtIHBvc2l0aW9uMC54IC8gMiwgcG9zaXRpb24xLnkgLSBwb3NpdGlvbjAueSAvIDIsIHBvc2l0aW9uMS56IC0gcG9zaXRpb24wLnogLyAyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSkge1xuICB9XG5cbiAgc2NyZWVuUG9zaXRpb25Ub0NhcnRlc2lhbjMoc2NyZWVuUG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmNlc2l1bVNlcnZpY2UuZ2V0Vmlld2VyKCkuY2FtZXJhO1xuICAgIHJldHVybiBjYW1lcmEucGlja0VsbGlwc29pZChzY3JlZW5Qb3MpO1xuICB9XG59XG4iXX0=