UNPKG

iceye-angular-cesium-fork

Version:

Angular library for working with Cesium.

86 lines 15.9 kB
import { Injectable } from '@angular/core'; import { CesiumService } from '../cesium/cesium.service'; export class GeoUtilsService { constructor(cesiumService) { this.cesiumService = cesiumService; } static pointByLocationDistanceAndAzimuth(currentLocation, meterDistance, radianAzimuth, deprecated) { const distance = meterDistance / Cesium.Ellipsoid.WGS84.maximumRadius; const cartographicLocation = currentLocation instanceof Cesium.Cartesian3 ? Cesium.Cartographic.fromCartesian(currentLocation) : currentLocation; const cartesianLocation = currentLocation instanceof Cesium.Cartesian3 ? currentLocation : Cesium.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 Cesium.Cartesian3.fromRadians(destinationLon, destinationLat); } static distance(pos0, pos1) { return Cesium.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 = Cesium.Cartographic.fromCartesian(position); cartographic.height = 0; const cartesian = Cesium.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 Cesium.Cartesian3(position.x + delta.x, position.y + delta.y, position.z + delta.z); const cartographic = Cesium.Cartographic.fromCartesian(cartesian); cartographic.height = 0; return Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height); } } static middleCartesian3Point(position0, position1) { return new Cesium.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.decorators = [ { type: Injectable } ]; GeoUtilsService.ctorParameters = () => [ { type: CesiumService } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXV0aWxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNlc2l1bS9zcmMvbGliL2FuZ3VsYXItY2VzaXVtL3NlcnZpY2VzL2dlby11dGlscy9nZW8tdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUt6RCxNQUFNLE9BQU8sZUFBZTtJQXlGMUIsWUFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDaEQsQ0FBQztJQXpGRCxNQUFNLENBQUMsaUNBQWlDLENBQUMsZUFBb0IsRUFBRSxhQUFxQixFQUFFLGFBQXFCLEVBQUUsVUFBVztRQUN0SCxNQUFNLFFBQVEsR0FBRyxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3RFLE1BQU0sb0JBQW9CLEdBQ3hCLGVBQWUsWUFBWSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQ3RILE1BQU0saUJBQWlCLEdBQ3JCLGVBQWUsWUFBWSxNQUFNLENBQUMsVUFBVTtZQUMxQyxDQUFDLENBQUMsZUFBZTtZQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVqSCxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxzQkFB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QUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDeEIsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFHO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFxQixFQUFFLFNBQXFCO1FBQ3ZFLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUtELDBCQUEwQixDQUFDLFNBQW1DO1FBQzVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3JELE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7WUFoR0YsVUFBVTs7O1lBSkYsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENlc2l1bVNlcnZpY2UgfSBmcm9tICcuLi9jZXNpdW0vY2VzaXVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydGVzaWFuMyB9IGZyb20gJy4uLy4uL21vZGVscy9jYXJ0ZXNpYW4zJztcbmltcG9ydCB7IFZlYzMgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmVjMyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHZW9VdGlsc1NlcnZpY2Uge1xuICBzdGF0aWMgcG9pbnRCeUxvY2F0aW9uRGlzdGFuY2VBbmRBemltdXRoKGN1cnJlbnRMb2NhdGlvbjogYW55LCBtZXRlckRpc3RhbmNlOiBudW1iZXIsIHJhZGlhbkF6aW11dGg6IG51bWJlciwgZGVwcmVjYXRlZD8pIHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IG1ldGVyRGlzdGFuY2UgLyBDZXNpdW0uRWxsaXBzb2lkLldHUzg0Lm1heGltdW1SYWRpdXM7XG4gICAgY29uc3QgY2FydG9ncmFwaGljTG9jYXRpb24gPVxuICAgICAgY3VycmVudExvY2F0aW9uIGluc3RhbmNlb2YgQ2VzaXVtLkNhcnRlc2lhbjMgPyBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4oY3VycmVudExvY2F0aW9uKSA6IGN1cnJlbnRMb2NhdGlvbjtcbiAgICBjb25zdCBjYXJ0ZXNpYW5Mb2NhdGlvbiA9XG4gICAgICBjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBDZXNpdW0uQ2FydGVzaWFuM1xuICAgICAgICA/IGN1cnJlbnRMb2NhdGlvblxuICAgICAgICA6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGN1cnJlbnRMb2NhdGlvbi5sb25naXR1ZGUsIGN1cnJlbnRMb2NhdGlvbi5sYXRpdHVkZSwgY3VycmVudExvY2F0aW9uLmhlaWdodCk7XG5cbiAgICBsZXQgcmVzdWx0UG9zaXRpb247XG4gICAgbGV0IHJlc3VsdERpc3RhbmNlO1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICBsZXQgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IDAuMTtcbiAgICBsZXQgZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiA9IC0wLjE7XG4gICAgd2hpbGUgKFxuICAgICAgY291bnRlciA9PT0gMCB8fFxuICAgICAgKGNvdW50ZXIgPCAxNiAmJiBNYXRoLm1heChyZXN1bHREaXN0YW5jZSwgbWV0ZXJEaXN0YW5jZSkgLyBNYXRoLm1pbihyZXN1bHREaXN0YW5jZSwgbWV0ZXJEaXN0YW5jZSkgPiAxLjAwMDAwMSlcbiAgICAgICkge1xuICAgICAgY29uc3QgZmFjdG9yID0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiArIChkaXN0YW5jZUZhY3RvclJhbmdlTWF4IC0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbikgLyAyO1xuICAgICAgcmVzdWx0UG9zaXRpb24gPSBHZW9VdGlsc1NlcnZpY2UuX3BvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aChjYXJ0b2dyYXBoaWNMb2NhdGlvbiwgZGlzdGFuY2UgKiAoMSArIGZhY3RvciksIHJhZGlhbkF6aW11dGgpO1xuICAgICAgcmVzdWx0RGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKGNhcnRlc2lhbkxvY2F0aW9uLCByZXN1bHRQb3NpdGlvbik7XG5cbiAgICAgIGlmIChyZXN1bHREaXN0YW5jZSA+IG1ldGVyRGlzdGFuY2UpIHtcbiAgICAgICAgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gKyAoZGlzdGFuY2VGYWN0b3JSYW5nZU1heCAtIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4pIC8gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gPSBkaXN0YW5jZUZhY3RvclJhbmdlTWluICsgKGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggLSBkaXN0YW5jZUZhY3RvclJhbmdlTWluKSAvIDI7XG4gICAgICB9XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFBvc2l0aW9uO1xuICB9XG5cbiAgc3RhdGljIF9wb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY2FydG9ncmFwaGljTG9jYXRpb246IGFueSwgZGlzdGFuY2U6IG51bWJlciwgcmFkaWFuQXppbXV0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgY3VyTGF0ID0gY2FydG9ncmFwaGljTG9jYXRpb24ubGF0aXR1ZGU7XG4gICAgY29uc3QgY3VyTG9uID0gY2FydG9ncmFwaGljTG9jYXRpb24ubG9uZ2l0dWRlO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uTGF0ID0gTWF0aC5hc2luKFxuICAgICAgTWF0aC5zaW4oY3VyTGF0KSAqIE1hdGguY29zKGRpc3RhbmNlKSArIE1hdGguY29zKGN1ckxhdCkgKiBNYXRoLnNpbihkaXN0YW5jZSkgKiBNYXRoLmNvcyhyYWRpYW5BemltdXRoKSxcbiAgICApO1xuXG4gICAgbGV0IGRlc3RpbmF0aW9uTG9uID1cbiAgICAgIGN1ckxvbiArXG4gICAgICBNYXRoLmF0YW4yKFxuICAgICAgICBNYXRoLnNpbihyYWRpYW5BemltdXRoKSAqIE1hdGguc2luKGRpc3RhbmNlKSAqIE1hdGguY29zKGN1ckxhdCksXG4gICAgICAgIE1hdGguY29zKGRpc3RhbmNlKSAtIE1hdGguc2luKGN1ckxhdCkgKiBNYXRoLnNpbihkZXN0aW5hdGlvbkxhdCksXG4gICAgICApO1xuXG4gICAgZGVzdGluYXRpb25Mb24gPSAoKGRlc3RpbmF0aW9uTG9uICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSkgLSBNYXRoLlBJO1xuXG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGRlc3RpbmF0aW9uTG9uLCBkZXN0aW5hdGlvbkxhdCk7XG4gIH1cblxuICBzdGF0aWMgZGlzdGFuY2UocG9zMDogQ2FydGVzaWFuMywgcG9zMTogQ2FydGVzaWFuMyk6IG51bWJlciB7XG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvczAsIHBvczEpO1xuICB9XG5cbiAgc3RhdGljIGdldFBvc2l0aW9uc0RlbHRhKHBvc2l0aW9uMDogQ2FydGVzaWFuMywgcG9zaXRpb24xOiBDYXJ0ZXNpYW4zKTogVmVjMyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBvc2l0aW9uMS54IC0gcG9zaXRpb24wLngsXG4gICAgICB5OiBwb3NpdGlvbjEueSAtIHBvc2l0aW9uMC55LFxuICAgICAgejogcG9zaXRpb24xLnogLSBwb3NpdGlvbjAueixcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGFkZERlbHRhVG9Qb3NpdGlvbihwb3NpdGlvbjogQ2FydGVzaWFuMywgZGVsdGE6IFZlYzMsIHVwZGF0ZVJlZmVyZW5jZSA9IGZhbHNlKTogQ2FydGVzaWFuMyB7XG4gICAgaWYgKHVwZGF0ZVJlZmVyZW5jZSkge1xuICAgICAgcG9zaXRpb24ueCArPSBkZWx0YS54O1xuICAgICAgcG9zaXRpb24ueSArPSBkZWx0YS55O1xuICAgICAgcG9zaXRpb24ueiArPSBkZWx0YS56O1xuICAgICAgY29uc3QgY2FydG9ncmFwaGljID0gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKHBvc2l0aW9uKTtcbiAgICAgIGNhcnRvZ3JhcGhpYy5oZWlnaHQgPSAwO1xuICAgICAgY29uc3QgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbVJhZGlhbnMoY2FydG9ncmFwaGljLmxvbmdpdHVkZSwgY2FydG9ncmFwaGljLmxhdGl0dWRlLCBjYXJ0b2dyYXBoaWMuaGVpZ2h0KTtcbiAgICAgIHBvc2l0aW9uLnggPSBjYXJ0ZXNpYW4ueDtcbiAgICAgIHBvc2l0aW9uLnkgPSBjYXJ0ZXNpYW4ueTtcbiAgICAgIHBvc2l0aW9uLnogPSBjYXJ0ZXNpYW4uejtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2FydGVzaWFuID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKHBvc2l0aW9uLnggKyBkZWx0YS54LCBwb3NpdGlvbi55ICsgZGVsdGEueSwgcG9zaXRpb24ueiArIGRlbHRhLnopO1xuICAgICAgY29uc3QgY2FydG9ncmFwaGljID0gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKGNhcnRlc2lhbik7XG4gICAgICBjYXJ0b2dyYXBoaWMuaGVpZ2h0ID0gMDtcbiAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhjYXJ0b2dyYXBoaWMubG9uZ2l0dWRlLCBjYXJ0b2dyYXBoaWMubGF0aXR1ZGUsIGNhcnRvZ3JhcGhpYy5oZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBtaWRkbGVDYXJ0ZXNpYW4zUG9pbnQocG9zaXRpb24wOiBDYXJ0ZXNpYW4zLCBwb3NpdGlvbjE6IENhcnRlc2lhbjMpIHtcbiAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKHBvc2l0aW9uMS54IC0gcG9zaXRpb24wLnggLyAyLCBwb3NpdGlvbjEueSAtIHBvc2l0aW9uMC55IC8gMiwgcG9zaXRpb24xLnogLSBwb3NpdGlvbjAueiAvIDIpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlKSB7XG4gIH1cblxuICBzY3JlZW5Qb3NpdGlvblRvQ2FydGVzaWFuMyhzY3JlZW5Qb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XG4gICAgcmV0dXJuIGNhbWVyYS5waWNrRWxsaXBzb2lkKHNjcmVlblBvcyk7XG4gIH1cbn1cbiJdfQ==