123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587 |
- import defaultValue from "../Core/defaultValue.js";
- import defined from "../Core/defined.js";
- import destroyObject from "../Core/destroyObject.js";
- import DeveloperError from "../Core/DeveloperError.js";
- import Event from "../Core/Event.js";
- import CesiumMath from "../Core/Math.js";
- import Rectangle from "../Core/Rectangle.js";
- import when from "../ThirdParty/when.js";
- import ImageryLayer from "./ImageryLayer.js";
- function ImageryLayerCollection() {
- this._layers = [];
-
- this.layerAdded = new Event();
-
- this.layerRemoved = new Event();
-
- this.layerMoved = new Event();
-
- this.layerShownOrHidden = new Event();
- }
- Object.defineProperties(ImageryLayerCollection.prototype, {
-
- length: {
- get: function () {
- return this._layers.length;
- },
- },
- });
- ImageryLayerCollection.prototype.add = function (layer, index) {
- var hasIndex = defined(index);
-
- if (!defined(layer)) {
- throw new DeveloperError("layer is required.");
- }
- if (hasIndex) {
- if (index < 0) {
- throw new DeveloperError("index must be greater than or equal to zero.");
- } else if (index > this._layers.length) {
- throw new DeveloperError(
- "index must be less than or equal to the number of layers."
- );
- }
- }
-
- if (!hasIndex) {
- index = this._layers.length;
- this._layers.push(layer);
- } else {
- this._layers.splice(index, 0, layer);
- }
- this._update();
- this.layerAdded.raiseEvent(layer, index);
- };
- ImageryLayerCollection.prototype.addImageryProvider = function (
- imageryProvider,
- index
- ) {
-
- if (!defined(imageryProvider)) {
- throw new DeveloperError("imageryProvider is required.");
- }
-
- var layer = new ImageryLayer(imageryProvider);
- this.add(layer, index);
- return layer;
- };
- ImageryLayerCollection.prototype.remove = function (layer, destroy) {
- destroy = defaultValue(destroy, true);
- var index = this._layers.indexOf(layer);
- if (index !== -1) {
- this._layers.splice(index, 1);
- this._update();
- this.layerRemoved.raiseEvent(layer, index);
- if (destroy) {
- layer.destroy();
- }
- return true;
- }
- return false;
- };
- ImageryLayerCollection.prototype.removeAll = function (destroy) {
- destroy = defaultValue(destroy, true);
- var layers = this._layers;
- for (var i = 0, len = layers.length; i < len; i++) {
- var layer = layers[i];
- this.layerRemoved.raiseEvent(layer, i);
- if (destroy) {
- layer.destroy();
- }
- }
- this._layers = [];
- };
- ImageryLayerCollection.prototype.contains = function (layer) {
- return this.indexOf(layer) !== -1;
- };
- ImageryLayerCollection.prototype.indexOf = function (layer) {
- return this._layers.indexOf(layer);
- };
- ImageryLayerCollection.prototype.get = function (index) {
-
- if (!defined(index)) {
- throw new DeveloperError("index is required.", "index");
- }
-
- return this._layers[index];
- };
- function getLayerIndex(layers, layer) {
-
- if (!defined(layer)) {
- throw new DeveloperError("layer is required.");
- }
-
- var index = layers.indexOf(layer);
-
- if (index === -1) {
- throw new DeveloperError("layer is not in this collection.");
- }
-
- return index;
- }
- function swapLayers(collection, i, j) {
- var arr = collection._layers;
- i = CesiumMath.clamp(i, 0, arr.length - 1);
- j = CesiumMath.clamp(j, 0, arr.length - 1);
- if (i === j) {
- return;
- }
- var temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- collection._update();
- collection.layerMoved.raiseEvent(temp, j, i);
- }
- ImageryLayerCollection.prototype.raise = function (layer) {
- var index = getLayerIndex(this._layers, layer);
- swapLayers(this, index, index + 1);
- };
- ImageryLayerCollection.prototype.lower = function (layer) {
- var index = getLayerIndex(this._layers, layer);
- swapLayers(this, index, index - 1);
- };
- ImageryLayerCollection.prototype.raiseToTop = function (layer) {
- var index = getLayerIndex(this._layers, layer);
- if (index === this._layers.length - 1) {
- return;
- }
- this._layers.splice(index, 1);
- this._layers.push(layer);
- this._update();
- this.layerMoved.raiseEvent(layer, this._layers.length - 1, index);
- };
- ImageryLayerCollection.prototype.lowerToBottom = function (layer) {
- var index = getLayerIndex(this._layers, layer);
- if (index === 0) {
- return;
- }
- this._layers.splice(index, 1);
- this._layers.splice(0, 0, layer);
- this._update();
- this.layerMoved.raiseEvent(layer, 0, index);
- };
- var applicableRectangleScratch = new Rectangle();
- ImageryLayerCollection.prototype.pickImageryLayerFeatures = function (
- ray,
- scene
- ) {
-
- var pickedPosition = scene.globe.pick(ray, scene);
- if (!defined(pickedPosition)) {
- return undefined;
- }
- var pickedLocation = scene.globe.ellipsoid.cartesianToCartographic(
- pickedPosition
- );
-
- var tilesToRender = scene.globe._surface._tilesToRender;
- var pickedTile;
- for (
- var textureIndex = 0;
- !defined(pickedTile) && textureIndex < tilesToRender.length;
- ++textureIndex
- ) {
- var tile = tilesToRender[textureIndex];
- if (Rectangle.contains(tile.rectangle, pickedLocation)) {
- pickedTile = tile;
- }
- }
- if (!defined(pickedTile)) {
- return undefined;
- }
-
- var imageryTiles = pickedTile.data.imagery;
- var promises = [];
- var imageryLayers = [];
- for (var i = imageryTiles.length - 1; i >= 0; --i) {
- var terrainImagery = imageryTiles[i];
- var imagery = terrainImagery.readyImagery;
- if (!defined(imagery)) {
- continue;
- }
- var provider = imagery.imageryLayer.imageryProvider;
- if (!defined(provider.pickFeatures)) {
- continue;
- }
- if (!Rectangle.contains(imagery.rectangle, pickedLocation)) {
- continue;
- }
-
-
- var applicableRectangle = applicableRectangleScratch;
- var epsilon = 1 / 1024;
- applicableRectangle.west = CesiumMath.lerp(
- pickedTile.rectangle.west,
- pickedTile.rectangle.east,
- terrainImagery.textureCoordinateRectangle.x - epsilon
- );
- applicableRectangle.east = CesiumMath.lerp(
- pickedTile.rectangle.west,
- pickedTile.rectangle.east,
- terrainImagery.textureCoordinateRectangle.z + epsilon
- );
- applicableRectangle.south = CesiumMath.lerp(
- pickedTile.rectangle.south,
- pickedTile.rectangle.north,
- terrainImagery.textureCoordinateRectangle.y - epsilon
- );
- applicableRectangle.north = CesiumMath.lerp(
- pickedTile.rectangle.south,
- pickedTile.rectangle.north,
- terrainImagery.textureCoordinateRectangle.w + epsilon
- );
- if (!Rectangle.contains(applicableRectangle, pickedLocation)) {
- continue;
- }
- var promise = provider.pickFeatures(
- imagery.x,
- imagery.y,
- imagery.level,
- pickedLocation.longitude,
- pickedLocation.latitude
- );
- if (!defined(promise)) {
- continue;
- }
- promises.push(promise);
- imageryLayers.push(imagery.imageryLayer);
- }
- if (promises.length === 0) {
- return undefined;
- }
- return when.all(promises, function (results) {
- var features = [];
- for (var resultIndex = 0; resultIndex < results.length; ++resultIndex) {
- var result = results[resultIndex];
- var image = imageryLayers[resultIndex];
- if (defined(result) && result.length > 0) {
- for (
- var featureIndex = 0;
- featureIndex < result.length;
- ++featureIndex
- ) {
- var feature = result[featureIndex];
- feature.imageryLayer = image;
-
- if (!defined(feature.position)) {
- feature.position = pickedLocation;
- }
- features.push(feature);
- }
- }
- }
- return features;
- });
- };
- ImageryLayerCollection.prototype.queueReprojectionCommands = function (
- frameState
- ) {
- var layers = this._layers;
- for (var i = 0, len = layers.length; i < len; ++i) {
- layers[i].queueReprojectionCommands(frameState);
- }
- };
- ImageryLayerCollection.prototype.cancelReprojections = function () {
- var layers = this._layers;
- for (var i = 0, len = layers.length; i < len; ++i) {
- layers[i].cancelReprojections();
- }
- };
- ImageryLayerCollection.prototype.isDestroyed = function () {
- return false;
- };
- ImageryLayerCollection.prototype.destroy = function () {
- this.removeAll(true);
- return destroyObject(this);
- };
- ImageryLayerCollection.prototype._update = function () {
- var isBaseLayer = true;
- var layers = this._layers;
- var layersShownOrHidden;
- var layer;
- var i, len;
- for (i = 0, len = layers.length; i < len; ++i) {
- layer = layers[i];
- layer._layerIndex = i;
- if (layer.show) {
- layer._isBaseLayer = isBaseLayer;
- isBaseLayer = false;
- } else {
- layer._isBaseLayer = false;
- }
- if (layer.show !== layer._show) {
- if (defined(layer._show)) {
- if (!defined(layersShownOrHidden)) {
- layersShownOrHidden = [];
- }
- layersShownOrHidden.push(layer);
- }
- layer._show = layer.show;
- }
- }
- if (defined(layersShownOrHidden)) {
- for (i = 0, len = layersShownOrHidden.length; i < len; ++i) {
- layer = layersShownOrHidden[i];
- this.layerShownOrHidden.raiseEvent(layer, layer._layerIndex, layer.show);
- }
- }
- };
- export default ImageryLayerCollection;
|