| 1234567891011121314151617181920212223 |
- // Original DEM ellipsoid heights must be converted before use as ENU mesh Z.
- import assert from 'node:assert/strict'
- import { Cartesian3, Matrix4 } from 'cesium'
- export function terrainInLocalFrame(transform, samples, heights) {
- assert.equal(samples.length, heights.length, 'terrain point/height mismatch')
- const inverse = Matrix4.inverseTransformation(Matrix4.fromArray(transform), new Matrix4())
- return samples.map((sample, index) => {
- assert.ok(Number.isFinite(heights[index]) && heights[index] > 1, 'invalid original DEM height')
- const local = Matrix4.multiplyByPoint(inverse,
- Cartesian3.fromDegrees(sample.lon, sample.lat, heights[index]), new Cartesian3())
- return [local.x, local.y, local.z]
- })
- }
- export function localSeatingLevels(transform, samples, heights) {
- const points = terrainInLocalFrame(transform, samples, heights)
- const minimum = Math.min(...points.map(p => p[2])), maximum = Math.max(...points.map(p => p[2]))
- return { minimum, maximum, relief: maximum - minimum,
- floorZ: maximum - .25, foundationBottom: minimum - 3,
- ellipsoidMinimum: Math.min(...heights), ellipsoidMaximum: Math.max(...heights),
- heightFrame: 'project-local-ENU-up' }
- }
|