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;
|