@loaders.gl/pointclouds 0.0.0-stage → 5.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/LAS-README.md +12 -0
  2. package/LICENSE +24 -0
  3. package/PCD-README.md +12 -0
  4. package/PLY-README.md +38 -0
  5. package/README.md +11 -2
  6. package/THIRD-PARTY-NOTICES.md +27 -0
  7. package/dist/dist.dev.js +31514 -0
  8. package/dist/dist.min.js +54 -0
  9. package/dist/index.cjs +55 -0
  10. package/dist/index.cjs.map +7 -0
  11. package/dist/index.d.ts +16 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +13 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/las/bundled.cjs +69 -0
  16. package/dist/las/bundled.cjs.map +7 -0
  17. package/dist/las/bundled.d.ts +11 -0
  18. package/dist/las/bundled.d.ts.map +1 -0
  19. package/dist/las/bundled.js +11 -0
  20. package/dist/las/bundled.js.map +1 -0
  21. package/dist/las/index.cjs +75 -0
  22. package/dist/las/index.cjs.map +7 -0
  23. package/dist/las/index.d.ts +15 -0
  24. package/dist/las/index.d.ts.map +1 -0
  25. package/dist/las/index.js +12 -0
  26. package/dist/las/index.js.map +1 -0
  27. package/dist/las/las-copc-loader-types.cjs +49 -0
  28. package/dist/las/las-copc-loader-types.cjs.map +7 -0
  29. package/dist/las/las-copc-loader-types.d.ts +67 -0
  30. package/dist/las/las-copc-loader-types.d.ts.map +1 -0
  31. package/dist/las/las-copc-loader-types.js +14 -0
  32. package/dist/las/las-copc-loader-types.js.map +1 -0
  33. package/dist/las/las-copc-loader.cjs +60 -0
  34. package/dist/las/las-copc-loader.cjs.map +7 -0
  35. package/dist/las/las-copc-loader.d.ts +39 -0
  36. package/dist/las/las-copc-loader.d.ts.map +1 -0
  37. package/dist/las/las-copc-loader.js +45 -0
  38. package/dist/las/las-copc-loader.js.map +1 -0
  39. package/dist/las/las-format.cjs +44 -0
  40. package/dist/las/las-format.cjs.map +7 -0
  41. package/dist/las/las-format.d.ts +16 -0
  42. package/dist/las/las-format.d.ts.map +1 -0
  43. package/dist/las/las-format.js +19 -0
  44. package/dist/las/las-format.js.map +1 -0
  45. package/dist/las/las-loader-shared.cjs +84 -0
  46. package/dist/las/las-loader-shared.cjs.map +7 -0
  47. package/dist/las/las-loader-shared.d.ts +68 -0
  48. package/dist/las/las-loader-shared.d.ts.map +1 -0
  49. package/dist/las/las-loader-shared.js +60 -0
  50. package/dist/las/las-loader-shared.js.map +1 -0
  51. package/dist/las/las-loader-types.cjs +51 -0
  52. package/dist/las/las-loader-types.cjs.map +7 -0
  53. package/dist/las/las-loader-types.d.ts +77 -0
  54. package/dist/las/las-loader-types.d.ts.map +1 -0
  55. package/dist/las/las-loader-types.js +17 -0
  56. package/dist/las/las-loader-types.js.map +1 -0
  57. package/dist/las/las-loader.cjs +128 -0
  58. package/dist/las/las-loader.cjs.map +7 -0
  59. package/dist/las/las-loader.d.ts +91 -0
  60. package/dist/las/las-loader.d.ts.map +1 -0
  61. package/dist/las/las-loader.js +108 -0
  62. package/dist/las/las-loader.js.map +1 -0
  63. package/dist/las/las-writer.cjs +1054 -0
  64. package/dist/las/las-writer.cjs.map +7 -0
  65. package/dist/las/las-writer.d.ts +70 -0
  66. package/dist/las/las-writer.d.ts.map +1 -0
  67. package/dist/las/las-writer.js +992 -0
  68. package/dist/las/las-writer.js.map +1 -0
  69. package/dist/las/laz-rs-loader-types.cjs +49 -0
  70. package/dist/las/laz-rs-loader-types.cjs.map +7 -0
  71. package/dist/las/laz-rs-loader-types.d.ts +69 -0
  72. package/dist/las/laz-rs-loader-types.d.ts.map +1 -0
  73. package/dist/las/laz-rs-loader-types.js +16 -0
  74. package/dist/las/laz-rs-loader-types.js.map +1 -0
  75. package/dist/las/laz-rs-loader.cjs +275 -0
  76. package/dist/las/laz-rs-loader.cjs.map +7 -0
  77. package/dist/las/laz-rs-loader.d.ts +39 -0
  78. package/dist/las/laz-rs-loader.d.ts.map +1 -0
  79. package/dist/las/laz-rs-loader.js +43 -0
  80. package/dist/las/laz-rs-loader.js.map +1 -0
  81. package/dist/las/lazperf-loader-types.cjs +49 -0
  82. package/dist/las/lazperf-loader-types.cjs.map +7 -0
  83. package/dist/las/lazperf-loader-types.d.ts +71 -0
  84. package/dist/las/lazperf-loader-types.d.ts.map +1 -0
  85. package/dist/las/lazperf-loader-types.js +17 -0
  86. package/dist/las/lazperf-loader-types.js.map +1 -0
  87. package/dist/las/lazperf-loader.cjs +63 -0
  88. package/dist/las/lazperf-loader.cjs.map +7 -0
  89. package/dist/las/lazperf-loader.d.ts +41 -0
  90. package/dist/las/lazperf-loader.d.ts.map +1 -0
  91. package/dist/las/lazperf-loader.js +49 -0
  92. package/dist/las/lazperf-loader.js.map +1 -0
  93. package/dist/las/lib/copc/parse-las.cjs +177 -0
  94. package/dist/las/lib/copc/parse-las.cjs.map +7 -0
  95. package/dist/las/lib/copc/parse-las.d.ts +17 -0
  96. package/dist/las/lib/copc/parse-las.d.ts.map +1 -0
  97. package/dist/las/lib/copc/parse-las.js +215 -0
  98. package/dist/las/lib/copc/parse-las.js.map +1 -0
  99. package/dist/las/lib/get-las-schema.cjs +67 -0
  100. package/dist/las/lib/get-las-schema.cjs.map +7 -0
  101. package/dist/las/lib/get-las-schema.d.ts +16 -0
  102. package/dist/las/lib/get-las-schema.d.ts.map +1 -0
  103. package/dist/las/lib/get-las-schema.js +52 -0
  104. package/dist/las/lib/get-las-schema.js.map +1 -0
  105. package/dist/las/lib/las-compatibility.cjs +110 -0
  106. package/dist/las/lib/las-compatibility.cjs.map +7 -0
  107. package/dist/las/lib/las-compatibility.d.ts +40 -0
  108. package/dist/las/lib/las-compatibility.d.ts.map +1 -0
  109. package/dist/las/lib/las-compatibility.js +115 -0
  110. package/dist/las/lib/las-compatibility.js.map +1 -0
  111. package/dist/las/lib/las-extra-bytes.cjs +228 -0
  112. package/dist/las/lib/las-extra-bytes.cjs.map +7 -0
  113. package/dist/las/lib/las-extra-bytes.d.ts +35 -0
  114. package/dist/las/lib/las-extra-bytes.d.ts.map +1 -0
  115. package/dist/las/lib/las-extra-bytes.js +197 -0
  116. package/dist/las/lib/las-extra-bytes.js.map +1 -0
  117. package/dist/las/lib/las-types.cjs +19 -0
  118. package/dist/las/lib/las-types.cjs.map +7 -0
  119. package/dist/las/lib/las-types.d.ts +194 -0
  120. package/dist/las/lib/las-types.d.ts.map +1 -0
  121. package/dist/las/lib/las-types.js +5 -0
  122. package/dist/las/lib/las-types.js.map +1 -0
  123. package/dist/las/lib/las-waveform.cjs +196 -0
  124. package/dist/las/lib/las-waveform.cjs.map +7 -0
  125. package/dist/las/lib/las-waveform.d.ts +89 -0
  126. package/dist/las/lib/las-waveform.d.ts.map +1 -0
  127. package/dist/las/lib/las-waveform.js +193 -0
  128. package/dist/las/lib/las-waveform.js.map +1 -0
  129. package/dist/las/lib/laz-perf/laslaz-decoder.cjs +382 -0
  130. package/dist/las/lib/laz-perf/laslaz-decoder.cjs.map +7 -0
  131. package/dist/las/lib/laz-perf/laslaz-decoder.d.ts +129 -0
  132. package/dist/las/lib/laz-perf/laslaz-decoder.d.ts.map +1 -0
  133. package/dist/las/lib/laz-perf/laslaz-decoder.js +377 -0
  134. package/dist/las/lib/laz-perf/laslaz-decoder.js.map +1 -0
  135. package/dist/las/lib/laz-perf/parse-las.cjs +271 -0
  136. package/dist/las/lib/laz-perf/parse-las.cjs.map +7 -0
  137. package/dist/las/lib/laz-perf/parse-las.d.ts +24 -0
  138. package/dist/las/lib/laz-perf/parse-las.d.ts.map +1 -0
  139. package/dist/las/lib/laz-perf/parse-las.js +308 -0
  140. package/dist/las/lib/laz-perf/parse-las.js.map +1 -0
  141. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.cjs +631 -0
  142. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.cjs.map +7 -0
  143. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.d.ts +129 -0
  144. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.d.ts.map +1 -0
  145. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.js +414 -0
  146. package/dist/las/lib/laz-rs-wasm/laslaz-decoder.js.map +1 -0
  147. package/dist/las/lib/laz-rs-wasm/parse-las.cjs +271 -0
  148. package/dist/las/lib/laz-rs-wasm/parse-las.cjs.map +7 -0
  149. package/dist/las/lib/laz-rs-wasm/parse-las.d.ts +24 -0
  150. package/dist/las/lib/laz-rs-wasm/parse-las.d.ts.map +1 -0
  151. package/dist/las/lib/laz-rs-wasm/parse-las.js +308 -0
  152. package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -0
  153. package/dist/las/lib/typescript/parse-las.cjs +2889 -0
  154. package/dist/las/lib/typescript/parse-las.cjs.map +7 -0
  155. package/dist/las/lib/typescript/parse-las.d.ts +39 -0
  156. package/dist/las/lib/typescript/parse-las.d.ts.map +1 -0
  157. package/dist/las/lib/typescript/parse-las.js +2703 -0
  158. package/dist/las/lib/typescript/parse-las.js.map +1 -0
  159. package/dist/las/libs/laz-perf/laz-perf.cjs +18093 -0
  160. package/dist/las/libs/laz-perf/laz-perf.cjs.map +7 -0
  161. package/dist/las/libs/laz-perf/laz-perf.d.ts +2 -0
  162. package/dist/las/libs/laz-perf/laz-perf.d.ts.map +1 -0
  163. package/dist/las/libs/laz-perf/laz-perf.js +19003 -0
  164. package/dist/las/libs/laz-perf/laz-perf.js.map +1 -0
  165. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +95 -0
  166. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts.map +1 -0
  167. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.js +442 -0
  168. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm.js.map +1 -0
  169. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
  170. package/dist/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
  171. package/dist/las/unbundled.cjs +69 -0
  172. package/dist/las/unbundled.cjs.map +7 -0
  173. package/dist/las/unbundled.d.ts +11 -0
  174. package/dist/las/unbundled.d.ts.map +1 -0
  175. package/dist/las/unbundled.js +11 -0
  176. package/dist/las/unbundled.js.map +1 -0
  177. package/dist/las/workers/las-worker.cjs +23 -0
  178. package/dist/las/workers/las-worker.cjs.map +7 -0
  179. package/dist/las/workers/las-worker.d.ts +2 -0
  180. package/dist/las/workers/las-worker.d.ts.map +1 -0
  181. package/dist/las/workers/las-worker.js +23 -0
  182. package/dist/las/workers/las-worker.js.map +1 -0
  183. package/dist/las-copc-loader-types.cjs +51 -0
  184. package/dist/las-copc-loader-types.cjs.map +7 -0
  185. package/dist/las-copc-loader-types.d.ts +2 -0
  186. package/dist/las-copc-loader-types.d.ts.map +1 -0
  187. package/dist/las-copc-loader-types.js +2 -0
  188. package/dist/las-copc-loader-types.js.map +1 -0
  189. package/dist/las-copc-loader.cjs +62 -0
  190. package/dist/las-copc-loader.cjs.map +7 -0
  191. package/dist/las-copc-loader.d.ts +2 -0
  192. package/dist/las-copc-loader.d.ts.map +1 -0
  193. package/dist/las-copc-loader.js +2 -0
  194. package/dist/las-copc-loader.js.map +1 -0
  195. package/dist/las-loader-types.cjs +53 -0
  196. package/dist/las-loader-types.cjs.map +7 -0
  197. package/dist/las-loader-types.d.ts +2 -0
  198. package/dist/las-loader-types.d.ts.map +1 -0
  199. package/dist/las-loader-types.js +2 -0
  200. package/dist/las-loader-types.js.map +1 -0
  201. package/dist/las-loader.cjs +130 -0
  202. package/dist/las-loader.cjs.map +7 -0
  203. package/dist/las-loader.d.ts +2 -0
  204. package/dist/las-loader.d.ts.map +1 -0
  205. package/dist/las-loader.js +2 -0
  206. package/dist/las-loader.js.map +1 -0
  207. package/dist/las-worker.js +24024 -0
  208. package/dist/las-writer.cjs +1056 -0
  209. package/dist/las-writer.cjs.map +7 -0
  210. package/dist/las-writer.d.ts +2 -0
  211. package/dist/las-writer.d.ts.map +1 -0
  212. package/dist/las-writer.js +2 -0
  213. package/dist/las-writer.js.map +1 -0
  214. package/dist/laz-rs-loader-types.cjs +51 -0
  215. package/dist/laz-rs-loader-types.cjs.map +7 -0
  216. package/dist/laz-rs-loader-types.d.ts +2 -0
  217. package/dist/laz-rs-loader-types.d.ts.map +1 -0
  218. package/dist/laz-rs-loader-types.js +2 -0
  219. package/dist/laz-rs-loader-types.js.map +1 -0
  220. package/dist/laz-rs-loader.cjs +277 -0
  221. package/dist/laz-rs-loader.cjs.map +7 -0
  222. package/dist/laz-rs-loader.d.ts +2 -0
  223. package/dist/laz-rs-loader.d.ts.map +1 -0
  224. package/dist/laz-rs-loader.js +2 -0
  225. package/dist/laz-rs-loader.js.map +1 -0
  226. package/dist/lazperf-loader-types.cjs +51 -0
  227. package/dist/lazperf-loader-types.cjs.map +7 -0
  228. package/dist/lazperf-loader-types.d.ts +2 -0
  229. package/dist/lazperf-loader-types.d.ts.map +1 -0
  230. package/dist/lazperf-loader-types.js +2 -0
  231. package/dist/lazperf-loader-types.js.map +1 -0
  232. package/dist/lazperf-loader.cjs +65 -0
  233. package/dist/lazperf-loader.cjs.map +7 -0
  234. package/dist/lazperf-loader.d.ts +2 -0
  235. package/dist/lazperf-loader.d.ts.map +1 -0
  236. package/dist/lazperf-loader.js +2 -0
  237. package/dist/lazperf-loader.js.map +1 -0
  238. package/dist/pcd/bundled.cjs +31 -0
  239. package/dist/pcd/bundled.cjs.map +7 -0
  240. package/dist/pcd/bundled.d.ts +3 -0
  241. package/dist/pcd/bundled.d.ts.map +1 -0
  242. package/dist/pcd/bundled.js +5 -0
  243. package/dist/pcd/bundled.js.map +1 -0
  244. package/dist/pcd/index.cjs +37 -0
  245. package/dist/pcd/index.cjs.map +7 -0
  246. package/dist/pcd/index.d.ts +6 -0
  247. package/dist/pcd/index.d.ts.map +1 -0
  248. package/dist/pcd/index.js +7 -0
  249. package/dist/pcd/index.js.map +1 -0
  250. package/dist/pcd/lib/decompress-lzf.cjs +80 -0
  251. package/dist/pcd/lib/decompress-lzf.cjs.map +7 -0
  252. package/dist/pcd/lib/decompress-lzf.d.ts +7 -0
  253. package/dist/pcd/lib/decompress-lzf.d.ts.map +1 -0
  254. package/dist/pcd/lib/decompress-lzf.js +62 -0
  255. package/dist/pcd/lib/decompress-lzf.js.map +1 -0
  256. package/dist/pcd/lib/get-pcd-schema.cjs +70 -0
  257. package/dist/pcd/lib/get-pcd-schema.cjs.map +7 -0
  258. package/dist/pcd/lib/get-pcd-schema.d.ts +10 -0
  259. package/dist/pcd/lib/get-pcd-schema.d.ts.map +1 -0
  260. package/dist/pcd/lib/get-pcd-schema.js +53 -0
  261. package/dist/pcd/lib/get-pcd-schema.js.map +1 -0
  262. package/dist/pcd/lib/parse-pcd.cjs +354 -0
  263. package/dist/pcd/lib/parse-pcd.cjs.map +7 -0
  264. package/dist/pcd/lib/parse-pcd.d.ts +20 -0
  265. package/dist/pcd/lib/parse-pcd.d.ts.map +1 -0
  266. package/dist/pcd/lib/parse-pcd.js +341 -0
  267. package/dist/pcd/lib/parse-pcd.js.map +1 -0
  268. package/dist/pcd/lib/pcd-types.cjs +19 -0
  269. package/dist/pcd/lib/pcd-types.cjs.map +7 -0
  270. package/dist/pcd/lib/pcd-types.d.ts +31 -0
  271. package/dist/pcd/lib/pcd-types.d.ts.map +1 -0
  272. package/dist/pcd/lib/pcd-types.js +5 -0
  273. package/dist/pcd/lib/pcd-types.js.map +1 -0
  274. package/dist/pcd/pcd-format.cjs +42 -0
  275. package/dist/pcd/pcd-format.cjs.map +7 -0
  276. package/dist/pcd/pcd-format.d.ts +16 -0
  277. package/dist/pcd/pcd-format.d.ts.map +1 -0
  278. package/dist/pcd/pcd-format.js +19 -0
  279. package/dist/pcd/pcd-format.js.map +1 -0
  280. package/dist/pcd/pcd-loader-types.cjs +63 -0
  281. package/dist/pcd/pcd-loader-types.cjs.map +7 -0
  282. package/dist/pcd/pcd-loader-types.d.ts +82 -0
  283. package/dist/pcd/pcd-loader-types.d.ts.map +1 -0
  284. package/dist/pcd/pcd-loader-types.js +35 -0
  285. package/dist/pcd/pcd-loader-types.js.map +1 -0
  286. package/dist/pcd/pcd-loader.cjs +201 -0
  287. package/dist/pcd/pcd-loader.cjs.map +7 -0
  288. package/dist/pcd/pcd-loader.d.ts +80 -0
  289. package/dist/pcd/pcd-loader.d.ts.map +1 -0
  290. package/dist/pcd/pcd-loader.js +179 -0
  291. package/dist/pcd/pcd-loader.js.map +1 -0
  292. package/dist/pcd/pcd-writer.cjs +134 -0
  293. package/dist/pcd/pcd-writer.cjs.map +7 -0
  294. package/dist/pcd/pcd-writer.d.ts +38 -0
  295. package/dist/pcd/pcd-writer.d.ts.map +1 -0
  296. package/dist/pcd/pcd-writer.js +115 -0
  297. package/dist/pcd/pcd-writer.js.map +1 -0
  298. package/dist/pcd/unbundled.cjs +31 -0
  299. package/dist/pcd/unbundled.cjs.map +7 -0
  300. package/dist/pcd/unbundled.d.ts +3 -0
  301. package/dist/pcd/unbundled.d.ts.map +1 -0
  302. package/dist/pcd/unbundled.js +5 -0
  303. package/dist/pcd/unbundled.js.map +1 -0
  304. package/dist/pcd/workers/pcd-worker.cjs +23 -0
  305. package/dist/pcd/workers/pcd-worker.cjs.map +7 -0
  306. package/dist/pcd/workers/pcd-worker.d.ts +2 -0
  307. package/dist/pcd/workers/pcd-worker.d.ts.map +1 -0
  308. package/dist/pcd/workers/pcd-worker.js +23 -0
  309. package/dist/pcd/workers/pcd-worker.js.map +1 -0
  310. package/dist/pcd-loader-types.cjs +65 -0
  311. package/dist/pcd-loader-types.cjs.map +7 -0
  312. package/dist/pcd-loader-types.d.ts +2 -0
  313. package/dist/pcd-loader-types.d.ts.map +1 -0
  314. package/dist/pcd-loader-types.js +2 -0
  315. package/dist/pcd-loader-types.js.map +1 -0
  316. package/dist/pcd-loader.cjs +203 -0
  317. package/dist/pcd-loader.cjs.map +7 -0
  318. package/dist/pcd-loader.d.ts +2 -0
  319. package/dist/pcd-loader.d.ts.map +1 -0
  320. package/dist/pcd-loader.js +2 -0
  321. package/dist/pcd-loader.js.map +1 -0
  322. package/dist/pcd-worker.js +18561 -0
  323. package/dist/pcd-writer.cjs +136 -0
  324. package/dist/pcd-writer.cjs.map +7 -0
  325. package/dist/pcd-writer.d.ts +2 -0
  326. package/dist/pcd-writer.d.ts.map +1 -0
  327. package/dist/pcd-writer.js +2 -0
  328. package/dist/pcd-writer.js.map +1 -0
  329. package/dist/ply/bundled.cjs +31 -0
  330. package/dist/ply/bundled.cjs.map +7 -0
  331. package/dist/ply/bundled.d.ts +3 -0
  332. package/dist/ply/bundled.d.ts.map +1 -0
  333. package/dist/ply/bundled.js +5 -0
  334. package/dist/ply/bundled.js.map +1 -0
  335. package/dist/ply/index.cjs +37 -0
  336. package/dist/ply/index.cjs.map +7 -0
  337. package/dist/ply/index.d.ts +6 -0
  338. package/dist/ply/index.d.ts.map +1 -0
  339. package/dist/ply/index.js +8 -0
  340. package/dist/ply/index.js.map +1 -0
  341. package/dist/ply/lib/get-ply-schema.cjs +128 -0
  342. package/dist/ply/lib/get-ply-schema.cjs.map +7 -0
  343. package/dist/ply/lib/get-ply-schema.d.ts +16 -0
  344. package/dist/ply/lib/get-ply-schema.d.ts.map +1 -0
  345. package/dist/ply/lib/get-ply-schema.js +117 -0
  346. package/dist/ply/lib/get-ply-schema.js.map +1 -0
  347. package/dist/ply/lib/normalize-ply.cjs +96 -0
  348. package/dist/ply/lib/normalize-ply.cjs.map +7 -0
  349. package/dist/ply/lib/normalize-ply.d.ts +8 -0
  350. package/dist/ply/lib/normalize-ply.d.ts.map +1 -0
  351. package/dist/ply/lib/normalize-ply.js +89 -0
  352. package/dist/ply/lib/normalize-ply.js.map +1 -0
  353. package/dist/ply/lib/parse-ply-arrow.cjs +552 -0
  354. package/dist/ply/lib/parse-ply-arrow.cjs.map +7 -0
  355. package/dist/ply/lib/parse-ply-arrow.d.ts +25 -0
  356. package/dist/ply/lib/parse-ply-arrow.d.ts.map +1 -0
  357. package/dist/ply/lib/parse-ply-arrow.js +493 -0
  358. package/dist/ply/lib/parse-ply-arrow.js.map +1 -0
  359. package/dist/ply/lib/parse-ply-in-batches.cjs +613 -0
  360. package/dist/ply/lib/parse-ply-in-batches.cjs.map +7 -0
  361. package/dist/ply/lib/parse-ply-in-batches.d.ts +9 -0
  362. package/dist/ply/lib/parse-ply-in-batches.d.ts.map +1 -0
  363. package/dist/ply/lib/parse-ply-in-batches.js +630 -0
  364. package/dist/ply/lib/parse-ply-in-batches.js.map +1 -0
  365. package/dist/ply/lib/parse-ply.cjs +758 -0
  366. package/dist/ply/lib/parse-ply.cjs.map +7 -0
  367. package/dist/ply/lib/parse-ply.d.ts +69 -0
  368. package/dist/ply/lib/parse-ply.d.ts.map +1 -0
  369. package/dist/ply/lib/parse-ply.js +855 -0
  370. package/dist/ply/lib/parse-ply.js.map +1 -0
  371. package/dist/ply/lib/ply-types.cjs +19 -0
  372. package/dist/ply/lib/ply-types.cjs.map +7 -0
  373. package/dist/ply/lib/ply-types.d.ts +37 -0
  374. package/dist/ply/lib/ply-types.d.ts.map +1 -0
  375. package/dist/ply/lib/ply-types.js +2 -0
  376. package/dist/ply/lib/ply-types.js.map +1 -0
  377. package/dist/ply/ply-format.cjs +43 -0
  378. package/dist/ply/ply-format.cjs.map +7 -0
  379. package/dist/ply/ply-format.d.ts +18 -0
  380. package/dist/ply/ply-format.d.ts.map +1 -0
  381. package/dist/ply/ply-format.js +22 -0
  382. package/dist/ply/ply-format.js.map +1 -0
  383. package/dist/ply/ply-loader-types.cjs +64 -0
  384. package/dist/ply/ply-loader-types.cjs.map +7 -0
  385. package/dist/ply/ply-loader-types.d.ts +88 -0
  386. package/dist/ply/ply-loader-types.d.ts.map +1 -0
  387. package/dist/ply/ply-loader-types.js +38 -0
  388. package/dist/ply/ply-loader-types.js.map +1 -0
  389. package/dist/ply/ply-loader.cjs +192 -0
  390. package/dist/ply/ply-loader.cjs.map +7 -0
  391. package/dist/ply/ply-loader.d.ts +81 -0
  392. package/dist/ply/ply-loader.d.ts.map +1 -0
  393. package/dist/ply/ply-loader.js +173 -0
  394. package/dist/ply/ply-loader.js.map +1 -0
  395. package/dist/ply/ply-writer.cjs +175 -0
  396. package/dist/ply/ply-writer.cjs.map +7 -0
  397. package/dist/ply/ply-writer.d.ts +38 -0
  398. package/dist/ply/ply-writer.d.ts.map +1 -0
  399. package/dist/ply/ply-writer.js +140 -0
  400. package/dist/ply/ply-writer.js.map +1 -0
  401. package/dist/ply/unbundled.cjs +31 -0
  402. package/dist/ply/unbundled.cjs.map +7 -0
  403. package/dist/ply/unbundled.d.ts +3 -0
  404. package/dist/ply/unbundled.d.ts.map +1 -0
  405. package/dist/ply/unbundled.js +5 -0
  406. package/dist/ply/unbundled.js.map +1 -0
  407. package/dist/ply/workers/ply-worker.cjs +34 -0
  408. package/dist/ply/workers/ply-worker.cjs.map +7 -0
  409. package/dist/ply/workers/ply-worker.d.ts +2 -0
  410. package/dist/ply/workers/ply-worker.d.ts.map +1 -0
  411. package/dist/ply/workers/ply-worker.js +37 -0
  412. package/dist/ply/workers/ply-worker.js.map +1 -0
  413. package/dist/ply-loader-types.cjs +66 -0
  414. package/dist/ply-loader-types.cjs.map +7 -0
  415. package/dist/ply-loader-types.d.ts +2 -0
  416. package/dist/ply-loader-types.d.ts.map +1 -0
  417. package/dist/ply-loader-types.js +2 -0
  418. package/dist/ply-loader-types.js.map +1 -0
  419. package/dist/ply-loader.cjs +194 -0
  420. package/dist/ply-loader.cjs.map +7 -0
  421. package/dist/ply-loader.d.ts +2 -0
  422. package/dist/ply-loader.d.ts.map +1 -0
  423. package/dist/ply-loader.js +2 -0
  424. package/dist/ply-loader.js.map +1 -0
  425. package/dist/ply-worker.js +20962 -0
  426. package/dist/ply-writer.cjs +177 -0
  427. package/dist/ply-writer.cjs.map +7 -0
  428. package/dist/ply-writer.d.ts +2 -0
  429. package/dist/ply-writer.d.ts.map +1 -0
  430. package/dist/ply-writer.js +2 -0
  431. package/dist/ply-writer.js.map +1 -0
  432. package/package.json +238 -4
  433. package/src/index.ts +19 -0
  434. package/src/las/bundled.ts +38 -0
  435. package/src/las/index.ts +66 -0
  436. package/src/las/las-copc-loader-types.ts +18 -0
  437. package/src/las/las-copc-loader.ts +61 -0
  438. package/src/las/las-format.ts +21 -0
  439. package/src/las/las-loader-shared.ts +126 -0
  440. package/src/las/las-loader-types.ts +24 -0
  441. package/src/las/las-loader.ts +163 -0
  442. package/src/las/las-writer.ts +1477 -0
  443. package/src/las/laz-rs-loader-types.ts +21 -0
  444. package/src/las/laz-rs-loader.ts +53 -0
  445. package/src/las/lazperf-loader-types.ts +22 -0
  446. package/src/las/lazperf-loader.ts +65 -0
  447. package/src/las/lib/LASZIP-LICENSE +202 -0
  448. package/src/las/lib/LASZIP-NOTICE +4 -0
  449. package/src/las/lib/copc/parse-las.ts +265 -0
  450. package/src/las/lib/get-las-schema.ts +55 -0
  451. package/src/las/lib/las-compatibility.ts +178 -0
  452. package/src/las/lib/las-extra-bytes.ts +276 -0
  453. package/src/las/lib/las-types.ts +206 -0
  454. package/src/las/lib/las-waveform.ts +292 -0
  455. package/src/las/lib/laz-perf/laslaz-decoder.ts +443 -0
  456. package/src/las/lib/laz-perf/parse-las.ts +411 -0
  457. package/src/las/lib/laz-rs-wasm/laslaz-decoder.ts +488 -0
  458. package/src/las/lib/laz-rs-wasm/parse-las.ts +411 -0
  459. package/src/las/lib/typescript/parse-las.ts +3862 -0
  460. package/src/las/libs/laz-perf/laz-perf.ts +20615 -0
  461. package/src/las/libs/laz-rs-wasm/README.md +5 -0
  462. package/src/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +89 -0
  463. package/src/las/libs/laz-rs-wasm/laz_rs_wasm.js +497 -0
  464. package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
  465. package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
  466. package/src/las/libs/laz-rs-wasm/package.json +25 -0
  467. package/src/las/unbundled.ts +38 -0
  468. package/src/las/workers/las-worker.ts +24 -0
  469. package/src/las-copc-loader-types.ts +1 -0
  470. package/src/las-copc-loader.ts +1 -0
  471. package/src/las-loader-types.ts +1 -0
  472. package/src/las-loader.ts +1 -0
  473. package/src/las-writer.ts +1 -0
  474. package/src/laz-rs-loader-types.ts +1 -0
  475. package/src/laz-rs-loader.ts +1 -0
  476. package/src/lazperf-loader-types.ts +1 -0
  477. package/src/lazperf-loader.ts +1 -0
  478. package/src/pcd/bundled.ts +6 -0
  479. package/src/pcd/index.ts +9 -0
  480. package/src/pcd/lib/decompress-lzf.ts +68 -0
  481. package/src/pcd/lib/get-pcd-schema.ts +66 -0
  482. package/src/pcd/lib/parse-pcd.ts +474 -0
  483. package/src/pcd/lib/pcd-types.ts +34 -0
  484. package/src/pcd/pcd-format.ts +21 -0
  485. package/src/pcd/pcd-loader-types.ts +52 -0
  486. package/src/pcd/pcd-loader.ts +247 -0
  487. package/src/pcd/pcd-writer.ts +156 -0
  488. package/src/pcd/unbundled.ts +6 -0
  489. package/src/pcd/workers/pcd-worker.ts +24 -0
  490. package/src/pcd-loader-types.ts +1 -0
  491. package/src/pcd-loader.ts +1 -0
  492. package/src/pcd-writer.ts +1 -0
  493. package/src/ply/bundled.ts +6 -0
  494. package/src/ply/index.ts +11 -0
  495. package/src/ply/lib/get-ply-schema.ts +133 -0
  496. package/src/ply/lib/normalize-ply.ts +110 -0
  497. package/src/ply/lib/parse-ply-arrow.ts +676 -0
  498. package/src/ply/lib/parse-ply-in-batches.ts +832 -0
  499. package/src/ply/lib/parse-ply.ts +1084 -0
  500. package/src/ply/lib/ply-types.ts +47 -0
  501. package/src/ply/ply-format.ts +24 -0
  502. package/src/ply/ply-loader-types.ts +60 -0
  503. package/src/ply/ply-loader.ts +255 -0
  504. package/src/ply/ply-writer.ts +219 -0
  505. package/src/ply/unbundled.ts +6 -0
  506. package/src/ply/workers/ply-worker.ts +40 -0
  507. package/src/ply-loader-types.ts +1 -0
  508. package/src/ply-loader.ts +1 -0
  509. package/src/ply-writer.ts +1 -0
  510. package/third-party-licenses/plasio-LICENSE +21 -0
  511. package/third-party-licenses/three-LICENSE +21 -0
@@ -0,0 +1,55 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {Schema, MeshAttributes} from '@loaders.gl/core/schema';
6
+ import {deduceMeshSchema} from '@loaders.gl/core/schema-utils';
7
+ import type {LASHeader} from './las-types';
8
+
9
+ /**
10
+ * Gets schema from LAS header
11
+ * @param lasHeader
12
+ * @param metadata
13
+ * @returns Schema
14
+ */
15
+ export function getLASSchema(lasHeader: LASHeader, attributes: MeshAttributes): Schema {
16
+ const metadataMap = makeMetadataFromLasHeader(lasHeader);
17
+ const schema = deduceMeshSchema(attributes, metadataMap);
18
+ return schema;
19
+ }
20
+
21
+ /**
22
+ * Make arrow like schema metadata by LASHeader properties
23
+ * @param lasHeader
24
+ * @returns
25
+ */
26
+ export function makeMetadataFromLasHeader(lasHeader: LASHeader): Record<string, string> {
27
+ const metadata: Record<string, string> = {};
28
+ /* eslint-disable camelcase */
29
+ metadata.las_pointsOffset = lasHeader.pointsOffset.toString(10);
30
+ metadata.las_pointsFormatId = lasHeader.pointsFormatId.toString(10);
31
+ metadata.las_pointsStructSize = lasHeader.pointsStructSize.toString(10);
32
+ metadata.las_pointsCount = lasHeader.pointsCount.toString(10);
33
+ metadata.las_scale = JSON.stringify(lasHeader.scale);
34
+ metadata.las_offset = JSON.stringify(lasHeader.offset);
35
+ if (lasHeader.maxs !== undefined) {
36
+ metadata.las_maxs = JSON.stringify(lasHeader.maxs);
37
+ }
38
+ if (lasHeader.mins !== undefined) {
39
+ metadata.las_mins = JSON.stringify(lasHeader.mins);
40
+ }
41
+ metadata.las_totalToRead = lasHeader.totalToRead.toString(10);
42
+ metadata.las_pointsFortotalReadmatId = lasHeader.totalRead.toString(10);
43
+ if (lasHeader.versionAsString !== undefined) {
44
+ metadata.las_versionAsString = lasHeader.versionAsString;
45
+ }
46
+ if (lasHeader.isCompressed !== undefined) {
47
+ metadata.las_isCompressed = lasHeader.isCompressed.toString();
48
+ }
49
+ if (lasHeader.metadata?.wkt) metadata.las_wkt = lasHeader.metadata.wkt;
50
+ if (lasHeader.metadata?.wktMathTransform)
51
+ metadata.las_wktMathTransform = lasHeader.metadata.wktMathTransform;
52
+ if (lasHeader.metadata?.geotiff)
53
+ metadata.las_geotiff = JSON.stringify(lasHeader.metadata.geotiff);
54
+ return metadata;
55
+ }
@@ -0,0 +1,178 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT AND Apache-2.0
3
+ // Copyright (c) vis.gl contributors
4
+ // Compatibility reconstruction follows LASzip, copyright rapidlasso GmbH.
5
+ // See LASZIP-LICENSE and LASZIP-NOTICE in this directory.
6
+
7
+ import type {LASHeader, LASMetadata} from './las-types';
8
+
9
+ /** Descriptor offsets for LASzip's legacy representation of modern point records. */
10
+ export type LASCompatibilityLayout = {
11
+ /** Logical modern point format, while the source header retains its physical legacy format. */
12
+ pointDataRecordFormat: number;
13
+ /** Logical LAS version stored in the compatibility VLR. */
14
+ version: '1.4' | '1.5';
15
+ /** Packed Extra Bytes offset of the scan angle remainder. */
16
+ scanAngleByteOffset: number;
17
+ /** Packed Extra Bytes offset of the return increments. */
18
+ returnsByteOffset: number;
19
+ /** Packed Extra Bytes offset of the classification increment. */
20
+ classificationByteOffset: number;
21
+ /** Packed Extra Bytes offset of overlap and scanner channel. */
22
+ flagsByteOffset: number;
23
+ /** Packed Extra Bytes offset of optional NIR data. */
24
+ nirByteOffset?: number;
25
+ };
26
+
27
+ /** Selected column targets that can be reconstructed from compatibility Extra Bytes. */
28
+ export type LASCompatibilityTarget = {
29
+ /** Classification codes. */
30
+ classifications: Uint8Array | null;
31
+ /** Return numbers. */
32
+ returnNumbers: Uint8Array | null;
33
+ /** Return counts. */
34
+ numberOfReturns: Uint8Array | null;
35
+ /** Scan angles in modern 0.006-degree units. */
36
+ scanAngles: Int16Array | null;
37
+ /** Overlap flags. */
38
+ overlapFlags: Uint8Array | null;
39
+ /** Scanner channels. */
40
+ scannerChannels: Uint8Array | null;
41
+ /** Optional NIR values. */
42
+ nir: Uint16Array | null;
43
+ };
44
+
45
+ /** Validate the explicit compatibility marker and locate its descriptor-defined fields. */
46
+ export function getLASCompatibilityLayout(
47
+ header: LASHeader,
48
+ metadata: LASMetadata
49
+ ): LASCompatibilityLayout | undefined {
50
+ const record = metadata.vlrs.find(
51
+ variableLengthRecord =>
52
+ variableLengthRecord.userId === 'lascompatible' && variableLengthRecord.recordId === 22204
53
+ );
54
+ if (!record) return undefined;
55
+ if (
56
+ !['1.0', '1.1', '1.2', '1.3'].includes(header.versionAsString || '') ||
57
+ ![1, 3, 4, 5].includes(header.pointsFormatId)
58
+ ) {
59
+ throw new Error('LASLoader: compatibility mode requires a legacy LAS point format');
60
+ }
61
+ const view = new DataView(record.data.buffer, record.data.byteOffset, record.data.byteLength);
62
+ if (view.byteLength < 4) throw new Error('LASLoader: truncated LASzip compatibility VLR');
63
+ const version = view.getUint16(2, true);
64
+ if ((version !== 3 && version !== 4) || view.byteLength !== (version === 3 ? 156 : 174)) {
65
+ throw new Error(`LASLoader: unsupported LASzip compatibility VLR version ${version} or length`);
66
+ }
67
+ const offsets = new Map<string, {byteOffset: number; dataType: number}>();
68
+ let byteOffset = 0;
69
+ for (const descriptor of metadata.extraBytes) {
70
+ const scalarDataType =
71
+ descriptor.dataType > 20
72
+ ? descriptor.dataType - 20
73
+ : descriptor.dataType > 10
74
+ ? descriptor.dataType - 10
75
+ : descriptor.dataType;
76
+ const size = descriptor.dataType > 20 ? 3 : descriptor.dataType > 10 ? 2 : 1;
77
+ const byteLength =
78
+ descriptor.dataType === 0
79
+ ? descriptor.options
80
+ : scalarDataType <= 2
81
+ ? size
82
+ : scalarDataType <= 4
83
+ ? 2 * size
84
+ : scalarDataType <= 6 || scalarDataType === 9
85
+ ? 4 * size
86
+ : 8 * size;
87
+ if (descriptor.dataType > 30 || !byteLength)
88
+ throw new Error('LASLoader: invalid compatibility Extra Bytes layout');
89
+ offsets.set(descriptor.name, {byteOffset, dataType: descriptor.dataType});
90
+ byteOffset += byteLength;
91
+ }
92
+ const baseLength = {1: 28, 3: 34, 4: 57, 5: 63}[header.pointsFormatId]!;
93
+ if (byteOffset !== header.pointsStructSize - baseLength)
94
+ throw new Error('LASLoader: compatibility descriptors do not match point record length');
95
+ const scanAngleByteOffset = getCompatibilityFieldOffset(offsets, 'LAS 1.4 scan angle', 4);
96
+ const returnsByteOffset = getCompatibilityFieldOffset(offsets, 'LAS 1.4 extended returns', 1);
97
+ const classificationByteOffset = getCompatibilityFieldOffset(
98
+ offsets,
99
+ 'LAS 1.4 classification',
100
+ 1
101
+ );
102
+ const flagsByteOffset = getCompatibilityFieldOffset(offsets, 'LAS 1.4 flags and channel', 1);
103
+ const nirByteOffset = offsets.has('LAS 1.4 NIR band')
104
+ ? getCompatibilityFieldOffset(offsets, 'LAS 1.4 NIR band', 3)
105
+ : undefined;
106
+ const pointDataRecordFormat =
107
+ header.pointsFormatId === 1
108
+ ? 6
109
+ : header.pointsFormatId === 3
110
+ ? nirByteOffset === undefined
111
+ ? 7
112
+ : 8
113
+ : header.pointsFormatId === 4
114
+ ? 9
115
+ : 10;
116
+ if (header.pointsFormatId === 5 && nirByteOffset === undefined)
117
+ throw new Error('LASLoader: compatibility waveform color points require NIR');
118
+ return {
119
+ pointDataRecordFormat,
120
+ version: version === 3 ? '1.4' : '1.5',
121
+ scanAngleByteOffset,
122
+ returnsByteOffset,
123
+ classificationByteOffset,
124
+ flagsByteOffset,
125
+ nirByteOffset
126
+ };
127
+ }
128
+
129
+ /** Require the named field to have the scalar representation used by LASzip. */
130
+ function getCompatibilityFieldOffset(
131
+ offsets: Map<string, {byteOffset: number; dataType: number}>,
132
+ name: string,
133
+ dataType: number
134
+ ): number {
135
+ const field = offsets.get(name);
136
+ if (!field || field.dataType !== dataType)
137
+ throw new Error(`LASLoader: missing or invalid compatibility field ${name}`);
138
+ return field.byteOffset;
139
+ }
140
+
141
+ /** Restore selected modern fields from one legacy record without changing raw point bytes. */
142
+ export function populateLASCompatibilityPoint(
143
+ view: DataView,
144
+ extraByteOffset: number,
145
+ pointIndex: number,
146
+ layout: LASCompatibilityLayout,
147
+ target: LASCompatibilityTarget
148
+ ): void {
149
+ if (
150
+ !target.classifications &&
151
+ !target.returnNumbers &&
152
+ !target.numberOfReturns &&
153
+ !target.scanAngles &&
154
+ !target.overlapFlags &&
155
+ !target.scannerChannels &&
156
+ !target.nir
157
+ )
158
+ return;
159
+ const extendedReturns = view.getUint8(extraByteOffset + layout.returnsByteOffset);
160
+ const flags = view.getUint8(extraByteOffset + layout.flagsByteOffset);
161
+ if (target.classifications)
162
+ target.classifications[pointIndex] += view.getUint8(
163
+ extraByteOffset + layout.classificationByteOffset
164
+ );
165
+ if (target.returnNumbers) target.returnNumbers[pointIndex] += extendedReturns >> 4;
166
+ if (target.numberOfReturns) target.numberOfReturns[pointIndex] += extendedReturns & 15;
167
+ if (target.scanAngles) {
168
+ const rank = target.scanAngles[pointIndex];
169
+ const prediction = Math.fround(rank / Math.fround(0.006));
170
+ const quantized = Math.sign(prediction) * Math.floor(Math.abs(prediction) + 0.5);
171
+ target.scanAngles[pointIndex] =
172
+ quantized + view.getInt16(extraByteOffset + layout.scanAngleByteOffset, true);
173
+ }
174
+ if (target.overlapFlags) target.overlapFlags[pointIndex] = flags & 1;
175
+ if (target.scannerChannels) target.scannerChannels[pointIndex] = (flags >> 1) & 3;
176
+ if (target.nir && layout.nirByteOffset !== undefined)
177
+ target.nir[pointIndex] = view.getUint16(extraByteOffset + layout.nirByteOffset, true);
178
+ }
@@ -0,0 +1,276 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {LASExtraBytesDescriptor} from './las-types';
6
+
7
+ /** Typed-array values supported for LAS Extra Bytes Arrow attributes. */
8
+ export type LASTypedExtraBytesValue =
9
+ | Uint8Array
10
+ | Int8Array
11
+ | Uint16Array
12
+ | Int16Array
13
+ | Uint32Array
14
+ | Int32Array
15
+ | Float32Array
16
+ | Float64Array
17
+ | BigInt64Array
18
+ | BigUint64Array;
19
+
20
+ /** Prepared typed LAS Extra Bytes attribute and its source-record layout. */
21
+ export type LASTypedExtraBytesAttribute = {
22
+ /** Stable Arrow attribute name. */
23
+ name: string;
24
+ /** Typed output values. */
25
+ value: LASTypedExtraBytesValue;
26
+ /** Number of components per point. */
27
+ size: number;
28
+ /** LAS scalar data type code. */
29
+ scalarDataType: number;
30
+ /** Byte offset within the packed Extra Bytes record. */
31
+ byteOffset: number;
32
+ /** Total source byte length per point. */
33
+ byteLength: number;
34
+ /** Per-component scales. */
35
+ scales: number[];
36
+ /** Per-component offsets. */
37
+ offsets: number[];
38
+ /** Whether transformed integer values require Float64 output. */
39
+ outputFloat64: boolean;
40
+ };
41
+
42
+ /** Parse the 192-byte descriptors in an LAS Extra Bytes VLR payload. */
43
+ export function parseLASExtraBytes(data: Uint8Array): LASExtraBytesDescriptor[] {
44
+ if (data.byteLength % 192 !== 0) {
45
+ throw new Error(`LAS Extra Bytes VLR length ${data.byteLength} is not a multiple of 192`);
46
+ }
47
+ const descriptors: LASExtraBytesDescriptor[] = [];
48
+ const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);
49
+ for (let descriptorOffset = 0; descriptorOffset < data.byteLength; descriptorOffset += 192) {
50
+ const scales: [number, number, number] = [
51
+ dataView.getFloat64(descriptorOffset + 112, true),
52
+ dataView.getFloat64(descriptorOffset + 120, true),
53
+ dataView.getFloat64(descriptorOffset + 128, true)
54
+ ];
55
+ const offsets: [number, number, number] = [
56
+ dataView.getFloat64(descriptorOffset + 136, true),
57
+ dataView.getFloat64(descriptorOffset + 144, true),
58
+ dataView.getFloat64(descriptorOffset + 152, true)
59
+ ];
60
+ descriptors.push({
61
+ dataType: data[descriptorOffset + 2],
62
+ options: data[descriptorOffset + 3],
63
+ name: readLASString(data, descriptorOffset + 4, 32),
64
+ description: readLASString(data, descriptorOffset + 160, 32),
65
+ scale: scales[0],
66
+ offset: offsets[0],
67
+ scales,
68
+ offsets,
69
+ data: data.slice(descriptorOffset, descriptorOffset + 192)
70
+ });
71
+ }
72
+ return descriptors;
73
+ }
74
+
75
+ /** Allocate typed Arrow attributes described by an LAS Extra Bytes VLR. */
76
+ export function createLASTypedExtraBytesAttributes(
77
+ pointCount: number,
78
+ descriptors: readonly LASExtraBytesDescriptor[],
79
+ extraByteCount: number
80
+ ): LASTypedExtraBytesAttribute[] {
81
+ let byteOffset = 0;
82
+ const usedNames = new Set<string>();
83
+ const attributes: LASTypedExtraBytesAttribute[] = [];
84
+ for (let descriptorIndex = 0; descriptorIndex < descriptors.length; descriptorIndex++) {
85
+ const descriptor = descriptors[descriptorIndex];
86
+ const scalarDataType = getExtraBytesScalarDataType(descriptor.dataType);
87
+ const size = getExtraBytesComponentCount(descriptor.dataType);
88
+ const scalarByteLength = getExtraBytesScalarByteLength(scalarDataType);
89
+ const byteLength = scalarByteLength * size;
90
+ if (descriptor.dataType < 1 || descriptor.dataType > 30 || !byteLength) {
91
+ throw new Error(`Unsupported typed LAS Extra Bytes data type ${descriptor.dataType}`);
92
+ }
93
+ let name = `EXTRA_BYTES_${sanitizeExtraBytesName(descriptor.name)}`;
94
+ if (name === 'EXTRA_BYTES_') {
95
+ name = `EXTRA_BYTES_${descriptorIndex}`;
96
+ }
97
+ const baseName = name;
98
+ let suffix = 1;
99
+ while (usedNames.has(name)) {
100
+ name = `${baseName}_${suffix++}`;
101
+ }
102
+ usedNames.add(name);
103
+ const scales =
104
+ descriptor.options & 0x08 ? descriptor.scales.slice(0, size) : new Array(size).fill(1);
105
+ const offsets =
106
+ descriptor.options & 0x10 ? descriptor.offsets.slice(0, size) : new Array(size).fill(0);
107
+ const isBigInt = scalarDataType === 7 || scalarDataType === 8;
108
+ const outputFloat64 =
109
+ scalarDataType !== 10 &&
110
+ (isBigInt
111
+ ? scales.some(scale => scale !== 1) || offsets.some(offset => offset !== 0)
112
+ : Boolean(descriptor.options & 0x18));
113
+ attributes.push({
114
+ name,
115
+ value: createLASTypedExtraBytesValue(scalarDataType, pointCount * size, outputFloat64),
116
+ size,
117
+ scalarDataType,
118
+ byteOffset,
119
+ byteLength,
120
+ outputFloat64,
121
+ scales,
122
+ offsets
123
+ });
124
+ byteOffset += byteLength;
125
+ }
126
+ if (byteOffset !== extraByteCount) {
127
+ throw new Error(
128
+ `LAS Extra Bytes descriptors use ${byteOffset} bytes; point records provide ${extraByteCount}`
129
+ );
130
+ }
131
+ return attributes;
132
+ }
133
+
134
+ /** Populate typed attributes from packed Extra Bytes records. */
135
+ export function populateLASTypedExtraBytes(
136
+ rawExtraBytes: Uint8Array,
137
+ pointCount: number,
138
+ extraByteCount: number,
139
+ attributes: readonly LASTypedExtraBytesAttribute[]
140
+ ): void {
141
+ if (rawExtraBytes.byteLength < pointCount * extraByteCount) {
142
+ throw new Error('Packed LAS Extra Bytes data is truncated');
143
+ }
144
+ const dataView = new DataView(
145
+ rawExtraBytes.buffer,
146
+ rawExtraBytes.byteOffset,
147
+ rawExtraBytes.byteLength
148
+ );
149
+ for (let pointIndex = 0; pointIndex < pointCount; pointIndex++) {
150
+ const recordOffset = pointIndex * extraByteCount;
151
+ for (const attribute of attributes) {
152
+ const targetOffset = pointIndex * attribute.size;
153
+ const sourceOffset = recordOffset + attribute.byteOffset;
154
+ const scalarByteLength = getExtraBytesScalarByteLength(attribute.scalarDataType);
155
+ for (let componentIndex = 0; componentIndex < attribute.size; componentIndex++) {
156
+ populateLASTypedExtraBytesComponent(
157
+ dataView,
158
+ sourceOffset + componentIndex * scalarByteLength,
159
+ attribute,
160
+ targetOffset + componentIndex,
161
+ componentIndex
162
+ );
163
+ }
164
+ }
165
+ }
166
+ }
167
+
168
+ function readLASString(bytes: Uint8Array, offset: number, length: number): string {
169
+ const decoded = new TextDecoder().decode(bytes.subarray(offset, offset + length));
170
+ let end = decoded.length;
171
+ while (end > 0 && decoded[end - 1] === '\0') {
172
+ end--;
173
+ }
174
+ return decoded.slice(0, end).trim();
175
+ }
176
+
177
+ function sanitizeExtraBytesName(name: string): string {
178
+ return name.trim().replace(/[^A-Za-z0-9_]+/g, '_');
179
+ }
180
+
181
+ function getExtraBytesScalarDataType(dataType: number): number {
182
+ return dataType > 20 ? dataType - 20 : dataType > 10 ? dataType - 10 : dataType;
183
+ }
184
+
185
+ function getExtraBytesComponentCount(dataType: number): number {
186
+ return dataType > 20 ? 3 : dataType > 10 ? 2 : 1;
187
+ }
188
+
189
+ function getExtraBytesScalarByteLength(dataType: number): number {
190
+ if (dataType <= 2) return 1;
191
+ if (dataType <= 4) return 2;
192
+ if (dataType <= 6 || dataType === 9) return 4;
193
+ if (dataType === 7 || dataType === 8 || dataType === 10) return 8;
194
+ return 0;
195
+ }
196
+
197
+ function readExtraBytesValue(
198
+ dataView: DataView,
199
+ offset: number,
200
+ scalarDataType: number
201
+ ): number | bigint {
202
+ switch (scalarDataType) {
203
+ case 1:
204
+ return dataView.getUint8(offset);
205
+ case 2:
206
+ return dataView.getInt8(offset);
207
+ case 3:
208
+ return dataView.getUint16(offset, true);
209
+ case 4:
210
+ return dataView.getInt16(offset, true);
211
+ case 5:
212
+ return dataView.getUint32(offset, true);
213
+ case 6:
214
+ return dataView.getInt32(offset, true);
215
+ case 7:
216
+ return dataView.getBigUint64(offset, true);
217
+ case 8:
218
+ return dataView.getBigInt64(offset, true);
219
+ case 9:
220
+ return dataView.getFloat32(offset, true);
221
+ case 10:
222
+ return dataView.getFloat64(offset, true);
223
+ default:
224
+ throw new Error(`Unsupported typed LAS Extra Bytes scalar data type ${scalarDataType}`);
225
+ }
226
+ }
227
+
228
+ /** Allocate the typed-array representation for one LAS Extra Bytes scalar type. */
229
+ export function createLASTypedExtraBytesValue(
230
+ scalarDataType: number,
231
+ length: number,
232
+ outputFloat64: boolean
233
+ ): LASTypedExtraBytesValue {
234
+ if (outputFloat64 && scalarDataType !== 10) return new Float64Array(length);
235
+ switch (scalarDataType) {
236
+ case 1:
237
+ return new Uint8Array(length);
238
+ case 2:
239
+ return new Int8Array(length);
240
+ case 3:
241
+ return new Uint16Array(length);
242
+ case 4:
243
+ return new Int16Array(length);
244
+ case 5:
245
+ return new Uint32Array(length);
246
+ case 6:
247
+ return new Int32Array(length);
248
+ case 7:
249
+ return new BigUint64Array(length);
250
+ case 8:
251
+ return new BigInt64Array(length);
252
+ case 9:
253
+ return new Float32Array(length);
254
+ case 10:
255
+ return new Float64Array(length);
256
+ default:
257
+ throw new Error(`Unsupported typed LAS Extra Bytes scalar data type ${scalarDataType}`);
258
+ }
259
+ }
260
+
261
+ /** Decode one descriptor component, retaining integer precision unless a transform is requested. */
262
+ export function populateLASTypedExtraBytesComponent(
263
+ dataView: DataView,
264
+ sourceOffset: number,
265
+ attribute: LASTypedExtraBytesAttribute,
266
+ targetOffset: number,
267
+ componentIndex: number
268
+ ): void {
269
+ const value = readExtraBytesValue(dataView, sourceOffset, attribute.scalarDataType);
270
+ if (attribute.value instanceof BigInt64Array || attribute.value instanceof BigUint64Array) {
271
+ attribute.value[targetOffset] = value as bigint;
272
+ } else {
273
+ attribute.value[targetOffset] =
274
+ Number(value) * attribute.scales[componentIndex] + attribute.offsets[componentIndex];
275
+ }
276
+ }