UNPKG

angular-cesium

Version:
86 lines 16.2 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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QUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDeEIsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFHO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFxQixFQUFFLFNBQXFCO1FBQ3ZFLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUtELDBCQUEwQixDQUFDLFNBQW1DO1FBQzVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3JELE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7WUFoR0YsVUFBVTs7O1lBSkYsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2VzaXVtU2VydmljZSB9IGZyb20gJy4uL2Nlc2l1bS9jZXNpdW0uc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnRlc2lhbjMgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FydGVzaWFuMyc7XHJcbmltcG9ydCB7IFZlYzMgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmVjMyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHZW9VdGlsc1NlcnZpY2Uge1xyXG4gIHN0YXRpYyBwb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY3VycmVudExvY2F0aW9uOiBhbnksIG1ldGVyRGlzdGFuY2U6IG51bWJlciwgcmFkaWFuQXppbXV0aDogbnVtYmVyLCBkZXByZWNhdGVkPykge1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSBtZXRlckRpc3RhbmNlIC8gQ2VzaXVtLkVsbGlwc29pZC5XR1M4NC5tYXhpbXVtUmFkaXVzO1xyXG4gICAgY29uc3QgY2FydG9ncmFwaGljTG9jYXRpb24gPVxyXG4gICAgICBjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBDZXNpdW0uQ2FydGVzaWFuMyA/IENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbUNhcnRlc2lhbihjdXJyZW50TG9jYXRpb24pIDogY3VycmVudExvY2F0aW9uO1xyXG4gICAgY29uc3QgY2FydGVzaWFuTG9jYXRpb24gPVxyXG4gICAgICBjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBDZXNpdW0uQ2FydGVzaWFuM1xyXG4gICAgICAgID8gY3VycmVudExvY2F0aW9uXHJcbiAgICAgICAgOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhjdXJyZW50TG9jYXRpb24ubG9uZ2l0dWRlLCBjdXJyZW50TG9jYXRpb24ubGF0aXR1ZGUsIGN1cnJlbnRMb2NhdGlvbi5oZWlnaHQpO1xyXG5cclxuICAgIGxldCByZXN1bHRQb3NpdGlvbjtcclxuICAgIGxldCByZXN1bHREaXN0YW5jZTtcclxuICAgIGxldCBjb3VudGVyID0gMDtcclxuICAgIGxldCBkaXN0YW5jZUZhY3RvclJhbmdlTWF4ID0gMC4xO1xyXG4gICAgbGV0IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gPSAtMC4xO1xyXG4gICAgd2hpbGUgKFxyXG4gICAgICBjb3VudGVyID09PSAwIHx8XHJcbiAgICAgIChjb3VudGVyIDwgMTYgJiYgTWF0aC5tYXgocmVzdWx0RGlzdGFuY2UsIG1ldGVyRGlzdGFuY2UpIC8gTWF0aC5taW4ocmVzdWx0RGlzdGFuY2UsIG1ldGVyRGlzdGFuY2UpID4gMS4wMDAwMDEpXHJcbiAgICAgICkge1xyXG4gICAgICBjb25zdCBmYWN0b3IgPSBkaXN0YW5jZUZhY3RvclJhbmdlTWluICsgKGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggLSBkaXN0YW5jZUZhY3RvclJhbmdlTWluKSAvIDI7XHJcbiAgICAgIHJlc3VsdFBvc2l0aW9uID0gR2VvVXRpbHNTZXJ2aWNlLl9wb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY2FydG9ncmFwaGljTG9jYXRpb24sIGRpc3RhbmNlICogKDEgKyBmYWN0b3IpLCByYWRpYW5BemltdXRoKTtcclxuICAgICAgcmVzdWx0RGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKGNhcnRlc2lhbkxvY2F0aW9uLCByZXN1bHRQb3NpdGlvbik7XHJcblxyXG4gICAgICBpZiAocmVzdWx0RGlzdGFuY2UgPiBtZXRlckRpc3RhbmNlKSB7XHJcbiAgICAgICAgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gKyAoZGlzdGFuY2VGYWN0b3JSYW5nZU1heCAtIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4pIC8gMjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkaXN0YW5jZUZhY3RvclJhbmdlTWluID0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiArIChkaXN0YW5jZUZhY3RvclJhbmdlTWF4IC0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbikgLyAyO1xyXG4gICAgICB9XHJcbiAgICAgIGNvdW50ZXIrKztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0UG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgX3BvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aChjYXJ0b2dyYXBoaWNMb2NhdGlvbjogYW55LCBkaXN0YW5jZTogbnVtYmVyLCByYWRpYW5BemltdXRoOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGN1ckxhdCA9IGNhcnRvZ3JhcGhpY0xvY2F0aW9uLmxhdGl0dWRlO1xyXG4gICAgY29uc3QgY3VyTG9uID0gY2FydG9ncmFwaGljTG9jYXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgY29uc3QgZGVzdGluYXRpb25MYXQgPSBNYXRoLmFzaW4oXHJcbiAgICAgIE1hdGguc2luKGN1ckxhdCkgKiBNYXRoLmNvcyhkaXN0YW5jZSkgKyBNYXRoLmNvcyhjdXJMYXQpICogTWF0aC5zaW4oZGlzdGFuY2UpICogTWF0aC5jb3MocmFkaWFuQXppbXV0aCksXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBkZXN0aW5hdGlvbkxvbiA9XHJcbiAgICAgIGN1ckxvbiArXHJcbiAgICAgIE1hdGguYXRhbjIoXHJcbiAgICAgICAgTWF0aC5zaW4ocmFkaWFuQXppbXV0aCkgKiBNYXRoLnNpbihkaXN0YW5jZSkgKiBNYXRoLmNvcyhjdXJMYXQpLFxyXG4gICAgICAgIE1hdGguY29zKGRpc3RhbmNlKSAtIE1hdGguc2luKGN1ckxhdCkgKiBNYXRoLnNpbihkZXN0aW5hdGlvbkxhdCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgZGVzdGluYXRpb25Mb24gPSAoKGRlc3RpbmF0aW9uTG9uICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSkgLSBNYXRoLlBJO1xyXG5cclxuICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhkZXN0aW5hdGlvbkxvbiwgZGVzdGluYXRpb25MYXQpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRpc3RhbmNlKHBvczA6IENhcnRlc2lhbjMsIHBvczE6IENhcnRlc2lhbjMpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvczAsIHBvczEpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFBvc2l0aW9uc0RlbHRhKHBvc2l0aW9uMDogQ2FydGVzaWFuMywgcG9zaXRpb24xOiBDYXJ0ZXNpYW4zKTogVmVjMyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBwb3NpdGlvbjEueCAtIHBvc2l0aW9uMC54LFxyXG4gICAgICB5OiBwb3NpdGlvbjEueSAtIHBvc2l0aW9uMC55LFxyXG4gICAgICB6OiBwb3NpdGlvbjEueiAtIHBvc2l0aW9uMC56LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBhZGREZWx0YVRvUG9zaXRpb24ocG9zaXRpb246IENhcnRlc2lhbjMsIGRlbHRhOiBWZWMzLCB1cGRhdGVSZWZlcmVuY2UgPSBmYWxzZSk6IENhcnRlc2lhbjMge1xyXG4gICAgaWYgKHVwZGF0ZVJlZmVyZW5jZSkge1xyXG4gICAgICBwb3NpdGlvbi54ICs9IGRlbHRhLng7XHJcbiAgICAgIHBvc2l0aW9uLnkgKz0gZGVsdGEueTtcclxuICAgICAgcG9zaXRpb24ueiArPSBkZWx0YS56O1xyXG4gICAgICBjb25zdCBjYXJ0b2dyYXBoaWMgPSBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4ocG9zaXRpb24pO1xyXG4gICAgICBjYXJ0b2dyYXBoaWMuaGVpZ2h0ID0gMDtcclxuICAgICAgY29uc3QgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbVJhZGlhbnMoY2FydG9ncmFwaGljLmxvbmdpdHVkZSwgY2FydG9ncmFwaGljLmxhdGl0dWRlLCBjYXJ0b2dyYXBoaWMuaGVpZ2h0KTtcclxuICAgICAgcG9zaXRpb24ueCA9IGNhcnRlc2lhbi54O1xyXG4gICAgICBwb3NpdGlvbi55ID0gY2FydGVzaWFuLnk7XHJcbiAgICAgIHBvc2l0aW9uLnogPSBjYXJ0ZXNpYW4uejtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY2FydGVzaWFuID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKHBvc2l0aW9uLnggKyBkZWx0YS54LCBwb3NpdGlvbi55ICsgZGVsdGEueSwgcG9zaXRpb24ueiArIGRlbHRhLnopO1xyXG4gICAgICBjb25zdCBjYXJ0b2dyYXBoaWMgPSBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4oY2FydGVzaWFuKTtcclxuICAgICAgY2FydG9ncmFwaGljLmhlaWdodCA9IDA7XHJcbiAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhjYXJ0b2dyYXBoaWMubG9uZ2l0dWRlLCBjYXJ0b2dyYXBoaWMubGF0aXR1ZGUsIGNhcnRvZ3JhcGhpYy5oZWlnaHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1pZGRsZUNhcnRlc2lhbjNQb2ludChwb3NpdGlvbjA6IENhcnRlc2lhbjMsIHBvc2l0aW9uMTogQ2FydGVzaWFuMykge1xyXG4gICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhwb3NpdGlvbjEueCAtIHBvc2l0aW9uMC54IC8gMiwgcG9zaXRpb24xLnkgLSBwb3NpdGlvbjAueSAvIDIsIHBvc2l0aW9uMS56IC0gcG9zaXRpb24wLnogLyAyKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgc2NyZWVuUG9zaXRpb25Ub0NhcnRlc2lhbjMoc2NyZWVuUG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcclxuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICByZXR1cm4gY2FtZXJhLnBpY2tFbGxpcHNvaWQoc2NyZWVuUG9zKTtcclxuICB9XHJcbn1cclxuIl19