angular-cesium
Version:
Angular library for working with Cesium.
90 lines • 16.1 kB
JavaScript
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=