NODEDC_DESIGN_GUIDELINE/scripts/hgeozone-projection.test.mjs

49 lines
1.8 KiB
JavaScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
import ApproximateTerrainHeights from "@cesium/engine/Source/Core/ApproximateTerrainHeights.js";
import Cartesian3 from "@cesium/engine/Source/Core/Cartesian3.js";
import GroundPolylineGeometry from "@cesium/engine/Source/Core/GroundPolylineGeometry.js";
import { normalizeHGeoZoneRing } from "../apps/catalog/src/hGeoZoneProjection.mjs";
test("normalizes GeoJSON closure and adjacent duplicates without changing the polygon", () => {
assert.deepEqual(normalizeHGeoZoneRing([
[37, 55],
[37, 55],
[38, 55],
[38, 56],
[37, 55],
[37, 55],
]), [
[37, 55],
[38, 55],
[38, 56],
]);
});
test("rejects an invalid or degenerate ring instead of publishing partial geometry", () => {
assert.deepEqual(normalizeHGeoZoneRing([[37, 55], [38, 55], [37, 55]]), []);
assert.deepEqual(normalizeHGeoZoneRing([[37, 55], [38, Number.NaN], [38, 56], [37, 55]]), []);
assert.deepEqual(normalizeHGeoZoneRing([[37, 55], [181, 55], [38, 56], [37, 55]]), []);
});
test("normalized double-closed ring is accepted by Cesium GroundPolylineGeometry", async () => {
ApproximateTerrainHeights._terrainHeights = JSON.parse(await readFile(
new URL("../node_modules/@cesium/engine/Source/Assets/approximateTerrainHeights.json", import.meta.url),
"utf8",
));
const positions = normalizeHGeoZoneRing([
[37.55, 55.75],
[37.56, 55.75],
[37.56, 55.76],
[37.55, 55.75],
[37.55, 55.75],
]).map(([longitude, latitude]) => Cartesian3.fromDegrees(longitude, latitude));
const geometry = GroundPolylineGeometry.createGeometry(new GroundPolylineGeometry({
positions,
width: 1.5,
loop: true,
}));
assert.ok(geometry);
});