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.
1226 lines
33 KiB
JavaScript
1226 lines
33 KiB
JavaScript
import { appendForwardSlash } from "../../Source/Cesium.js";
|
|
import { Cartesian2 } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { Cartographic } from "../../Source/Cesium.js";
|
|
import { defined } from "../../Source/Cesium.js";
|
|
import { GeographicTilingScheme } from "../../Source/Cesium.js";
|
|
import { getAbsoluteUri } from "../../Source/Cesium.js";
|
|
import { objectToQuery } from "../../Source/Cesium.js";
|
|
import { queryToObject } from "../../Source/Cesium.js";
|
|
import { Rectangle } from "../../Source/Cesium.js";
|
|
import { Request } from "../../Source/Cesium.js";
|
|
import { RequestScheduler } from "../../Source/Cesium.js";
|
|
import { Resource } from "../../Source/Cesium.js";
|
|
import { WebMercatorProjection } from "../../Source/Cesium.js";
|
|
import { WebMercatorTilingScheme } from "../../Source/Cesium.js";
|
|
import { ArcGisMapServerImageryProvider } from "../../Source/Cesium.js";
|
|
import { DiscardMissingTileImagePolicy } from "../../Source/Cesium.js";
|
|
import { Imagery } from "../../Source/Cesium.js";
|
|
import { ImageryLayer } from "../../Source/Cesium.js";
|
|
import { ImageryLayerFeatureInfo } from "../../Source/Cesium.js";
|
|
import { ImageryProvider } from "../../Source/Cesium.js";
|
|
import { ImageryState } from "../../Source/Cesium.js";
|
|
import pollToPromise from "../pollToPromise.js";
|
|
import { Uri } from "../../Source/Cesium.js";
|
|
|
|
describe("Scene/ArcGisMapServerImageryProvider", function () {
|
|
var supportsImageBitmapOptions;
|
|
beforeAll(function () {
|
|
// This suite spies on requests. Resource.supportsImageBitmapOptions needs to make a request to a data URI.
|
|
// We run it here to avoid interfering with the tests.
|
|
return Resource.supportsImageBitmapOptions().then(function (result) {
|
|
supportsImageBitmapOptions = result;
|
|
});
|
|
});
|
|
|
|
beforeEach(function () {
|
|
RequestScheduler.clearForSpecs();
|
|
});
|
|
|
|
afterEach(function () {
|
|
Resource._Implementations.loadAndExecuteScript =
|
|
Resource._DefaultImplementations.loadAndExecuteScript;
|
|
Resource._Implementations.createImage =
|
|
Resource._DefaultImplementations.createImage;
|
|
Resource._Implementations.loadWithXhr =
|
|
Resource._DefaultImplementations.loadWithXhr;
|
|
});
|
|
|
|
function expectCorrectUrl(
|
|
expectedBaseUrl,
|
|
actualUrl,
|
|
functionName,
|
|
withProxy,
|
|
token
|
|
) {
|
|
var uri = new Uri(actualUrl);
|
|
|
|
if (withProxy) {
|
|
uri = new Uri(decodeURIComponent(uri.query));
|
|
}
|
|
|
|
var params = queryToObject(uri.query);
|
|
|
|
var uriWithoutQuery = new Uri(uri);
|
|
uriWithoutQuery.query = "";
|
|
|
|
expect(uriWithoutQuery.toString()).toEqual(
|
|
appendForwardSlash(expectedBaseUrl)
|
|
);
|
|
|
|
var expectedParams = {
|
|
callback: functionName,
|
|
f: "json",
|
|
};
|
|
if (defined(token)) {
|
|
expectedParams.token = token;
|
|
}
|
|
expect(params).toEqual(expectedParams);
|
|
}
|
|
|
|
function stubJSONPCall(baseUrl, result, withProxy, token) {
|
|
Resource._Implementations.loadAndExecuteScript = function (
|
|
url,
|
|
functionName
|
|
) {
|
|
expectCorrectUrl(baseUrl, url, functionName, withProxy, token);
|
|
setTimeout(function () {
|
|
window[functionName](result);
|
|
}, 1);
|
|
};
|
|
}
|
|
|
|
it("conforms to ImageryProvider interface", function () {
|
|
expect(ArcGisMapServerImageryProvider).toConformToInterface(
|
|
ImageryProvider
|
|
);
|
|
});
|
|
|
|
it("constructor throws if url is not specified", function () {
|
|
expect(function () {
|
|
return new ArcGisMapServerImageryProvider({});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
var webMercatorResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -20037508.342787,
|
|
y: 20037508.342787,
|
|
},
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 156543.033928,
|
|
scale: 591657527.591555,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 78271.5169639999,
|
|
scale: 295828763.795777,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 39135.7584820001,
|
|
scale: 147914381.897889,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
it("resolves readyPromise", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid";
|
|
|
|
stubJSONPCall(baseUrl, webMercatorResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return provider.readyPromise.then(function (result) {
|
|
expect(result).toBe(true);
|
|
expect(provider.ready).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("resolves readyPromise with Resource", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid";
|
|
|
|
stubJSONPCall(baseUrl, webMercatorResult);
|
|
|
|
var resource = new Resource({
|
|
url: baseUrl,
|
|
});
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: resource,
|
|
});
|
|
|
|
return provider.readyPromise.then(function (result) {
|
|
expect(result).toBe(true);
|
|
expect(provider.ready).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("rejects readyPromise on error", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid";
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
return provider.readyPromise
|
|
.then(function () {
|
|
fail("should not resolve");
|
|
})
|
|
.otherwise(function (e) {
|
|
expect(e.message).toContain(baseUrl);
|
|
expect(provider.ready).toBe(false);
|
|
});
|
|
});
|
|
|
|
it("supports tiled servers in web mercator projection", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
stubJSONPCall(baseUrl, webMercatorResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.tileWidth).toEqual(128);
|
|
expect(provider.tileHeight).toEqual(256);
|
|
expect(provider.maximumLevel).toEqual(2);
|
|
expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme);
|
|
expect(provider.credit).toBeDefined();
|
|
expect(provider.tileDiscardPolicy).toBeInstanceOf(
|
|
DiscardMissingTileImagePolicy
|
|
);
|
|
expect(provider.rectangle).toEqual(
|
|
new WebMercatorTilingScheme().rectangle
|
|
);
|
|
expect(provider.usingPrecachedTiles).toEqual(true);
|
|
expect(provider.hasAlphaChannel).toBeDefined();
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
var url = request.url;
|
|
if (/^blob:/.test(url)) {
|
|
Resource._DefaultImplementations.createImage(
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
} else {
|
|
expect(url).toEqual(getAbsoluteUri(baseUrl + "tile/0/0/0"));
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.createImage(
|
|
new Request({ url: "Data/Images/Red16x16.png" }),
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
}
|
|
};
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
expect(url).toEqual(getAbsoluteUri(baseUrl + "tile/0/0/0"));
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/Images/Red16x16.png",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred
|
|
);
|
|
};
|
|
|
|
return provider.requestImage(0, 0, 0).then(function (image) {
|
|
expect(image).toBeImageOrImageBitmap();
|
|
});
|
|
});
|
|
});
|
|
|
|
var geographicResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -180,
|
|
y: 90,
|
|
},
|
|
spatialReference: {
|
|
wkid: 4326,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 0.3515625,
|
|
scale: 147748799.285417,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 0.17578125,
|
|
scale: 73874399.6427087,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 0.087890625,
|
|
scale: 36937199.8213544,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
it("supports tiled servers in geographic projection", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
stubJSONPCall(baseUrl, geographicResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.tileWidth).toEqual(128);
|
|
expect(provider.tileHeight).toEqual(256);
|
|
expect(provider.maximumLevel).toEqual(2);
|
|
expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme);
|
|
expect(provider.credit).toBeDefined();
|
|
expect(provider.tileDiscardPolicy).toBeInstanceOf(
|
|
DiscardMissingTileImagePolicy
|
|
);
|
|
expect(provider.rectangle).toEqual(
|
|
new GeographicTilingScheme().rectangle
|
|
);
|
|
expect(provider.usingPrecachedTiles).toEqual(true);
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
var url = request.url;
|
|
if (/^blob:/.test(url) || supportsImageBitmapOptions) {
|
|
// If ImageBitmap is supported, we expect a loadWithXhr request to fetch it as a blob.
|
|
Resource._DefaultImplementations.createImage(
|
|
request,
|
|
crossOrigin,
|
|
deferred,
|
|
true,
|
|
true
|
|
);
|
|
} else {
|
|
expect(url).toEqual(getAbsoluteUri(baseUrl + "tile/0/0/0"));
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.createImage(
|
|
new Request({ url: "Data/Images/Red16x16.png" }),
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
}
|
|
};
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
expect(url).toEqual(getAbsoluteUri(baseUrl + "tile/0/0/0"));
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/Images/Red16x16.png",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred
|
|
);
|
|
};
|
|
|
|
return provider.requestImage(0, 0, 0).then(function (image) {
|
|
expect(image).toBeImageOrImageBitmap();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("supports non-tiled servers", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
stubJSONPCall(baseUrl, {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
});
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.tileWidth).toEqual(256);
|
|
expect(provider.tileHeight).toEqual(256);
|
|
expect(provider.maximumLevel).toBeUndefined();
|
|
expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme);
|
|
expect(provider.credit).toBeDefined();
|
|
expect(provider.tileDiscardPolicy).toBeUndefined();
|
|
expect(provider.rectangle).toEqual(
|
|
new GeographicTilingScheme().rectangle
|
|
);
|
|
expect(provider.usingPrecachedTiles).toEqual(false);
|
|
expect(provider.enablePickFeatures).toBe(true);
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
var uri = new Uri(request.url);
|
|
var params = queryToObject(uri.query);
|
|
|
|
var uriWithoutQuery = new Uri(uri);
|
|
uriWithoutQuery.query = "";
|
|
|
|
expect(uriWithoutQuery.toString()).toEqual(
|
|
getAbsoluteUri(baseUrl + "export")
|
|
);
|
|
|
|
expect(params.f).toEqual("image");
|
|
expect(params.bboxSR).toEqual("4326");
|
|
expect(params.imageSR).toEqual("4326");
|
|
expect(params.format).toEqual("png32");
|
|
expect(params.transparent).toEqual("true");
|
|
expect(params.size).toEqual("256,256");
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.createImage(
|
|
new Request({ url: "Data/Images/Red16x16.png" }),
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
};
|
|
|
|
return provider.requestImage(0, 0, 0).then(function (image) {
|
|
expect(image).toBeImageOrImageBitmap();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("supports non-tiled servers with various constructor parameters", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
var token = "5e(u|2!7Y";
|
|
|
|
stubJSONPCall(
|
|
baseUrl,
|
|
{
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
},
|
|
undefined,
|
|
token
|
|
);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
token: token,
|
|
tileWidth: 128,
|
|
tileHeight: 512,
|
|
tilingScheme: new WebMercatorTilingScheme(),
|
|
rectangle: Rectangle.fromDegrees(1.0, 2.0, 3.0, 4.0),
|
|
layers: "foo,bar",
|
|
enablePickFeatures: false,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.tileWidth).toEqual(128);
|
|
expect(provider.tileHeight).toEqual(512);
|
|
expect(provider.maximumLevel).toBeUndefined();
|
|
expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme);
|
|
expect(provider.credit).toBeDefined();
|
|
expect(provider.tileDiscardPolicy).toBeUndefined();
|
|
expect(provider.rectangle).toEqual(
|
|
Rectangle.fromDegrees(1.0, 2.0, 3.0, 4.0)
|
|
);
|
|
expect(provider.usingPrecachedTiles).toBe(false);
|
|
expect(provider.enablePickFeatures).toBe(false);
|
|
expect(provider.layers).toEqual("foo,bar");
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
var uri = new Uri(request.url);
|
|
var params = queryToObject(uri.query);
|
|
|
|
var uriWithoutQuery = new Uri(uri);
|
|
uriWithoutQuery.query = "";
|
|
|
|
expect(uriWithoutQuery.toString()).toEqual(
|
|
getAbsoluteUri(baseUrl + "export")
|
|
);
|
|
|
|
expect(params.f).toEqual("image");
|
|
expect(params.bboxSR).toEqual("3857");
|
|
expect(params.imageSR).toEqual("3857");
|
|
expect(params.format).toEqual("png32");
|
|
expect(params.transparent).toEqual("true");
|
|
expect(params.size).toEqual("128,512");
|
|
expect(params.layers).toEqual("show:foo,bar");
|
|
expect(params.token).toEqual(token);
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.createImage(
|
|
new Request({ url: "Data/Images/Red16x16.png" }),
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
};
|
|
|
|
return provider.requestImage(0, 0, 0).then(function (image) {
|
|
expect(image).toBeImageOrImageBitmap();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("includes security token in requests if one is specified", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/",
|
|
token = "5e(u|2!7Y";
|
|
|
|
stubJSONPCall(baseUrl, webMercatorResult, false, token);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
token: token,
|
|
});
|
|
|
|
var expectedTileUrl = getAbsoluteUri(
|
|
baseUrl +
|
|
"tile/0/0/0?" +
|
|
objectToQuery({
|
|
token: token,
|
|
})
|
|
);
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
expect(provider.token).toEqual(token);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.tileWidth).toEqual(128);
|
|
expect(provider.tileHeight).toEqual(256);
|
|
expect(provider.maximumLevel).toEqual(2);
|
|
expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme);
|
|
expect(provider.credit).toBeDefined();
|
|
expect(provider.tileDiscardPolicy).toBeInstanceOf(
|
|
DiscardMissingTileImagePolicy
|
|
);
|
|
expect(provider.rectangle).toEqual(
|
|
new WebMercatorTilingScheme().rectangle
|
|
);
|
|
expect(provider.usingPrecachedTiles).toEqual(true);
|
|
expect(provider.hasAlphaChannel).toBeDefined();
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
var url = request.url;
|
|
if (/^blob:/.test(url) || supportsImageBitmapOptions) {
|
|
// If ImageBitmap is supported, we expect a loadWithXhr request to fetch it as a blob.
|
|
Resource._DefaultImplementations.createImage(
|
|
request,
|
|
crossOrigin,
|
|
deferred,
|
|
true,
|
|
true
|
|
);
|
|
} else {
|
|
expect(url).toEqual(expectedTileUrl);
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.createImage(
|
|
new Request({ url: "Data/Images/Red16x16.png" }),
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
}
|
|
};
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
expect(url).toEqual(expectedTileUrl);
|
|
|
|
// Just return any old image.
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/Images/Red16x16.png",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred
|
|
);
|
|
};
|
|
|
|
return provider.requestImage(0, 0, 0).then(function (image) {
|
|
expect(image).toBeImageOrImageBitmap();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("raises error on unsupported WKID", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
var unsupportedWKIDResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -180,
|
|
y: 90,
|
|
},
|
|
spatialReference: {
|
|
wkid: 1234,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 0.3515625,
|
|
scale: 147748799.285417,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 0.17578125,
|
|
scale: 73874399.6427087,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 0.087890625,
|
|
scale: 36937199.8213544,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
stubJSONPCall(baseUrl, unsupportedWKIDResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
var tries = 0;
|
|
provider.errorEvent.addEventListener(function (error) {
|
|
expect(error.message.indexOf("WKID") >= 0).toEqual(true);
|
|
++tries;
|
|
if (tries < 3) {
|
|
error.retry = true;
|
|
}
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready || tries >= 3;
|
|
}).then(function () {
|
|
expect(provider.ready).toEqual(false);
|
|
expect(tries).toEqual(3);
|
|
});
|
|
});
|
|
|
|
it("raises error on invalid URL", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
var errorEventRaised = false;
|
|
provider.errorEvent.addEventListener(function (error) {
|
|
expect(error.message.indexOf(baseUrl) >= 0).toEqual(true);
|
|
errorEventRaised = true;
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready || errorEventRaised;
|
|
}).then(function () {
|
|
expect(provider.ready).toEqual(false);
|
|
expect(errorEventRaised).toEqual(true);
|
|
});
|
|
});
|
|
|
|
it("raises error event when image cannot be loaded", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
stubJSONPCall(baseUrl, {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
});
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
var layer = new ImageryLayer(provider);
|
|
|
|
var tries = 0;
|
|
provider.errorEvent.addEventListener(function (error) {
|
|
expect(error.timesRetried).toEqual(tries);
|
|
++tries;
|
|
if (tries < 3) {
|
|
error.retry = true;
|
|
}
|
|
setTimeout(function () {
|
|
RequestScheduler.update();
|
|
}, 1);
|
|
});
|
|
|
|
Resource._Implementations.createImage = function (
|
|
request,
|
|
crossOrigin,
|
|
deferred
|
|
) {
|
|
if (tries === 2) {
|
|
// Succeed after 2 tries
|
|
Resource._DefaultImplementations.createImage(
|
|
new Request({ url: "Data/Images/Red16x16.png" }),
|
|
crossOrigin,
|
|
deferred
|
|
);
|
|
} else {
|
|
// fail
|
|
setTimeout(function () {
|
|
deferred.reject();
|
|
}, 1);
|
|
}
|
|
};
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
var imagery = new Imagery(layer, 0, 0, 0);
|
|
imagery.addReference();
|
|
layer._requestImagery(imagery);
|
|
RequestScheduler.update();
|
|
|
|
return pollToPromise(function () {
|
|
return imagery.state === ImageryState.RECEIVED;
|
|
}).then(function () {
|
|
expect(imagery.image).toBeImageOrImageBitmap();
|
|
expect(tries).toEqual(2);
|
|
imagery.releaseReference();
|
|
});
|
|
});
|
|
});
|
|
|
|
it("honors fullExtent of tiled server with web mercator projection", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
var webMercatorFullExtentResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -20037508.342787,
|
|
y: 20037508.342787,
|
|
},
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 156543.033928,
|
|
scale: 591657527.591555,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 78271.5169639999,
|
|
scale: 295828763.795777,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 39135.7584820001,
|
|
scale: 147914381.897889,
|
|
},
|
|
],
|
|
},
|
|
fullExtent: {
|
|
xmin: 1.1148026611962173e7,
|
|
ymin: -6443518.758206591,
|
|
xmax: 1.8830976498143446e7,
|
|
ymax: -265936.19697360107,
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
},
|
|
},
|
|
};
|
|
|
|
stubJSONPCall(baseUrl, webMercatorFullExtentResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
var projection = new WebMercatorProjection();
|
|
var sw = projection.unproject(
|
|
new Cartesian2(1.1148026611962173e7, -6443518.758206591)
|
|
);
|
|
var ne = projection.unproject(
|
|
new Cartesian2(1.8830976498143446e7, -265936.19697360107)
|
|
);
|
|
var rectangle = new Rectangle(
|
|
sw.longitude,
|
|
sw.latitude,
|
|
ne.longitude,
|
|
ne.latitude
|
|
);
|
|
expect(provider.rectangle).toEqual(rectangle);
|
|
});
|
|
});
|
|
|
|
it("constrains extent to the tiling scheme's rectangle", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
var webMercatorOutsideBoundsResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -20037508.342787,
|
|
y: 20037508.342787,
|
|
},
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 156543.033928,
|
|
scale: 591657527.591555,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 78271.5169639999,
|
|
scale: 295828763.795777,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 39135.7584820001,
|
|
scale: 147914381.897889,
|
|
},
|
|
],
|
|
},
|
|
fullExtent: {
|
|
xmin: -2.0037507067161843e7,
|
|
ymin: -1.4745615008589065e7,
|
|
xmax: 2.0037507067161843e7,
|
|
ymax: 3.0240971958386205e7,
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
},
|
|
},
|
|
};
|
|
|
|
stubJSONPCall(baseUrl, webMercatorOutsideBoundsResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.rectangle.west).toBeGreaterThanOrEqualTo(-Math.PI);
|
|
expect(provider.rectangle.east).toBeLessThanOrEqualTo(Math.PI);
|
|
expect(provider.rectangle.south).toBeGreaterThanOrEqualTo(
|
|
-WebMercatorProjection.MaximumLatitude
|
|
);
|
|
expect(provider.rectangle.north).toBeLessThanOrEqualTo(
|
|
WebMercatorProjection.MaximumLatitude
|
|
);
|
|
});
|
|
});
|
|
|
|
it("honors fullExtent of tiled server with geographic projection", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
var geographicFullExtentResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -20037508.342787,
|
|
y: 20037508.342787,
|
|
},
|
|
spatialReference: {
|
|
wkid: 102100,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 156543.033928,
|
|
scale: 591657527.591555,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 78271.5169639999,
|
|
scale: 295828763.795777,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 39135.7584820001,
|
|
scale: 147914381.897889,
|
|
},
|
|
],
|
|
},
|
|
fullExtent: {
|
|
xmin: -123.4,
|
|
ymin: -23.2,
|
|
xmax: 100.7,
|
|
ymax: 45.2,
|
|
spatialReference: {
|
|
wkid: 4326,
|
|
},
|
|
},
|
|
};
|
|
|
|
stubJSONPCall(baseUrl, geographicFullExtentResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.rectangle).toEqual(
|
|
Rectangle.fromDegrees(-123.4, -23.2, 100.7, 45.2)
|
|
);
|
|
});
|
|
});
|
|
|
|
it("raises error if the spatialReference of the fullExtent is unknown", function () {
|
|
var baseUrl = "//tiledArcGisMapServer.invalid/";
|
|
|
|
var unknownSpatialReferenceResult = {
|
|
currentVersion: 10.01,
|
|
copyrightText: "Test copyright text",
|
|
tileInfo: {
|
|
rows: 128,
|
|
cols: 256,
|
|
origin: {
|
|
x: -180,
|
|
y: 90,
|
|
},
|
|
spatialReference: {
|
|
wkid: 1234,
|
|
},
|
|
lods: [
|
|
{
|
|
level: 0,
|
|
resolution: 0.3515625,
|
|
scale: 147748799.285417,
|
|
},
|
|
{
|
|
level: 1,
|
|
resolution: 0.17578125,
|
|
scale: 73874399.6427087,
|
|
},
|
|
{
|
|
level: 2,
|
|
resolution: 0.087890625,
|
|
scale: 36937199.8213544,
|
|
},
|
|
],
|
|
},
|
|
fullExtent: {
|
|
xmin: -123.4,
|
|
ymin: -23.2,
|
|
xmax: 100.7,
|
|
ymax: 45.2,
|
|
spatialReference: {
|
|
wkid: 1234,
|
|
},
|
|
},
|
|
};
|
|
|
|
stubJSONPCall(baseUrl, unknownSpatialReferenceResult);
|
|
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: baseUrl,
|
|
});
|
|
|
|
expect(provider.url).toEqual(baseUrl);
|
|
|
|
var tries = 0;
|
|
provider.errorEvent.addEventListener(function (error) {
|
|
expect(error.message.indexOf("WKID") >= 0).toEqual(true);
|
|
++tries;
|
|
if (tries < 3) {
|
|
error.retry = true;
|
|
}
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready || tries >= 3;
|
|
}).then(function () {
|
|
expect(provider.ready).toEqual(false);
|
|
expect(tries).toEqual(3);
|
|
});
|
|
});
|
|
|
|
describe("pickFeatures", function () {
|
|
it("works with WebMercator geometry", function () {
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: "made/up/map/server",
|
|
usePreCachedTilesIfAvailable: false,
|
|
});
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
expect(url).toContain("identify");
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/ArcGIS/identify-WebMercator.json",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
);
|
|
};
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
return provider
|
|
.pickFeatures(0, 0, 0, 0.5, 0.5)
|
|
.then(function (pickResult) {
|
|
expect(pickResult.length).toBe(1);
|
|
|
|
var firstResult = pickResult[0];
|
|
expect(firstResult).toBeInstanceOf(ImageryLayerFeatureInfo);
|
|
expect(firstResult.description).toContain("Hummock Grasses");
|
|
expect(firstResult.position).toEqual(
|
|
new WebMercatorProjection().unproject(
|
|
new Cartesian3(1.481682457042425e7, -2710890.117898505)
|
|
)
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("works with Geographic geometry", function () {
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: "made/up/map/server",
|
|
usePreCachedTilesIfAvailable: false,
|
|
});
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
expect(url).toContain("identify");
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/ArcGIS/identify-Geographic.json",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
);
|
|
};
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
return provider
|
|
.pickFeatures(0, 0, 0, 0.5, 0.5)
|
|
.then(function (pickResult) {
|
|
expect(pickResult.length).toBe(1);
|
|
|
|
var firstResult = pickResult[0];
|
|
expect(firstResult).toBeInstanceOf(ImageryLayerFeatureInfo);
|
|
expect(firstResult.description).toContain("Hummock Grasses");
|
|
expect(firstResult.position).toEqual(
|
|
Cartographic.fromDegrees(123.45, -34.2)
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("returns undefined if enablePickFeatures is false", function () {
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: "made/up/map/server",
|
|
usePreCachedTilesIfAvailable: false,
|
|
enablePickFeatures: false,
|
|
});
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.pickFeatures(0, 0, 0, 0.5, 0.5)).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
it("returns undefined if enablePickFeatures is dynamically set to false", function () {
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: "made/up/map/server",
|
|
usePreCachedTilesIfAvailable: false,
|
|
enablePickFeatures: true,
|
|
});
|
|
|
|
provider.enablePickFeatures = false;
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.pickFeatures(0, 0, 0, 0.5, 0.5)).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
it("does not return undefined if enablePickFeatures is dynamically set to true", function () {
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: "made/up/map/server",
|
|
usePreCachedTilesIfAvailable: false,
|
|
enablePickFeatures: false,
|
|
});
|
|
|
|
provider.enablePickFeatures = true;
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
expect(provider.pickFeatures(0, 0, 0, 0.5, 0.5)).not.toBeUndefined();
|
|
});
|
|
});
|
|
|
|
it("picks from individual layers", function () {
|
|
var provider = new ArcGisMapServerImageryProvider({
|
|
url: "made/up/map/server",
|
|
usePreCachedTilesIfAvailable: false,
|
|
layers: "someLayer,anotherLayerYay",
|
|
});
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
var uri = new Uri(url);
|
|
var query = queryToObject(uri.getQuery());
|
|
|
|
expect(query.layers).toContain("visible:someLayer,anotherLayerYay");
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/ArcGIS/identify-WebMercator.json",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
);
|
|
};
|
|
|
|
return pollToPromise(function () {
|
|
return provider.ready;
|
|
}).then(function () {
|
|
return provider
|
|
.pickFeatures(0, 0, 0, 0.5, 0.5)
|
|
.then(function (pickResult) {
|
|
expect(pickResult.length).toBe(1);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|