UNPKG

angular-cesium

Version:
90 lines 16.1 kB
var GeoUtilsService_1; import { __decorate, __metadata } from "tslib"; import { Injectable } from '@angular/core'; import { CesiumService } from '../cesium/cesium.service'; let GeoUtilsService = GeoUtilsService_1 = 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_1._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.ctorParameters = () => [ { type: CesiumService } ]; GeoUtilsService = GeoUtilsService_1 = __decorate([ Injectable(), __metadata("design:paramtypes", [CesiumService]) ], GeoUtilsService); export { GeoUtilsService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXV0aWxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWNlc2l1bS8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWNlc2l1bS9zZXJ2aWNlcy9nZW8tdXRpbHMvZ2VvLXV0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUt6RCxJQUFhLGVBQWUsdUJBQTVCLE1BQWEsZUFBZTtJQXlGMUIsWUFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDaEQsQ0FBQztJQXpGRCxNQUFNLENBQUMsaUNBQWlDLENBQUMsZUFBb0IsRUFBRSxhQUFxQixFQUFFLGFBQXFCLEVBQUUsVUFBVztRQUN0SCxNQUFNLFFBQVEsR0FBRyxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3RFLE1BQU0sb0JBQW9CLEdBQ3hCLGVBQWUsWUFBWSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQ3RILE1BQU0saUJBQWlCLEdBQ3JCLGVBQWUsWUFBWSxNQUFNLENBQUMsVUFBVTtZQUMxQyxDQUFDLENBQUMsZUFBZTtZQUNqQixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVqSCxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxzQkFBc0IsR0FBRyxHQUFHLENB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Q0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xFLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxRztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBcUIsRUFBRSxTQUFxQjtRQUN2RSxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFLRCwwQkFBMEIsQ0FBQyxTQUFtQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGLENBQUE7O1lBUG9DLGFBQWE7O0FBekZyQyxlQUFlO0lBRDNCLFVBQVUsRUFBRTtxQ0EwRndCLGFBQWE7R0F6RnJDLGVBQWUsQ0FnRzNCO1NBaEdZLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZXNpdW1TZXJ2aWNlIH0gZnJvbSAnLi4vY2VzaXVtL2Nlc2l1bS5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRlc2lhbjMgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FydGVzaWFuMyc7XG5pbXBvcnQgeyBWZWMzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3ZlYzMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR2VvVXRpbHNTZXJ2aWNlIHtcbiAgc3RhdGljIHBvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aChjdXJyZW50TG9jYXRpb246IGFueSwgbWV0ZXJEaXN0YW5jZTogbnVtYmVyLCByYWRpYW5BemltdXRoOiBudW1iZXIsIGRlcHJlY2F0ZWQ/KSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBtZXRlckRpc3RhbmNlIC8gQ2VzaXVtLkVsbGlwc29pZC5XR1M4NC5tYXhpbXVtUmFkaXVzO1xuICAgIGNvbnN0IGNhcnRvZ3JhcGhpY0xvY2F0aW9uID1cbiAgICAgIGN1cnJlbnRMb2NhdGlvbiBpbnN0YW5jZW9mIENlc2l1bS5DYXJ0ZXNpYW4zID8gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKGN1cnJlbnRMb2NhdGlvbikgOiBjdXJyZW50TG9jYXRpb247XG4gICAgY29uc3QgY2FydGVzaWFuTG9jYXRpb24gPVxuICAgICAgY3VycmVudExvY2F0aW9uIGluc3RhbmNlb2YgQ2VzaXVtLkNhcnRlc2lhbjNcbiAgICAgICAgPyBjdXJyZW50TG9jYXRpb25cbiAgICAgICAgOiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhjdXJyZW50TG9jYXRpb24ubG9uZ2l0dWRlLCBjdXJyZW50TG9jYXRpb24ubGF0aXR1ZGUsIGN1cnJlbnRMb2NhdGlvbi5oZWlnaHQpO1xuXG4gICAgbGV0IHJlc3VsdFBvc2l0aW9uO1xuICAgIGxldCByZXN1bHREaXN0YW5jZTtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgbGV0IGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggPSAwLjE7XG4gICAgbGV0IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gPSAtMC4xO1xuICAgIHdoaWxlIChcbiAgICAgIGNvdW50ZXIgPT09IDAgfHxcbiAgICAgIChjb3VudGVyIDwgMTYgJiYgTWF0aC5tYXgocmVzdWx0RGlzdGFuY2UsIG1ldGVyRGlzdGFuY2UpIC8gTWF0aC5taW4ocmVzdWx0RGlzdGFuY2UsIG1ldGVyRGlzdGFuY2UpID4gMS4wMDAwMDEpXG4gICAgICApIHtcbiAgICAgIGNvbnN0IGZhY3RvciA9IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gKyAoZGlzdGFuY2VGYWN0b3JSYW5nZU1heCAtIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4pIC8gMjtcbiAgICAgIHJlc3VsdFBvc2l0aW9uID0gR2VvVXRpbHNTZXJ2aWNlLl9wb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY2FydG9ncmFwaGljTG9jYXRpb24sIGRpc3RhbmNlICogKDEgKyBmYWN0b3IpLCByYWRpYW5BemltdXRoKTtcbiAgICAgIHJlc3VsdERpc3RhbmNlID0gdGhpcy5kaXN0YW5jZShjYXJ0ZXNpYW5Mb2NhdGlvbiwgcmVzdWx0UG9zaXRpb24pO1xuXG4gICAgICBpZiAocmVzdWx0RGlzdGFuY2UgPiBtZXRlckRpc3RhbmNlKSB7XG4gICAgICAgIGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggPSBkaXN0YW5jZUZhY3RvclJhbmdlTWluICsgKGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggLSBkaXN0YW5jZUZhY3RvclJhbmdlTWluKSAvIDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0YW5jZUZhY3RvclJhbmdlTWluID0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiArIChkaXN0YW5jZUZhY3RvclJhbmdlTWF4IC0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbikgLyAyO1xuICAgICAgfVxuICAgICAgY291bnRlcisrO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRQb3NpdGlvbjtcbiAgfVxuXG4gIHN0YXRpYyBfcG9pbnRCeUxvY2F0aW9uRGlzdGFuY2VBbmRBemltdXRoKGNhcnRvZ3JhcGhpY0xvY2F0aW9uOiBhbnksIGRpc3RhbmNlOiBudW1iZXIsIHJhZGlhbkF6aW11dGg6IG51bWJlcikge1xuICAgIGNvbnN0IGN1ckxhdCA9IGNhcnRvZ3JhcGhpY0xvY2F0aW9uLmxhdGl0dWRlO1xuICAgIGNvbnN0IGN1ckxvbiA9IGNhcnRvZ3JhcGhpY0xvY2F0aW9uLmxvbmdpdHVkZTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkxhdCA9IE1hdGguYXNpbihcbiAgICAgIE1hdGguc2luKGN1ckxhdCkgKiBNYXRoLmNvcyhkaXN0YW5jZSkgKyBNYXRoLmNvcyhjdXJMYXQpICogTWF0aC5zaW4oZGlzdGFuY2UpICogTWF0aC5jb3MocmFkaWFuQXppbXV0aCksXG4gICAgKTtcblxuICAgIGxldCBkZXN0aW5hdGlvbkxvbiA9XG4gICAgICBjdXJMb24gK1xuICAgICAgTWF0aC5hdGFuMihcbiAgICAgICAgTWF0aC5zaW4ocmFkaWFuQXppbXV0aCkgKiBNYXRoLnNpbihkaXN0YW5jZSkgKiBNYXRoLmNvcyhjdXJMYXQpLFxuICAgICAgICBNYXRoLmNvcyhkaXN0YW5jZSkgLSBNYXRoLnNpbihjdXJMYXQpICogTWF0aC5zaW4oZGVzdGluYXRpb25MYXQpLFxuICAgICAgKTtcblxuICAgIGRlc3RpbmF0aW9uTG9uID0gKChkZXN0aW5hdGlvbkxvbiArIDMgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSkpIC0gTWF0aC5QSTtcblxuICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhkZXN0aW5hdGlvbkxvbiwgZGVzdGluYXRpb25MYXQpO1xuICB9XG5cbiAgc3RhdGljIGRpc3RhbmNlKHBvczA6IENhcnRlc2lhbjMsIHBvczE6IENhcnRlc2lhbjMpOiBudW1iZXIge1xuICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5kaXN0YW5jZShwb3MwLCBwb3MxKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRQb3NpdGlvbnNEZWx0YShwb3NpdGlvbjA6IENhcnRlc2lhbjMsIHBvc2l0aW9uMTogQ2FydGVzaWFuMyk6IFZlYzMge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwb3NpdGlvbjEueCAtIHBvc2l0aW9uMC54LFxuICAgICAgeTogcG9zaXRpb24xLnkgLSBwb3NpdGlvbjAueSxcbiAgICAgIHo6IHBvc2l0aW9uMS56IC0gcG9zaXRpb24wLnosXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhZGREZWx0YVRvUG9zaXRpb24ocG9zaXRpb246IENhcnRlc2lhbjMsIGRlbHRhOiBWZWMzLCB1cGRhdGVSZWZlcmVuY2UgPSBmYWxzZSk6IENhcnRlc2lhbjMge1xuICAgIGlmICh1cGRhdGVSZWZlcmVuY2UpIHtcbiAgICAgIHBvc2l0aW9uLnggKz0gZGVsdGEueDtcbiAgICAgIHBvc2l0aW9uLnkgKz0gZGVsdGEueTtcbiAgICAgIHBvc2l0aW9uLnogKz0gZGVsdGEuejtcbiAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYyA9IENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbUNhcnRlc2lhbihwb3NpdGlvbik7XG4gICAgICBjYXJ0b2dyYXBoaWMuaGVpZ2h0ID0gMDtcbiAgICAgIGNvbnN0IGNhcnRlc2lhbiA9IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGNhcnRvZ3JhcGhpYy5sb25naXR1ZGUsIGNhcnRvZ3JhcGhpYy5sYXRpdHVkZSwgY2FydG9ncmFwaGljLmhlaWdodCk7XG4gICAgICBwb3NpdGlvbi54ID0gY2FydGVzaWFuLng7XG4gICAgICBwb3NpdGlvbi55ID0gY2FydGVzaWFuLnk7XG4gICAgICBwb3NpdGlvbi56ID0gY2FydGVzaWFuLno7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNhcnRlc2lhbiA9IG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhwb3NpdGlvbi54ICsgZGVsdGEueCwgcG9zaXRpb24ueSArIGRlbHRhLnksIHBvc2l0aW9uLnogKyBkZWx0YS56KTtcbiAgICAgIGNvbnN0IGNhcnRvZ3JhcGhpYyA9IENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbUNhcnRlc2lhbihjYXJ0ZXNpYW4pO1xuICAgICAgY2FydG9ncmFwaGljLmhlaWdodCA9IDA7XG4gICAgICByZXR1cm4gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbVJhZGlhbnMoY2FydG9ncmFwaGljLmxvbmdpdHVkZSwgY2FydG9ncmFwaGljLmxhdGl0dWRlLCBjYXJ0b2dyYXBoaWMuaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgbWlkZGxlQ2FydGVzaWFuM1BvaW50KHBvc2l0aW9uMDogQ2FydGVzaWFuMywgcG9zaXRpb24xOiBDYXJ0ZXNpYW4zKSB7XG4gICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FydGVzaWFuMyhwb3NpdGlvbjEueCAtIHBvc2l0aW9uMC54IC8gMiwgcG9zaXRpb24xLnkgLSBwb3NpdGlvbjAueSAvIDIsIHBvc2l0aW9uMS56IC0gcG9zaXRpb24wLnogLyAyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSkge1xuICB9XG5cbiAgc2NyZWVuUG9zaXRpb25Ub0NhcnRlc2lhbjMoc2NyZWVuUG9zOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmNlc2l1bVNlcnZpY2UuZ2V0Vmlld2VyKCkuY2FtZXJhO1xuICAgIHJldHVybiBjYW1lcmEucGlja0VsbGlwc29pZChzY3JlZW5Qb3MpO1xuICB9XG59XG4iXX0=