You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
496 lines
14 KiB
JavaScript
496 lines
14 KiB
JavaScript
import { ArcGISTiledElevationTerrainProvider } from "../../Source/Cesium.js";
|
|
import { DefaultProxy } from "../../Source/Cesium.js";
|
|
import { GeographicTilingScheme } from "../../Source/Cesium.js";
|
|
import { HeightmapTerrainData } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { Request } from "../../Source/Cesium.js";
|
|
import { RequestScheduler } from "../../Source/Cesium.js";
|
|
import { Resource } from "../../Source/Cesium.js";
|
|
import { RuntimeError } from "../../Source/Cesium.js";
|
|
import { TerrainProvider } from "../../Source/Cesium.js";
|
|
import { WebMercatorTilingScheme } from "../../Source/Cesium.js";
|
|
import pollToPromise from "../pollToPromise.js";
|
|
|
|
describe("Core/ArcGISTiledElevationTerrainProvider", function () {
|
|
var lercTileUrl = "Data/Images/Red16x16.png";
|
|
var availability;
|
|
var metadata;
|
|
|
|
beforeEach(function () {
|
|
availability = {
|
|
data: [],
|
|
};
|
|
availability.data.length = 128 * 128;
|
|
availability.data.fill(1);
|
|
|
|
metadata = {
|
|
currentVersion: 10.3,
|
|
serviceDescription: "Test",
|
|
name: "Test",
|
|
description: "Test",
|
|
extent: {
|
|
xmin: -2.0037507842788246e7,
|
|
ymin: -2.0037508659999996e7,
|
|
xmax: 2.0037509157211754e7,
|
|
ymax: 2.0037508340000004e7,
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
latestWkid: 3857,
|
|
},
|
|
},
|
|
bandCount: 1,
|
|
copyrightText:
|
|
"Source: USGS, NGA, NASA, CGIAR, GEBCO,N Robinson,NCEAS,NLS,OS,NMA,Geodatastyrelsen and the GIS User Community",
|
|
minValues: [-450],
|
|
maxValues: [8700],
|
|
capabilities: "Image,Tilemap,Mensuration",
|
|
tileInfo: {
|
|
rows: 256,
|
|
cols: 256,
|
|
format: "LERC",
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 156543.03392800014,
|
|
scale: 5.91657527591555e8,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 78271.51696399994,
|
|
scale: 2.95828763795777e8,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 39135.75848200009,
|
|
scale: 1.47914381897889e8,
|
|
},
|
|
{
|
|
level: 3,
|
|
resolution: 19567.87924099992,
|
|
scale: 7.3957190948944e7,
|
|
},
|
|
{
|
|
level: 4,
|
|
resolution: 9783.93962049996,
|
|
scale: 3.6978595474472e7,
|
|
},
|
|
{
|
|
level: 5,
|
|
resolution: 4891.96981024998,
|
|
scale: 1.8489297737236e7,
|
|
},
|
|
{
|
|
level: 6,
|
|
resolution: 2445.98490512499,
|
|
scale: 9244648.868618,
|
|
},
|
|
{
|
|
level: 7,
|
|
resolution: 1222.992452562495,
|
|
scale: 4622324.434309,
|
|
},
|
|
{
|
|
level: 8,
|
|
resolution: 611.4962262813797,
|
|
scale: 2311162.217155,
|
|
},
|
|
{
|
|
level: 9,
|
|
resolution: 305.74811314055756,
|
|
scale: 1155581.108577,
|
|
},
|
|
{
|
|
level: 10,
|
|
resolution: 152.87405657041106,
|
|
scale: 577790.554289,
|
|
},
|
|
{
|
|
level: 11,
|
|
resolution: 76.43702828507324,
|
|
scale: 288895.277144,
|
|
},
|
|
{
|
|
level: 12,
|
|
resolution: 38.21851414253662,
|
|
scale: 144447.638572,
|
|
},
|
|
{
|
|
level: 13,
|
|
resolution: 19.10925707126831,
|
|
scale: 72223.819286,
|
|
},
|
|
{
|
|
level: 14,
|
|
resolution: 9.554628535634155,
|
|
scale: 36111.909643,
|
|
},
|
|
{
|
|
level: 15,
|
|
resolution: 4.77731426794937,
|
|
scale: 18055.954822,
|
|
},
|
|
{
|
|
level: 16,
|
|
resolution: 2.388657133974685,
|
|
scale: 9027.977411,
|
|
},
|
|
],
|
|
},
|
|
spatialReference: {
|
|
wkid: 3857,
|
|
latestWkid: 3857,
|
|
},
|
|
};
|
|
|
|
RequestScheduler.clearForSpecs();
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
// Tile request
|
|
if (url.indexOf("/tile/") !== -1) {
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
lercTileUrl,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
);
|
|
return;
|
|
}
|
|
|
|
// Availability request
|
|
if (url.indexOf("/tilemap/") !== -1) {
|
|
setTimeout(function () {
|
|
deferred.resolve(JSON.stringify(availability));
|
|
}, 1);
|
|
return;
|
|
}
|
|
|
|
// Metadata
|
|
setTimeout(function () {
|
|
deferred.resolve(JSON.stringify(metadata));
|
|
}, 1);
|
|
};
|
|
});
|
|
|
|
afterEach(function () {
|
|
Resource._Implementations.createImage =
|
|
Resource._DefaultImplementations.createImage;
|
|
Resource._Implementations.loadWithXhr =
|
|
Resource._DefaultImplementations.loadWithXhr;
|
|
});
|
|
|
|
function createRequest() {
|
|
return new Request({
|
|
throttleByServer: true,
|
|
});
|
|
}
|
|
|
|
it("conforms to TerrainProvider interface", function () {
|
|
expect(ArcGISTiledElevationTerrainProvider).toConformToInterface(
|
|
TerrainProvider
|
|
);
|
|
});
|
|
|
|
it("constructor throws if url is not provided", function () {
|
|
expect(function () {
|
|
return new ArcGISTiledElevationTerrainProvider();
|
|
}).toThrowDeveloperError();
|
|
|
|
expect(function () {
|
|
return new ArcGISTiledElevationTerrainProvider({});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("resolves readyPromise", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
|
|
return provider.readyPromise.then(function (result) {
|
|
expect(result).toBe(true);
|
|
expect(provider.ready).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("resolves readyPromise with Resource", function () {
|
|
var resource = new Resource({
|
|
url: "made/up/url",
|
|
});
|
|
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: resource,
|
|
});
|
|
|
|
return provider.readyPromise.then(function (result) {
|
|
expect(result).toBe(true);
|
|
expect(provider.ready).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("has error event", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
expect(provider.errorEvent).toBeDefined();
|
|
expect(provider.errorEvent).toBe(provider.errorEvent);
|
|
});
|
|
|
|
it("returns reasonable geometric error for various levels", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.getLevelMaximumGeometricError(0)).toBeGreaterThan(0.0);
|
|
expect(provider.getLevelMaximumGeometricError(0)).toEqualEpsilon(
|
|
provider.getLevelMaximumGeometricError(1) * 2.0,
|
|
CesiumMath.EPSILON10
|
|
);
|
|
expect(provider.getLevelMaximumGeometricError(1)).toEqualEpsilon(
|
|
provider.getLevelMaximumGeometricError(2) * 2.0,
|
|
CesiumMath.EPSILON10
|
|
);
|
|
});
|
|
});
|
|
|
|
it("getLevelMaximumGeometricError must not be called before isReady returns true", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
|
|
expect(function () {
|
|
provider.getLevelMaximumGeometricError(0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("getTilingScheme must not be called before isReady returns true", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
|
|
expect(function () {
|
|
return provider.tilingScheme;
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("logo is undefined if credit is not provided", function () {
|
|
delete metadata.copyrightText;
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.credit).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
it("logo is defined if credit is provided", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
credit: "thanks to our awesome made up contributors!",
|
|
});
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.credit).toBeDefined();
|
|
});
|
|
});
|
|
|
|
it("does not have a water mask", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
expect(provider.hasWaterMask).toBe(false);
|
|
});
|
|
|
|
it("is not ready immediately", function () {
|
|
var provider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
});
|
|
expect(provider.ready).toBe(false);
|
|
});
|
|
|
|
it("detects WebMercator tiling scheme", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return terrainProvider.ready;
|
|
}).then(function () {
|
|
expect(terrainProvider.tilingScheme).toBeInstanceOf(
|
|
WebMercatorTilingScheme
|
|
);
|
|
});
|
|
});
|
|
|
|
it("detects Geographic tiling scheme", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
metadata.spatialReference.latestWkid = 4326;
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return terrainProvider.ready;
|
|
}).then(function () {
|
|
expect(terrainProvider.tilingScheme).toBeInstanceOf(
|
|
GeographicTilingScheme
|
|
);
|
|
});
|
|
});
|
|
|
|
it("raises an error if the SRS is not supported", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
metadata.spatialReference.latestWkid = 1234;
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return terrainProvider.readyPromise.then(fail).otherwise(function (error) {
|
|
expect(error).toBeInstanceOf(RuntimeError);
|
|
});
|
|
});
|
|
|
|
it("raises an error if tileInfo missing", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
delete metadata.tileInfo;
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return terrainProvider.readyPromise.then(fail).otherwise(function (error) {
|
|
expect(error).toBeInstanceOf(RuntimeError);
|
|
});
|
|
});
|
|
|
|
it("checks availability if TileMap capability exists", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return terrainProvider.ready;
|
|
}).then(function () {
|
|
expect(terrainProvider._hasAvailability).toBe(true);
|
|
expect(terrainProvider._tilesAvailable).toBeDefined();
|
|
expect(terrainProvider._tilesAvailablityLoaded).toBeDefined();
|
|
});
|
|
});
|
|
|
|
it("does not check availability if TileMap capability is missing", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
metadata.capabilities = "Image,Mensuration";
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return terrainProvider.ready;
|
|
}).then(function () {
|
|
expect(terrainProvider._hasAvailability).toBe(false);
|
|
expect(terrainProvider._tilesAvailable).toBeUndefined();
|
|
expect(terrainProvider._tilesAvailablityLoaded).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
describe("requestTileGeometry", function () {
|
|
it("must not be called before isReady returns true", function () {
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: "made/up/url",
|
|
proxy: new DefaultProxy("/proxy/"),
|
|
});
|
|
|
|
expect(function () {
|
|
terrainProvider.requestTileGeometry(0, 0, 0);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("provides HeightmapTerrainData", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return terrainProvider.ready;
|
|
})
|
|
.then(function () {
|
|
var promise = terrainProvider.requestTileGeometry(0, 0, 0);
|
|
RequestScheduler.update();
|
|
return promise;
|
|
})
|
|
.then(function (loadedData) {
|
|
expect(loadedData).toBeInstanceOf(HeightmapTerrainData);
|
|
});
|
|
});
|
|
|
|
it("returns undefined if too many requests are already in progress", function () {
|
|
var baseUrl = "made/up/url";
|
|
|
|
var deferreds = [];
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
// Do nothing, so requests never complete
|
|
deferreds.push(deferred);
|
|
};
|
|
|
|
var terrainProvider = new ArcGISTiledElevationTerrainProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return terrainProvider.ready;
|
|
}).then(function () {
|
|
var promise;
|
|
var i;
|
|
for (i = 0; i < RequestScheduler.maximumRequestsPerServer; ++i) {
|
|
var request = new Request({
|
|
throttle: true,
|
|
throttleByServer: true,
|
|
});
|
|
promise = terrainProvider.requestTileGeometry(0, 0, 0, request);
|
|
}
|
|
RequestScheduler.update();
|
|
expect(promise).toBeDefined();
|
|
|
|
promise = terrainProvider.requestTileGeometry(0, 0, 0, createRequest());
|
|
expect(promise).toBeUndefined();
|
|
|
|
for (i = 0; i < deferreds.length; ++i) {
|
|
deferreds[i].resolve();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|