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

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