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.
1257 lines
34 KiB
JavaScript
1257 lines
34 KiB
JavaScript
import { BoundingRectangle } from "../../Source/Cesium.js";
|
|
import { Cartesian2 } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { Cartographic } from "../../Source/Cesium.js";
|
|
import { Color } from "../../Source/Cesium.js";
|
|
import { defaultValue } from "../../Source/Cesium.js";
|
|
import { defined } from "../../Source/Cesium.js";
|
|
import { Iso8601 } from "../../Source/Cesium.js";
|
|
import { JulianDate } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { PolygonHierarchy } from "../../Source/Cesium.js";
|
|
import { Rectangle } from "../../Source/Cesium.js";
|
|
import { TimeInterval } from "../../Source/Cesium.js";
|
|
import { CallbackProperty } from "../../Source/Cesium.js";
|
|
import { ColorMaterialProperty } from "../../Source/Cesium.js";
|
|
import { Entity } from "../../Source/Cesium.js";
|
|
import { EntityCollection } from "../../Source/Cesium.js";
|
|
import { exportKml } from "../../Source/Cesium.js";
|
|
import { ImageMaterialProperty } from "../../Source/Cesium.js";
|
|
import { PolylineOutlineMaterialProperty } from "../../Source/Cesium.js";
|
|
import { SampledPositionProperty } from "../../Source/Cesium.js";
|
|
import { HeightReference } from "../../Source/Cesium.js";
|
|
import { HorizontalOrigin } from "../../Source/Cesium.js";
|
|
import { VerticalOrigin } from "../../Source/Cesium.js";
|
|
import { when } from "../../Source/Cesium.js";
|
|
|
|
describe("DataSources/exportKml", function () {
|
|
var kmlDoc;
|
|
function checkKmlDoc(entities, properties, options) {
|
|
options = defaultValue(options, {});
|
|
options.entities = entities;
|
|
var promise = exportKml(options);
|
|
var kml = kmlDoc.documentElement;
|
|
var kmlChildNodes = kml.childNodes;
|
|
expect(kml.localName).toEqual("kml");
|
|
expect(kmlChildNodes.length).toBe(1);
|
|
|
|
checkTagWithProperties(kml, properties);
|
|
|
|
return promise;
|
|
}
|
|
|
|
function checkTagWithProperties(element, properties) {
|
|
var attributes = properties._;
|
|
if (defined(attributes)) {
|
|
var elementAttributes = element.attributes;
|
|
expect(elementAttributes.length).toBe(Object.keys(attributes).length);
|
|
for (var j = 0; j < elementAttributes.length; ++j) {
|
|
var nodeAttribute = elementAttributes[j];
|
|
var attribute = attributes[nodeAttribute.name];
|
|
|
|
if (typeof attribute === "string") {
|
|
expect(nodeAttribute.value).toEqual(attribute);
|
|
} else if (typeof attribute === "number") {
|
|
expect(Number(nodeAttribute.value)).toEqualEpsilon(
|
|
attribute,
|
|
CesiumMath.EPSILON7
|
|
);
|
|
} else {
|
|
fail();
|
|
}
|
|
}
|
|
}
|
|
|
|
var childNodes = element.childNodes;
|
|
for (var i = 0; i < childNodes.length; ++i) {
|
|
var node = childNodes[i];
|
|
var property = properties[node.tagName];
|
|
expect(property).toBeDefined();
|
|
|
|
if (defined(property.getValue)) {
|
|
property = property.getValue(Iso8601.MINIMUM_VALUE);
|
|
}
|
|
|
|
if (typeof property === "function") {
|
|
expect(property(node.textContent)).toBe(true);
|
|
} else if (typeof property === "string") {
|
|
expect(node.textContent).toEqual(property);
|
|
} else if (typeof property === "number") {
|
|
expect(Number(node.textContent)).toEqualEpsilon(
|
|
property,
|
|
CesiumMath.EPSILON7
|
|
);
|
|
} else if (typeof property === "boolean") {
|
|
expect(Number(node.textContent)).toBe(property ? 1 : 0);
|
|
} else {
|
|
checkTagWithProperties(node, property);
|
|
}
|
|
}
|
|
}
|
|
|
|
var counter = 0;
|
|
var pointPosition = Cartesian3.fromDegrees(-75.59777, 40.03883, 12);
|
|
function checkPointCoord(textContent) {
|
|
var values = textContent.split(/\s*,\s*/);
|
|
expect(values.length).toBe(3);
|
|
|
|
var cartographic1 = Cartographic.fromCartesian(pointPosition);
|
|
var cartographic2 = Cartographic.fromDegrees(
|
|
Number(values[0]),
|
|
Number(values[1]),
|
|
Number(values[2])
|
|
);
|
|
return Cartographic.equalsEpsilon(
|
|
cartographic1,
|
|
cartographic2,
|
|
CesiumMath.EPSILON7
|
|
);
|
|
}
|
|
|
|
function createEntity(properties) {
|
|
++counter;
|
|
var options = {
|
|
id: "e" + counter,
|
|
name: "entity" + counter,
|
|
show: true,
|
|
description: "This is entity number " + counter,
|
|
position: pointPosition,
|
|
};
|
|
|
|
if (defined(properties)) {
|
|
for (var propertyName in properties) {
|
|
if (properties.hasOwnProperty(propertyName)) {
|
|
options[propertyName] = properties[propertyName];
|
|
}
|
|
}
|
|
}
|
|
|
|
return new Entity(options);
|
|
}
|
|
|
|
function createExpectResult(entity) {
|
|
return {
|
|
Document: {
|
|
Style: {
|
|
_: {
|
|
id: "style-1",
|
|
},
|
|
},
|
|
Placemark: {
|
|
_: {
|
|
id: entity.id,
|
|
},
|
|
name: entity.name,
|
|
visibility: entity.show ? 1 : 0,
|
|
description: entity.description,
|
|
styleUrl: "#style-1",
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
var oldCreateState;
|
|
beforeAll(function () {
|
|
oldCreateState = exportKml._createState;
|
|
|
|
// We need to capture the DOM object
|
|
exportKml._createState = function (options) {
|
|
var state = oldCreateState(options);
|
|
kmlDoc = state.kmlDoc;
|
|
return state;
|
|
};
|
|
});
|
|
|
|
afterAll(function () {
|
|
exportKml._createState = oldCreateState;
|
|
});
|
|
|
|
beforeEach(function () {
|
|
counter = 0;
|
|
});
|
|
|
|
it("Hierarchy", function () {
|
|
var entity1 = createEntity({
|
|
show: false,
|
|
position: undefined,
|
|
});
|
|
|
|
var entity2 = createEntity({
|
|
position: undefined,
|
|
parent: entity1,
|
|
});
|
|
|
|
var entity3 = createEntity({
|
|
parent: entity2,
|
|
point: {},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
entities.add(entity2);
|
|
entities.add(entity3);
|
|
|
|
var hierarchy = {
|
|
Document: {
|
|
Style: {
|
|
_: {
|
|
id: "style-1",
|
|
},
|
|
IconStyle: {},
|
|
},
|
|
Folder: {
|
|
_: {
|
|
id: entity1.id,
|
|
},
|
|
name: entity1.name,
|
|
visibility: "0",
|
|
description: entity1.description,
|
|
Folder: {
|
|
_: {
|
|
id: entity2.id,
|
|
},
|
|
name: entity2.name,
|
|
visibility: true,
|
|
description: entity2.description,
|
|
Placemark: {
|
|
_: {
|
|
id: entity3.id,
|
|
},
|
|
Point: {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
},
|
|
name: entity3.name,
|
|
visibility: true,
|
|
description: entity3.description,
|
|
styleUrl: "#style-1",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, hierarchy);
|
|
});
|
|
|
|
describe("Point Geometry", function () {
|
|
it("Point with constant position", function () {
|
|
var entity1 = createEntity({
|
|
point: {
|
|
color: Color.LINEN,
|
|
pixelSize: 3,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
color: "ffe6f0fa",
|
|
colorMode: "normal",
|
|
scale: 3 / 32,
|
|
};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "clampToGround",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Point with label", function () {
|
|
var entity1 = createEntity({
|
|
point: {
|
|
color: Color.LINEN,
|
|
pixelSize: 3,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
},
|
|
label: {
|
|
text: "Im a label",
|
|
color: Color.ORANGE,
|
|
scale: 2,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
color: "ffe6f0fa",
|
|
colorMode: "normal",
|
|
scale: 3 / 32,
|
|
};
|
|
expectedResult.Document.Style.LabelStyle = {
|
|
color: "ff00a5ff",
|
|
colorMode: "normal",
|
|
scale: 2,
|
|
};
|
|
expectedResult.Document.Placemark.name = "Im a label";
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "clampToGround",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Billboard with constant position", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
image: "http://test.invalid/image.jpg",
|
|
imageSubRegion: new BoundingRectangle(12, 0, 24, 36),
|
|
color: Color.LINEN,
|
|
scale: 2,
|
|
pixelOffset: new Cartesian2(2, 3),
|
|
width: 24,
|
|
height: 36,
|
|
horizontalOrigin: HorizontalOrigin.LEFT,
|
|
verticalOrigin: VerticalOrigin.BOTTOM,
|
|
rotation: CesiumMath.toRadians(10),
|
|
alignedAxis: Cartesian3.UNIT_Z,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
Icon: {
|
|
href: "http://test.invalid/image.jpg",
|
|
x: 12,
|
|
y: 0,
|
|
w: 24,
|
|
h: 36,
|
|
},
|
|
color: "ffe6f0fa",
|
|
colorMode: "normal",
|
|
scale: 2,
|
|
hotSpot: {
|
|
_: {
|
|
x: -2 / 2,
|
|
y: 3 / 2,
|
|
xunits: "pixels",
|
|
yunits: "pixels",
|
|
},
|
|
},
|
|
heading: -10,
|
|
};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "clampToGround",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Billboard with AlignedAxis not Z", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
rotation: CesiumMath.toRadians(10),
|
|
alignedAxis: Cartesian3.UNIT_Y,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Billboard with 0 degree heading should be 360", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
rotation: CesiumMath.toRadians(0),
|
|
alignedAxis: Cartesian3.UNIT_Z,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
heading: 360,
|
|
};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Billboard with HotSpot at the center", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
pixelOffset: new Cartesian2(2, 3),
|
|
width: 24,
|
|
height: 36,
|
|
horizontalOrigin: HorizontalOrigin.CENTER,
|
|
verticalOrigin: VerticalOrigin.CENTER,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
hotSpot: {
|
|
_: {
|
|
x: -(2 - 12),
|
|
y: 3 + 18,
|
|
xunits: "pixels",
|
|
yunits: "pixels",
|
|
},
|
|
},
|
|
};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Billboard with HotSpot at the TopRight", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
pixelOffset: new Cartesian2(2, 3),
|
|
width: 24,
|
|
height: 36,
|
|
horizontalOrigin: HorizontalOrigin.RIGHT,
|
|
verticalOrigin: VerticalOrigin.TOP,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
hotSpot: {
|
|
_: {
|
|
x: -(2 - 24),
|
|
y: 3 + 36,
|
|
xunits: "pixels",
|
|
yunits: "pixels",
|
|
},
|
|
},
|
|
};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Billboard with a Canvas image", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
image: document.createElement("canvas"),
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {
|
|
Icon: {
|
|
href: "texture_1.png",
|
|
},
|
|
};
|
|
expectedResult.Document.Placemark.Point = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
};
|
|
|
|
return checkKmlDoc(entities, expectedResult).then(function (result) {
|
|
expect(result.kml).toBeDefined();
|
|
expect(Object.keys(result.externalFiles).length).toBe(1);
|
|
expect(result.externalFiles["texture_1.png"]).toBeDefined();
|
|
});
|
|
});
|
|
|
|
it("Billboard with a Canvas image as KMZ", function () {
|
|
var entity1 = createEntity({
|
|
billboard: {
|
|
image: document.createElement("canvas"),
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
return exportKml({
|
|
entities: entities,
|
|
kmz: true,
|
|
}).then(function (result) {
|
|
expect(result.kml).toBeUndefined();
|
|
expect(result.externalFiles).toBeUndefined();
|
|
expect(result.kmz).toBeDefined();
|
|
|
|
var deferred = when.defer();
|
|
var fileReader = new FileReader();
|
|
fileReader.onload = function (event) {
|
|
// Verify its a zip archive
|
|
expect(new DataView(event.target.result).getUint32(0, false)).toBe(
|
|
0x504b0304
|
|
);
|
|
deferred.resolve();
|
|
};
|
|
fileReader.readAsArrayBuffer(result.kmz);
|
|
|
|
return deferred.promise;
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("Tracks", function () {
|
|
var times = [
|
|
JulianDate.fromIso8601("2019-06-17"),
|
|
JulianDate.fromIso8601("2019-06-18"),
|
|
JulianDate.fromIso8601("2019-06-19"),
|
|
];
|
|
var positions = [
|
|
Cartesian3.fromDegrees(-75.59777, 40.03883, 12),
|
|
Cartesian3.fromDegrees(-76.59777, 39.03883, 12),
|
|
Cartesian3.fromDegrees(-77.59777, 38.03883, 12),
|
|
];
|
|
|
|
function checkWhen(textContent) {
|
|
var count = times.length;
|
|
for (var i = 0; i < count; ++i) {
|
|
if (textContent === JulianDate.toIso8601(times[i])) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function checkCoord(textContent) {
|
|
var values = textContent.split(/\s*,\s*/);
|
|
expect(values.length).toBe(3);
|
|
|
|
var cartographic1 = new Cartographic();
|
|
var cartographic2 = new Cartographic();
|
|
var count = positions.length;
|
|
for (var i = 0; i < count; ++i) {
|
|
Cartographic.fromCartesian(positions[i], undefined, cartographic1);
|
|
Cartographic.fromDegrees(
|
|
Number(values[0]),
|
|
Number(values[1]),
|
|
Number(values[2]),
|
|
cartographic2
|
|
);
|
|
if (
|
|
Cartographic.equalsEpsilon(
|
|
cartographic1,
|
|
cartographic2,
|
|
CesiumMath.EPSILON7
|
|
)
|
|
) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
it("SampledPosition", function () {
|
|
var position = new SampledPositionProperty();
|
|
position.addSamples(times, positions);
|
|
|
|
var entity1 = createEntity({
|
|
position: position,
|
|
point: {
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {};
|
|
expectedResult.Document.Placemark.Track = {
|
|
altitudeMode: "clampToGround",
|
|
when: checkWhen,
|
|
coord: checkCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("CallbackProperty", function () {
|
|
var index = 0;
|
|
var position = new CallbackProperty(function (time) {
|
|
expect(index < times.length);
|
|
expect(JulianDate.equals(time, times[index])).toBe(true);
|
|
|
|
return positions[index++];
|
|
}, false);
|
|
|
|
var entity1 = createEntity({
|
|
position: position,
|
|
point: {},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {};
|
|
expectedResult.Document.Placemark.Track = {
|
|
altitudeMode: "absolute",
|
|
when: checkWhen,
|
|
coord: checkCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult, {
|
|
defaultAvailability: new TimeInterval({
|
|
start: times[0],
|
|
stop: times[2],
|
|
}),
|
|
sampleDuration: JulianDate.secondsDifference(times[1], times[0]),
|
|
});
|
|
});
|
|
|
|
it("With Model", function () {
|
|
var position = new SampledPositionProperty();
|
|
position.addSamples(times, positions);
|
|
|
|
var entity1 = createEntity({
|
|
position: position,
|
|
model: {
|
|
uri: "http://test.invalid/test",
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Placemark.Track = {
|
|
altitudeMode: "absolute",
|
|
when: checkWhen,
|
|
coord: checkCoord,
|
|
Model: {
|
|
Link: {
|
|
href: "http://test.invalid/test",
|
|
},
|
|
},
|
|
};
|
|
|
|
var blob = new Blob([new Uint8Array([])], {
|
|
type: "model/vnd.collada+xml",
|
|
});
|
|
return checkKmlDoc(entities, expectedResult, {
|
|
modelCallback: function (model, time, externalFiles) {
|
|
externalFiles["test.dae"] = blob;
|
|
return model.uri;
|
|
},
|
|
}).then(function (result) {
|
|
expect(result.externalFiles["test.dae"]).toBe(blob);
|
|
});
|
|
});
|
|
|
|
it("With Path", function () {
|
|
var position = new SampledPositionProperty();
|
|
position.addSamples(times, positions);
|
|
|
|
var entity1 = createEntity({
|
|
position: position,
|
|
point: {
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
},
|
|
path: {
|
|
width: 2,
|
|
material: new ColorMaterialProperty(Color.GREEN),
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {};
|
|
expectedResult.Document.Style.LineStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
width: 2,
|
|
};
|
|
expectedResult.Document.Placemark.Track = {
|
|
altitudeMode: "clampToGround",
|
|
when: checkWhen,
|
|
coord: checkCoord,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
});
|
|
|
|
describe("Polylines", function () {
|
|
var positions = [
|
|
Cartesian3.fromDegrees(-1, -1, 12),
|
|
Cartesian3.fromDegrees(1, -1, 12),
|
|
Cartesian3.fromDegrees(1, 1, 12),
|
|
Cartesian3.fromDegrees(-1, 1, 12),
|
|
];
|
|
|
|
function checkCoords(textContent) {
|
|
var coordinates = textContent.split(" ");
|
|
expect(coordinates.length).toBe(4);
|
|
|
|
var cartographic1 = new Cartographic();
|
|
var cartographic2 = new Cartographic();
|
|
var count = positions.length;
|
|
for (var i = 0; i < count; ++i) {
|
|
Cartographic.fromCartesian(positions[i], undefined, cartographic1);
|
|
var values = coordinates[i].split(",");
|
|
expect(values.length).toBe(3);
|
|
Cartographic.fromDegrees(
|
|
Number(values[0]),
|
|
Number(values[1]),
|
|
Number(values[2]),
|
|
cartographic2
|
|
);
|
|
if (
|
|
Cartographic.equalsEpsilon(
|
|
cartographic1,
|
|
cartographic2,
|
|
CesiumMath.EPSILON7
|
|
)
|
|
) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
it("Clamped to ground", function () {
|
|
var entity1 = createEntity({
|
|
polyline: {
|
|
positions: positions,
|
|
clampToGround: true,
|
|
material: new ColorMaterialProperty(Color.GREEN),
|
|
width: 5,
|
|
zIndex: 2,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.LineStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
width: 5,
|
|
};
|
|
expectedResult.Document.Placemark.LineString = {
|
|
altitudeMode: "clampToGround",
|
|
coordinates: checkCoords,
|
|
tessellate: true,
|
|
drawOrder: 2,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Not clamped to ground", function () {
|
|
var entity1 = createEntity({
|
|
polyline: {
|
|
positions: positions,
|
|
clampToGround: false,
|
|
material: new ColorMaterialProperty(Color.GREEN),
|
|
width: 5,
|
|
zIndex: 2,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.LineStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
width: 5,
|
|
};
|
|
expectedResult.Document.Placemark.LineString = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkCoords,
|
|
drawOrder: 2,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("With outline", function () {
|
|
var entity1 = createEntity({
|
|
polyline: {
|
|
positions: positions,
|
|
clampToGround: false,
|
|
material: new PolylineOutlineMaterialProperty({
|
|
color: Color.GREEN,
|
|
outlineColor: Color.BLUE,
|
|
outlineWidth: 2,
|
|
}),
|
|
width: 5,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.LineStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
width: 5,
|
|
outerColor: "ffff0000",
|
|
outerWidth: 2,
|
|
};
|
|
expectedResult.Document.Placemark.LineString = {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkCoords,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
});
|
|
|
|
describe("Polygons", function () {
|
|
var positions = [
|
|
Cartesian3.fromDegrees(-1, -1, 12),
|
|
Cartesian3.fromDegrees(1, -1, 12),
|
|
Cartesian3.fromDegrees(1, 1, 12),
|
|
Cartesian3.fromDegrees(-1, 1, 12),
|
|
];
|
|
|
|
function getCheckCoords(height) {
|
|
return function (textContent) {
|
|
var coordinates = textContent.split(" ");
|
|
expect(coordinates.length).toBe(4);
|
|
|
|
var cartographic1 = new Cartographic();
|
|
var cartographic2 = new Cartographic();
|
|
var count = positions.length;
|
|
for (var i = 0; i < count; ++i) {
|
|
Cartographic.fromCartesian(positions[i], undefined, cartographic1);
|
|
if (defined(height)) {
|
|
cartographic1.height = height;
|
|
}
|
|
|
|
var values = coordinates[i].split(",");
|
|
expect(values.length).toBe(3);
|
|
Cartographic.fromDegrees(
|
|
Number(values[0]),
|
|
Number(values[1]),
|
|
Number(values[2]),
|
|
cartographic2
|
|
);
|
|
if (
|
|
Cartographic.equalsEpsilon(
|
|
cartographic1,
|
|
cartographic2,
|
|
CesiumMath.EPSILON7
|
|
)
|
|
) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
it("Polygon with outline", function () {
|
|
var entity1 = createEntity({
|
|
polygon: {
|
|
hierarchy: positions,
|
|
height: 10,
|
|
perPositionHeight: false,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
extrudedHeight: 0,
|
|
fill: true,
|
|
material: new ColorMaterialProperty(Color.GREEN),
|
|
outline: true,
|
|
outlineWidth: 5,
|
|
outlineColor: Color.BLUE,
|
|
zIndex: 2,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.PolyStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
fill: true,
|
|
outline: true,
|
|
};
|
|
expectedResult.Document.Style.LineStyle = {
|
|
color: "ffff0000",
|
|
colorMode: "normal",
|
|
width: 5,
|
|
};
|
|
expectedResult.Document.Placemark.Polygon = {
|
|
altitudeMode: "clampToGround",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(10),
|
|
},
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Polygon with extrusion", function () {
|
|
var entity1 = createEntity({
|
|
polygon: {
|
|
hierarchy: positions,
|
|
height: 10,
|
|
perPositionHeight: false,
|
|
extrudedHeight: 20,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.PolyStyle = {};
|
|
expectedResult.Document.Placemark.Polygon = {
|
|
altitudeMode: "absolute",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(20), // We use extrudedHeight
|
|
},
|
|
},
|
|
extrude: true,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Polygon with extrusion and perPositionHeights", function () {
|
|
var entity1 = createEntity({
|
|
polygon: {
|
|
hierarchy: positions,
|
|
height: 10,
|
|
perPositionHeight: true,
|
|
extrudedHeight: 20,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.PolyStyle = {};
|
|
expectedResult.Document.Placemark.Polygon = {
|
|
altitudeMode: "absolute",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(), // Use per position height
|
|
},
|
|
},
|
|
extrude: true,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Polygon with holes", function () {
|
|
var entity1 = createEntity({
|
|
polygon: {
|
|
hierarchy: new PolygonHierarchy(positions, [
|
|
new PolygonHierarchy(positions),
|
|
]),
|
|
height: 10,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.PolyStyle = {};
|
|
expectedResult.Document.Placemark.Polygon = {
|
|
altitudeMode: "absolute",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(10),
|
|
},
|
|
},
|
|
innerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(10),
|
|
},
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Rectangle extruded", function () {
|
|
var entity1 = createEntity({
|
|
rectangle: {
|
|
coordinates: Rectangle.fromDegrees(-1, -1, 1, 1),
|
|
height: 10,
|
|
perPositionHeight: false,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
extrudedHeight: 20,
|
|
fill: true,
|
|
material: new ColorMaterialProperty(Color.GREEN),
|
|
outline: true,
|
|
outlineWidth: 5,
|
|
outlineColor: Color.BLUE,
|
|
zIndex: 2,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.PolyStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
fill: true,
|
|
outline: true,
|
|
};
|
|
expectedResult.Document.Style.LineStyle = {
|
|
color: "ffff0000",
|
|
colorMode: "normal",
|
|
width: 5,
|
|
};
|
|
expectedResult.Document.Placemark.Polygon = {
|
|
altitudeMode: "clampToGround",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(20),
|
|
},
|
|
},
|
|
extrude: true,
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
|
|
it("Rectangle not extruded", function () {
|
|
var entity1 = createEntity({
|
|
rectangle: {
|
|
coordinates: Rectangle.fromDegrees(-1, -1, 1, 1),
|
|
height: 10,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
material: new ColorMaterialProperty(Color.GREEN),
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.PolyStyle = {
|
|
color: "ff008000",
|
|
colorMode: "normal",
|
|
};
|
|
expectedResult.Document.Placemark.Polygon = {
|
|
altitudeMode: "clampToGround",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(10),
|
|
},
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
});
|
|
|
|
describe("Models", function () {
|
|
it("Model with constant position", function () {
|
|
var entity1 = createEntity({
|
|
model: {
|
|
uri: "http://test.invalid/test.glb",
|
|
scale: 3,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var cartographic = Cartographic.fromCartesian(pointPosition);
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Placemark.Model = {
|
|
altitudeMode: "clampToGround",
|
|
Location: {
|
|
longitude: CesiumMath.toDegrees(cartographic.longitude),
|
|
latitude: CesiumMath.toDegrees(cartographic.latitude),
|
|
altitude: cartographic.height,
|
|
},
|
|
Link: {
|
|
href: "http://test.invalid/test.dae",
|
|
},
|
|
scale: {
|
|
x: 3,
|
|
y: 3,
|
|
z: 3,
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult, {
|
|
modelCallback: function (model, time) {
|
|
return model.uri.getValue(time).replace(".glb", ".dae");
|
|
},
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("GroundOverlays", function () {
|
|
it("Rectangle", function () {
|
|
var entity = createEntity({
|
|
rectangle: {
|
|
coordinates: Rectangle.fromDegrees(-1, -1, 1, 1),
|
|
height: 10,
|
|
heightReference: HeightReference.CLAMP_TO_GROUND,
|
|
material: new ImageMaterialProperty({
|
|
image: "../images/logo.jpg",
|
|
color: Color.GREEN,
|
|
}),
|
|
},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity);
|
|
|
|
var expectedResult = {
|
|
Document: {
|
|
GroundOverlay: {
|
|
_: {
|
|
id: entity.id,
|
|
},
|
|
name: entity.name,
|
|
visibility: entity.show ? 1 : 0,
|
|
description: entity.description,
|
|
altitude: 10,
|
|
altitudeMode: "clampToGround",
|
|
LatLonBox: {
|
|
north: 1,
|
|
south: -1,
|
|
east: 1,
|
|
west: -1,
|
|
},
|
|
Icon: {
|
|
href: "../images/logo.jpg",
|
|
},
|
|
color: "ff008000",
|
|
},
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
});
|
|
|
|
describe("Multigeometry", function () {
|
|
var positions = [
|
|
Cartesian3.fromDegrees(-1, -1, 12),
|
|
Cartesian3.fromDegrees(1, -1, 12),
|
|
Cartesian3.fromDegrees(1, 1, 12),
|
|
Cartesian3.fromDegrees(-1, 1, 12),
|
|
];
|
|
|
|
function getCheckCoords() {
|
|
return function (textContent) {
|
|
var coordinates = textContent.split(" ");
|
|
expect(coordinates.length).toBe(4);
|
|
|
|
var cartographic1 = new Cartographic();
|
|
var cartographic2 = new Cartographic();
|
|
var count = positions.length;
|
|
for (var i = 0; i < count; ++i) {
|
|
Cartographic.fromCartesian(positions[i], undefined, cartographic1);
|
|
cartographic1.height = 0;
|
|
|
|
var values = coordinates[i].split(",");
|
|
expect(values.length).toBe(3);
|
|
Cartographic.fromDegrees(
|
|
Number(values[0]),
|
|
Number(values[1]),
|
|
Number(values[2]),
|
|
cartographic2
|
|
);
|
|
if (
|
|
Cartographic.equalsEpsilon(
|
|
cartographic1,
|
|
cartographic2,
|
|
CesiumMath.EPSILON7
|
|
)
|
|
) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
it("Polygon and Point", function () {
|
|
var entity1 = createEntity({
|
|
polygon: {
|
|
hierarchy: positions,
|
|
},
|
|
point: {},
|
|
});
|
|
|
|
var entities = new EntityCollection();
|
|
entities.add(entity1);
|
|
|
|
var expectedResult = createExpectResult(entity1);
|
|
expectedResult.Document.Style.IconStyle = {};
|
|
expectedResult.Document.Style.PolyStyle = {};
|
|
expectedResult.Document.Placemark.MultiGeometry = {
|
|
Point: {
|
|
altitudeMode: "absolute",
|
|
coordinates: checkPointCoord,
|
|
},
|
|
Polygon: {
|
|
altitudeMode: "absolute",
|
|
outerBoundaryIs: {
|
|
LinearRing: {
|
|
coordinates: getCheckCoords(),
|
|
},
|
|
},
|
|
extrude: true,
|
|
},
|
|
};
|
|
|
|
checkKmlDoc(entities, expectedResult);
|
|
});
|
|
});
|
|
});
|