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.
380 lines
12 KiB
JavaScript
380 lines
12 KiB
JavaScript
import { GeographicTilingScheme } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { Rectangle } from "../../Source/Cesium.js";
|
|
import { WebMercatorTilingScheme } from "../../Source/Cesium.js";
|
|
import { QuadtreeTile } from "../../Source/Cesium.js";
|
|
|
|
describe("Scene/QuadtreeTile", function () {
|
|
it("throws without a options", function () {
|
|
expect(function () {
|
|
return new QuadtreeTile();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("throws without options.rectangle", function () {
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
x: 0,
|
|
y: 0,
|
|
});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("throws without options.level", function () {
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
rectangle: new Rectangle(
|
|
-CesiumMath.PI_OVER_FOUR,
|
|
0.0,
|
|
CesiumMath.PI_OVER_FOUR,
|
|
CesiumMath.PI_OVER_FOUR
|
|
),
|
|
x: 0,
|
|
y: 0,
|
|
});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("throws with negative x or y properties", function () {
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
x: -1.0,
|
|
y: -1.0,
|
|
level: 1.0,
|
|
});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("creates rectangle on construction", function () {
|
|
var desc = {
|
|
tilingScheme: new WebMercatorTilingScheme(),
|
|
x: 0,
|
|
y: 0,
|
|
level: 0,
|
|
};
|
|
var tile = new QuadtreeTile(desc);
|
|
var rectangle = desc.tilingScheme.tileXYToRectangle(
|
|
desc.x,
|
|
desc.y,
|
|
desc.level
|
|
);
|
|
expect(tile.rectangle).toEqual(rectangle);
|
|
});
|
|
|
|
it("throws if constructed improperly", function () {
|
|
expect(function () {
|
|
return new QuadtreeTile();
|
|
}).toThrowDeveloperError();
|
|
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
y: 0,
|
|
level: 0,
|
|
tilingScheme: {
|
|
tileXYToRectangle: function () {
|
|
return undefined;
|
|
},
|
|
},
|
|
});
|
|
}).toThrowDeveloperError();
|
|
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
x: 0,
|
|
level: 0,
|
|
tilingScheme: {
|
|
tileXYToRectangle: function () {
|
|
return undefined;
|
|
},
|
|
},
|
|
});
|
|
}).toThrowDeveloperError();
|
|
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
x: 0,
|
|
y: 0,
|
|
tilingScheme: {
|
|
tileXYToRectangle: function () {
|
|
return undefined;
|
|
},
|
|
},
|
|
});
|
|
}).toThrowDeveloperError();
|
|
|
|
expect(function () {
|
|
return new QuadtreeTile({
|
|
x: 0,
|
|
y: 0,
|
|
level: 0,
|
|
});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("can get tiles around a root tile", function () {
|
|
var tilingScheme = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 3,
|
|
numberOfLevelZeroTilesY: 3,
|
|
});
|
|
var levelZeroTiles = QuadtreeTile.createLevelZeroTiles(tilingScheme);
|
|
|
|
var L0X0Y0 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 0 && tile.y === 0;
|
|
})[0];
|
|
var L0X1Y0 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 1 && tile.y === 0;
|
|
})[0];
|
|
var L0X2Y0 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 2 && tile.y === 0;
|
|
})[0];
|
|
var L0X0Y1 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 0 && tile.y === 1;
|
|
})[0];
|
|
var L0X1Y1 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 1 && tile.y === 1;
|
|
})[0];
|
|
var L0X2Y1 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 2 && tile.y === 1;
|
|
})[0];
|
|
var L0X0Y2 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 0 && tile.y === 2;
|
|
})[0];
|
|
var L0X1Y2 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 1 && tile.y === 2;
|
|
})[0];
|
|
var L0X2Y2 = levelZeroTiles.filter(function (tile) {
|
|
return tile.x === 2 && tile.y === 2;
|
|
})[0];
|
|
|
|
expect(L0X0Y0.findTileToWest(levelZeroTiles)).toBe(L0X2Y0);
|
|
expect(L0X0Y0.findTileToEast(levelZeroTiles)).toBe(L0X1Y0);
|
|
expect(L0X0Y0.findTileToNorth(levelZeroTiles)).toBeUndefined();
|
|
expect(L0X0Y0.findTileToSouth(levelZeroTiles)).toBe(L0X0Y1);
|
|
|
|
expect(L0X1Y0.findTileToWest(levelZeroTiles)).toBe(L0X0Y0);
|
|
expect(L0X1Y0.findTileToEast(levelZeroTiles)).toBe(L0X2Y0);
|
|
expect(L0X1Y0.findTileToNorth(levelZeroTiles)).toBeUndefined();
|
|
expect(L0X1Y0.findTileToSouth(levelZeroTiles)).toBe(L0X1Y1);
|
|
|
|
expect(L0X2Y0.findTileToWest(levelZeroTiles)).toBe(L0X1Y0);
|
|
expect(L0X2Y0.findTileToEast(levelZeroTiles)).toBe(L0X0Y0);
|
|
expect(L0X2Y0.findTileToNorth(levelZeroTiles)).toBeUndefined();
|
|
expect(L0X2Y0.findTileToSouth(levelZeroTiles)).toBe(L0X2Y1);
|
|
|
|
expect(L0X0Y1.findTileToWest(levelZeroTiles)).toBe(L0X2Y1);
|
|
expect(L0X0Y1.findTileToEast(levelZeroTiles)).toBe(L0X1Y1);
|
|
expect(L0X0Y1.findTileToNorth(levelZeroTiles)).toBe(L0X0Y0);
|
|
expect(L0X0Y1.findTileToSouth(levelZeroTiles)).toBe(L0X0Y2);
|
|
|
|
expect(L0X1Y1.findTileToWest(levelZeroTiles)).toBe(L0X0Y1);
|
|
expect(L0X1Y1.findTileToEast(levelZeroTiles)).toBe(L0X2Y1);
|
|
expect(L0X1Y1.findTileToNorth(levelZeroTiles)).toBe(L0X1Y0);
|
|
expect(L0X1Y1.findTileToSouth(levelZeroTiles)).toBe(L0X1Y2);
|
|
|
|
expect(L0X2Y1.findTileToWest(levelZeroTiles)).toBe(L0X1Y1);
|
|
expect(L0X2Y1.findTileToEast(levelZeroTiles)).toBe(L0X0Y1);
|
|
expect(L0X2Y1.findTileToNorth(levelZeroTiles)).toBe(L0X2Y0);
|
|
expect(L0X2Y1.findTileToSouth(levelZeroTiles)).toBe(L0X2Y2);
|
|
|
|
expect(L0X0Y2.findTileToWest(levelZeroTiles)).toBe(L0X2Y2);
|
|
expect(L0X0Y2.findTileToEast(levelZeroTiles)).toBe(L0X1Y2);
|
|
expect(L0X0Y2.findTileToNorth(levelZeroTiles)).toBe(L0X0Y1);
|
|
expect(L0X0Y2.findTileToSouth(levelZeroTiles)).toBeUndefined();
|
|
|
|
expect(L0X1Y2.findTileToWest(levelZeroTiles)).toBe(L0X0Y2);
|
|
expect(L0X1Y2.findTileToEast(levelZeroTiles)).toBe(L0X2Y2);
|
|
expect(L0X1Y2.findTileToNorth(levelZeroTiles)).toBe(L0X1Y1);
|
|
expect(L0X1Y2.findTileToSouth(levelZeroTiles)).toBeUndefined();
|
|
|
|
expect(L0X2Y2.findTileToWest(levelZeroTiles)).toBe(L0X1Y2);
|
|
expect(L0X2Y2.findTileToEast(levelZeroTiles)).toBe(L0X0Y2);
|
|
expect(L0X2Y2.findTileToNorth(levelZeroTiles)).toBe(L0X2Y1);
|
|
expect(L0X2Y2.findTileToSouth(levelZeroTiles)).toBeUndefined();
|
|
});
|
|
|
|
it("can get tiles around a tile when they share a common parent", function () {
|
|
var tilingScheme = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 2,
|
|
numberOfLevelZeroTilesY: 1,
|
|
});
|
|
|
|
var levelZeroTiles = QuadtreeTile.createLevelZeroTiles(tilingScheme);
|
|
var parent = levelZeroTiles[1];
|
|
var sw = parent.southwestChild;
|
|
var se = parent.southeastChild;
|
|
var nw = parent.northwestChild;
|
|
var ne = parent.northeastChild;
|
|
|
|
expect(sw.findTileToEast(levelZeroTiles)).toBe(se);
|
|
expect(sw.findTileToNorth(levelZeroTiles)).toBe(nw);
|
|
expect(se.findTileToWest(levelZeroTiles)).toBe(sw);
|
|
expect(se.findTileToNorth(levelZeroTiles)).toBe(ne);
|
|
expect(nw.findTileToEast(levelZeroTiles)).toBe(ne);
|
|
expect(nw.findTileToSouth(levelZeroTiles)).toBe(sw);
|
|
expect(ne.findTileToWest(levelZeroTiles)).toBe(nw);
|
|
expect(ne.findTileToSouth(levelZeroTiles)).toBe(se);
|
|
});
|
|
|
|
it("can get tiles around a tile when they do not share a common parent", function () {
|
|
var tilingScheme = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 2,
|
|
numberOfLevelZeroTilesY: 2,
|
|
});
|
|
|
|
var levelZeroTiles = QuadtreeTile.createLevelZeroTiles(tilingScheme);
|
|
|
|
var northwest = levelZeroTiles[0];
|
|
var nwse = northwest.southeastChild;
|
|
var nwne = northwest.northeastChild;
|
|
var nwsw = northwest.southwestChild;
|
|
|
|
var northeast = levelZeroTiles[1];
|
|
var nesw = northeast.southwestChild;
|
|
var nenw = northeast.northwestChild;
|
|
var nese = northeast.southeastChild;
|
|
|
|
var southwest = levelZeroTiles[2];
|
|
var swne = southwest.northeastChild;
|
|
var swnw = southwest.northwestChild;
|
|
var swse = southwest.southeastChild;
|
|
|
|
var southeast = levelZeroTiles[3];
|
|
var senw = southeast.northwestChild;
|
|
var sene = southeast.northeastChild;
|
|
var sesw = southeast.southwestChild;
|
|
|
|
expect(nwse.findTileToEast(levelZeroTiles)).toBe(nesw);
|
|
expect(nwse.findTileToSouth(levelZeroTiles)).toBe(swne);
|
|
expect(nwne.findTileToEast(levelZeroTiles)).toBe(nenw);
|
|
expect(nwsw.findTileToSouth(levelZeroTiles)).toBe(swnw);
|
|
|
|
expect(nesw.findTileToWest(levelZeroTiles)).toBe(nwse);
|
|
expect(nesw.findTileToSouth(levelZeroTiles)).toBe(senw);
|
|
expect(nenw.findTileToWest(levelZeroTiles)).toBe(nwne);
|
|
expect(nese.findTileToSouth(levelZeroTiles)).toBe(sene);
|
|
|
|
expect(swne.findTileToEast(levelZeroTiles)).toBe(senw);
|
|
expect(swne.findTileToNorth(levelZeroTiles)).toBe(nwse);
|
|
expect(swnw.findTileToNorth(levelZeroTiles)).toBe(nwsw);
|
|
expect(swse.findTileToEast(levelZeroTiles)).toBe(sesw);
|
|
|
|
expect(senw.findTileToWest(levelZeroTiles)).toBe(swne);
|
|
expect(senw.findTileToNorth(levelZeroTiles)).toBe(nesw);
|
|
expect(sene.findTileToNorth(levelZeroTiles)).toBe(nese);
|
|
expect(sesw.findTileToWest(levelZeroTiles)).toBe(swse);
|
|
});
|
|
|
|
it("can get adjacent tiles wrapping around the anti-meridian", function () {
|
|
var tilingScheme = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 2,
|
|
numberOfLevelZeroTilesY: 1,
|
|
});
|
|
|
|
var levelZeroTiles = QuadtreeTile.createLevelZeroTiles(tilingScheme);
|
|
|
|
var west = levelZeroTiles[0];
|
|
var wsw = west.southwestChild;
|
|
var wnw = west.northwestChild;
|
|
|
|
var east = levelZeroTiles[1];
|
|
var ene = east.northeastChild;
|
|
var ese = east.southeastChild;
|
|
|
|
expect(wsw.findTileToWest(levelZeroTiles)).toBe(ese);
|
|
expect(wnw.findTileToWest(levelZeroTiles)).toBe(ene);
|
|
|
|
expect(ene.findTileToEast(levelZeroTiles)).toBe(wnw);
|
|
expect(ese.findTileToEast(levelZeroTiles)).toBe(wsw);
|
|
});
|
|
|
|
it("returns undefined when asked for adjacent tiles north of the north pole or south of the south pole", function () {
|
|
var tilingScheme = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 2,
|
|
numberOfLevelZeroTilesY: 1,
|
|
});
|
|
|
|
var levelZeroTiles = QuadtreeTile.createLevelZeroTiles(tilingScheme);
|
|
|
|
var west = levelZeroTiles[0];
|
|
var wnw = west.northwestChild;
|
|
var wsw = west.southwestChild;
|
|
|
|
expect(wnw.findTileToNorth(levelZeroTiles)).toBeUndefined();
|
|
expect(wsw.findTileToSouth(levelZeroTiles)).toBeUndefined();
|
|
});
|
|
|
|
describe("createLevelZeroTiles", function () {
|
|
var tilingScheme1x1;
|
|
var tilingScheme2x2;
|
|
var tilingScheme2x1;
|
|
var tilingScheme1x2;
|
|
|
|
beforeEach(function () {
|
|
tilingScheme1x1 = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 1,
|
|
numberOfLevelZeroTilesY: 1,
|
|
});
|
|
tilingScheme2x2 = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 2,
|
|
numberOfLevelZeroTilesY: 2,
|
|
});
|
|
tilingScheme2x1 = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 2,
|
|
numberOfLevelZeroTilesY: 1,
|
|
});
|
|
tilingScheme1x2 = new GeographicTilingScheme({
|
|
numberOfLevelZeroTilesX: 1,
|
|
numberOfLevelZeroTilesY: 2,
|
|
});
|
|
});
|
|
|
|
it("requires tilingScheme", function () {
|
|
expect(function () {
|
|
return QuadtreeTile.createLevelZeroTiles(undefined);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("creates expected number of tiles", function () {
|
|
var tiles = QuadtreeTile.createLevelZeroTiles(tilingScheme1x1);
|
|
expect(tiles.length).toBe(1);
|
|
|
|
tiles = QuadtreeTile.createLevelZeroTiles(tilingScheme2x2);
|
|
expect(tiles.length).toBe(4);
|
|
|
|
tiles = QuadtreeTile.createLevelZeroTiles(tilingScheme2x1);
|
|
expect(tiles.length).toBe(2);
|
|
|
|
tiles = QuadtreeTile.createLevelZeroTiles(tilingScheme1x2);
|
|
expect(tiles.length).toBe(2);
|
|
});
|
|
|
|
it("created tiles are associated with specified tiling scheme", function () {
|
|
var tiles = QuadtreeTile.createLevelZeroTiles(tilingScheme2x2);
|
|
for (var i = 0; i < tiles.length; ++i) {
|
|
expect(tiles[i].tilingScheme).toBe(tilingScheme2x2);
|
|
}
|
|
});
|
|
|
|
it("created tiles are ordered from the northwest and proceeding east and then south", function () {
|
|
var tiles = QuadtreeTile.createLevelZeroTiles(tilingScheme2x2);
|
|
var northwest = tiles[0];
|
|
var northeast = tiles[1];
|
|
var southwest = tiles[2];
|
|
var southeast = tiles[3];
|
|
|
|
expect(northeast.rectangle.west).toBeGreaterThan(
|
|
northwest.rectangle.west
|
|
);
|
|
expect(southeast.rectangle.west).toBeGreaterThan(
|
|
southwest.rectangle.west
|
|
);
|
|
expect(northeast.rectangle.south).toBeGreaterThan(
|
|
southeast.rectangle.south
|
|
);
|
|
expect(northwest.rectangle.south).toBeGreaterThan(
|
|
southwest.rectangle.south
|
|
);
|
|
});
|
|
});
|
|
});
|