UNPKG

cesium-cartographic

Version:

Math helper extensions for cartographic calculation in Cesium.js

76 lines (60 loc) 3.22 kB
import * as gc from './great-circle.mjs' import { expect, test } from '@jest/globals' import * as Cesium from 'cesium' const expectSameCarto = (carto1, carto2) => { const c1 = Cesium.Cartographic.toCartesian(carto1) const c2 = Cesium.Cartographic.toCartesian(carto2) expect(Cesium.Cartesian3.distance(c1, c2)).toBeCloseTo(0, 3) } test('great-circle bearing', () => { expect(gc.greatCircleInitialBearing(Cesium.Cartographic.fromDegrees(0, 0, 0), Cesium.Cartographic.fromDegrees(0, 10, 0))).toBeCloseTo(0, 5) expect(gc.greatCircleInitialBearing(Cesium.Cartographic.fromDegrees(0, 0, 0), Cesium.Cartographic.fromDegrees(10, 0, 0))).toBeCloseTo(Math.PI / 2, 5) expect(gc.greatCircleInitialBearing(Cesium.Cartographic.fromDegrees(0, 0, 0), Cesium.Cartographic.fromDegrees(0, -10, 0))).toBeCloseTo(Math.PI, 5) expect(gc.greatCircleInitialBearing(Cesium.Cartographic.fromDegrees(0, 0, 0), Cesium.Cartographic.fromDegrees(-10, 0, 0))).toBeCloseTo(Math.PI * (3 / 2), 5) }) test('great-circle triplet', () => { const carto1 = Cesium.Cartographic.fromDegrees(0, 0, 0) const carto2 = Cesium.Cartographic.fromDegrees(10, 10, 0) const b = gc.greatCircleInitialBearing(carto1, carto2) expect(b).toBeCloseTo(Math.PI / 4, 1) const d = gc.greatCircleGroundDistance(carto1, carto2) expect(d).toBeCloseTo(1568520.556798576, 5) const cartoB = gc.greatCircleTranslate(carto1, [d, b]) expectSameCarto(cartoB, carto2) const nb = gc.greatCircleInitialBearing(carto2, carto1) const cartoC = gc.greatCircleTranslate(carto2, [d, nb]) expectSameCarto(cartoC, carto1) }) test('great-circle translation', () => { const carto1 = Cesium.Cartographic.fromDegrees(0, 0, 0) const carto2 = Cesium.Cartographic.fromDegrees(10, 10, 0) const t = gc.greatCircleTranslation(carto1, carto2) expect(t[0]).toBeCloseTo(gc.greatCircleGroundDistance(carto1, carto2), 9) expect(t[1]).toBeCloseTo(gc.greatCircleInitialBearing(carto1, carto2), 9) const cartoB = gc.greatCircleTranslate(carto1, t) expectSameCarto(cartoB, carto2) const nt = gc.greatCircleTranslation(carto2, carto1) expect(nt[0]).toBeCloseTo(gc.greatCircleGroundDistance(carto2, carto1), 9) expect(nt[1]).toBeCloseTo(gc.greatCircleInitialBearing(carto2, carto1), 9) expect(nt[0]).toBeCloseTo(t[0], 9) const cartoC = gc.greatCircleTranslate(carto2, [t[0], nt[1]]) expectSameCarto(cartoC, carto1) }) test('great-circle no move', () => { const carto1 = Cesium.Cartographic.fromDegrees(0, 0, 0) const t = gc.greatCircleTranslation(carto1, carto1) expect(t[0]).toBeCloseTo(0, 9) const carto2 = gc.greatCircleTranslate(carto1, t) expectSameCarto(carto1, carto2) }) test('great-circle end bearing', () => { const carto1 = Cesium.Cartographic.fromDegrees(0, 0, 0) const carto2 = Cesium.Cartographic.fromDegrees(10, 10, 0) const ib = gc.greatCircleInitialBearing(carto1, carto2) const eb = gc.greatCircleEndBearing(carto1, carto2) expect(Math.abs(ib - eb)).toBeGreaterThan(0) expect(Math.abs(ib - eb)).toBeLessThan(Math.PI / 4) const ib2 = gc.greatCircleInitialBearing(carto1, carto1) const eb2 = gc.greatCircleEndBearing(carto1, carto1) expect(Math.abs(ib2 - eb2)).toBeLessThan(Cesium.Math.EPSILON19) })