createVectorTilePoints.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import AttributeCompression from "../Core/AttributeCompression.js";
  2. import Cartesian3 from "../Core/Cartesian3.js";
  3. import Cartographic from "../Core/Cartographic.js";
  4. import Ellipsoid from "../Core/Ellipsoid.js";
  5. import CesiumMath from "../Core/Math.js";
  6. import Rectangle from "../Core/Rectangle.js";
  7. import createTaskProcessorWorker from "./createTaskProcessorWorker.js";
  8. const maxShort = 32767;
  9. const scratchBVCartographic = new Cartographic();
  10. const scratchEncodedPosition = new Cartesian3();
  11. const scratchRectangle = new Rectangle();
  12. const scratchEllipsoid = new Ellipsoid();
  13. const scratchMinMaxHeights = {
  14. min: undefined,
  15. max: undefined,
  16. };
  17. function unpackBuffer(packedBuffer) {
  18. packedBuffer = new Float64Array(packedBuffer);
  19. let offset = 0;
  20. scratchMinMaxHeights.min = packedBuffer[offset++];
  21. scratchMinMaxHeights.max = packedBuffer[offset++];
  22. Rectangle.unpack(packedBuffer, offset, scratchRectangle);
  23. offset += Rectangle.packedLength;
  24. Ellipsoid.unpack(packedBuffer, offset, scratchEllipsoid);
  25. }
  26. function createVectorTilePoints(parameters, transferableObjects) {
  27. const positions = new Uint16Array(parameters.positions);
  28. unpackBuffer(parameters.packedBuffer);
  29. const rectangle = scratchRectangle;
  30. const ellipsoid = scratchEllipsoid;
  31. const minimumHeight = scratchMinMaxHeights.min;
  32. const maximumHeight = scratchMinMaxHeights.max;
  33. const positionsLength = positions.length / 3;
  34. const uBuffer = positions.subarray(0, positionsLength);
  35. const vBuffer = positions.subarray(positionsLength, 2 * positionsLength);
  36. const heightBuffer = positions.subarray(
  37. 2 * positionsLength,
  38. 3 * positionsLength
  39. );
  40. AttributeCompression.zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer);
  41. const decoded = new Float64Array(positions.length);
  42. for (let i = 0; i < positionsLength; ++i) {
  43. const u = uBuffer[i];
  44. const v = vBuffer[i];
  45. const h = heightBuffer[i];
  46. const lon = CesiumMath.lerp(rectangle.west, rectangle.east, u / maxShort);
  47. const lat = CesiumMath.lerp(rectangle.south, rectangle.north, v / maxShort);
  48. const alt = CesiumMath.lerp(minimumHeight, maximumHeight, h / maxShort);
  49. const cartographic = Cartographic.fromRadians(
  50. lon,
  51. lat,
  52. alt,
  53. scratchBVCartographic
  54. );
  55. const decodedPosition = ellipsoid.cartographicToCartesian(
  56. cartographic,
  57. scratchEncodedPosition
  58. );
  59. Cartesian3.pack(decodedPosition, decoded, i * 3);
  60. }
  61. transferableObjects.push(decoded.buffer);
  62. return {
  63. positions: decoded.buffer,
  64. };
  65. }
  66. export default createTaskProcessorWorker(createVectorTilePoints);