123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import defined from "../Core/defined.js";
- import Rectangle from "../Core/Rectangle.js";
- import sampleTerrainMostDetailed from "../Core/sampleTerrainMostDetailed.js";
- import when from "../ThirdParty/when.js";
- import SceneMode from "./SceneMode.js";
- function computeFlyToLocationForRectangle(rectangle, scene) {
- var terrainProvider = scene.terrainProvider;
- var mapProjection = scene.mapProjection;
- var ellipsoid = mapProjection.ellipsoid;
- var positionWithoutTerrain;
- var tmp = scene.camera.getRectangleCameraCoordinates(rectangle);
- if (scene.mode === SceneMode.SCENE3D) {
- positionWithoutTerrain = ellipsoid.cartesianToCartographic(tmp);
- } else {
- positionWithoutTerrain = mapProjection.unproject(tmp);
- }
- if (!defined(terrainProvider)) {
- return when.resolve(positionWithoutTerrain);
- }
- return terrainProvider.readyPromise.then(function () {
- var availability = terrainProvider.availability;
- if (!defined(availability) || scene.mode === SceneMode.SCENE2D) {
- return positionWithoutTerrain;
- }
- var cartographics = [
- Rectangle.center(rectangle),
- Rectangle.southeast(rectangle),
- Rectangle.southwest(rectangle),
- Rectangle.northeast(rectangle),
- Rectangle.northwest(rectangle),
- ];
- return computeFlyToLocationForRectangle
- ._sampleTerrainMostDetailed(terrainProvider, cartographics)
- .then(function (positionsOnTerrain) {
- var maxHeight = positionsOnTerrain.reduce(function (currentMax, item) {
- return Math.max(item.height, currentMax);
- }, -Number.MAX_VALUE);
- var finalPosition = positionWithoutTerrain;
- finalPosition.height += maxHeight;
- return finalPosition;
- });
- });
- }
- computeFlyToLocationForRectangle._sampleTerrainMostDetailed = sampleTerrainMostDetailed;
- export default computeFlyToLocationForRectangle;
|