decodeVectorPolylinePositions.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import AttributeCompression from "./AttributeCompression.js";
  2. import Cartesian3 from "./Cartesian3.js";
  3. import Cartographic from "./Cartographic.js";
  4. import CesiumMath from "./Math.js";
  5. const maxShort = 32767;
  6. const scratchBVCartographic = new Cartographic();
  7. const scratchEncodedPosition = new Cartesian3();
  8. function decodeVectorPolylinePositions(
  9. positions,
  10. rectangle,
  11. minimumHeight,
  12. maximumHeight,
  13. ellipsoid
  14. ) {
  15. const positionsLength = positions.length / 3;
  16. const uBuffer = positions.subarray(0, positionsLength);
  17. const vBuffer = positions.subarray(positionsLength, 2 * positionsLength);
  18. const heightBuffer = positions.subarray(
  19. 2 * positionsLength,
  20. 3 * positionsLength
  21. );
  22. AttributeCompression.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer);
  23. const decoded = new Float64Array(positions.length);
  24. for (let i = 0; i < positionsLength; ++i) {
  25. const u = uBuffer[i];
  26. const v = vBuffer[i];
  27. const h = heightBuffer[i];
  28. const lon = CesiumMath.lerp(rectangle.west, rectangle.east, u / maxShort);
  29. const lat = CesiumMath.lerp(rectangle.south, rectangle.north, v / maxShort);
  30. const alt = CesiumMath.lerp(minimumHeight, maximumHeight, h / maxShort);
  31. const cartographic = Cartographic.fromRadians(
  32. lon,
  33. lat,
  34. alt,
  35. scratchBVCartographic
  36. );
  37. const decodedPosition = ellipsoid.cartographicToCartesian(
  38. cartographic,
  39. scratchEncodedPosition
  40. );
  41. Cartesian3.pack(decodedPosition, decoded, i * 3);
  42. }
  43. return decoded;
  44. }
  45. export default decodeVectorPolylinePositions;