| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | import defined from "../Core/defined.js";import Rectangle from "../Core/Rectangle.js";import sampleTerrainMostDetailed from "../Core/sampleTerrainMostDetailed.js";import SceneMode from "./SceneMode.js";/** * Computes the final camera location to view a rectangle adjusted for the current terrain. * If the terrain does not support availability, the height above the ellipsoid is used. * * @param {Rectangle} rectangle The rectangle being zoomed to. * @param {Scene} scene The scene being used. * * @returns {Cartographic} The optimal location to place the camera so that the entire rectangle is in view. * * @private */function computeFlyToLocationForRectangle(rectangle, scene) {  const terrainProvider = scene.terrainProvider;  const mapProjection = scene.mapProjection;  const ellipsoid = mapProjection.ellipsoid;  let positionWithoutTerrain;  const tmp = scene.camera.getRectangleCameraCoordinates(rectangle);  if (scene.mode === SceneMode.SCENE3D) {    positionWithoutTerrain = ellipsoid.cartesianToCartographic(tmp);  } else {    positionWithoutTerrain = mapProjection.unproject(tmp);  }  if (!defined(terrainProvider)) {    return Promise.resolve(positionWithoutTerrain);  }  return terrainProvider.readyPromise.then(function () {    const availability = terrainProvider.availability;    if (!defined(availability) || scene.mode === SceneMode.SCENE2D) {      return positionWithoutTerrain;    }    const cartographics = [      Rectangle.center(rectangle),      Rectangle.southeast(rectangle),      Rectangle.southwest(rectangle),      Rectangle.northeast(rectangle),      Rectangle.northwest(rectangle),    ];    return computeFlyToLocationForRectangle      ._sampleTerrainMostDetailed(terrainProvider, cartographics)      .then(function (positionsOnTerrain) {        const maxHeight = positionsOnTerrain.reduce(function (          currentMax,          item        ) {          return Math.max(item.height, currentMax);        },        -Number.MAX_VALUE);        const finalPosition = positionWithoutTerrain;        finalPosition.height += maxHeight;        return finalPosition;      });  });}//Exposed for testing.computeFlyToLocationForRectangle._sampleTerrainMostDetailed = sampleTerrainMostDetailed;export default computeFlyToLocationForRectangle;
 |