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

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 (405) 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 +7 -2
  6. package/THIRD-PARTY-NOTICES.md +27 -0
  7. package/dist/dist.dev.js +30141 -0
  8. package/dist/dist.min.js +54 -0
  9. package/dist/index.cjs +61 -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 +72 -0
  16. package/dist/las/bundled.cjs.map +7 -0
  17. package/dist/las/bundled.d.ts +12 -0
  18. package/dist/las/bundled.d.ts.map +1 -0
  19. package/dist/las/bundled.js +12 -0
  20. package/dist/las/bundled.js.map +1 -0
  21. package/dist/las/index.cjs +78 -0
  22. package/dist/las/index.cjs.map +7 -0
  23. package/dist/las/index.d.ts +17 -0
  24. package/dist/las/index.d.ts.map +1 -0
  25. package/dist/las/index.js +15 -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 +63 -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 +57 -0
  34. package/dist/las/las-copc-loader.cjs.map +7 -0
  35. package/dist/las/las-copc-loader.d.ts +37 -0
  36. package/dist/las/las-copc-loader.d.ts.map +1 -0
  37. package/dist/las/las-copc-loader.js +40 -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 +82 -0
  46. package/dist/las/las-loader-shared.cjs.map +7 -0
  47. package/dist/las/las-loader-shared.d.ts +66 -0
  48. package/dist/las/las-loader-shared.d.ts.map +1 -0
  49. package/dist/las/las-loader-shared.js +58 -0
  50. package/dist/las/las-loader-shared.js.map +1 -0
  51. package/dist/las/las-loader-types.cjs +54 -0
  52. package/dist/las/las-loader-types.cjs.map +7 -0
  53. package/dist/las/las-loader-types.d.ts +104 -0
  54. package/dist/las/las-loader-types.d.ts.map +1 -0
  55. package/dist/las/las-loader-types.js +19 -0
  56. package/dist/las/las-loader-types.js.map +1 -0
  57. package/dist/las/las-loader.cjs +80 -0
  58. package/dist/las/las-loader.cjs.map +7 -0
  59. package/dist/las/las-loader.d.ts +45 -0
  60. package/dist/las/las-loader.d.ts.map +1 -0
  61. package/dist/las/las-loader.js +58 -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 +69 -0
  66. package/dist/las/las-writer.d.ts.map +1 -0
  67. package/dist/las/las-writer.js +994 -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 +65 -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 +272 -0
  76. package/dist/las/laz-rs-loader.cjs.map +7 -0
  77. package/dist/las/laz-rs-loader.d.ts +37 -0
  78. package/dist/las/laz-rs-loader.d.ts.map +1 -0
  79. package/dist/las/laz-rs-loader.js +38 -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 +67 -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 +60 -0
  88. package/dist/las/lazperf-loader.cjs.map +7 -0
  89. package/dist/las/lazperf-loader.d.ts +39 -0
  90. package/dist/las/lazperf-loader.d.ts.map +1 -0
  91. package/dist/las/lazperf-loader.js +44 -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 +62 -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 +46 -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 +223 -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 +195 -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 +270 -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 +307 -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 +270 -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 +307 -0
  152. package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -0
  153. package/dist/las/lib/typescript/parse-las.cjs +2767 -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 +2607 -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 +71 -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-worker.js +23058 -0
  184. package/dist/pcd/bundled.cjs +33 -0
  185. package/dist/pcd/bundled.cjs.map +7 -0
  186. package/dist/pcd/bundled.d.ts +3 -0
  187. package/dist/pcd/bundled.d.ts.map +1 -0
  188. package/dist/pcd/bundled.js +5 -0
  189. package/dist/pcd/bundled.js.map +1 -0
  190. package/dist/pcd/index.cjs +40 -0
  191. package/dist/pcd/index.cjs.map +7 -0
  192. package/dist/pcd/index.d.ts +8 -0
  193. package/dist/pcd/index.d.ts.map +1 -0
  194. package/dist/pcd/index.js +10 -0
  195. package/dist/pcd/index.js.map +1 -0
  196. package/dist/pcd/lib/decompress-lzf.cjs +80 -0
  197. package/dist/pcd/lib/decompress-lzf.cjs.map +7 -0
  198. package/dist/pcd/lib/decompress-lzf.d.ts +7 -0
  199. package/dist/pcd/lib/decompress-lzf.d.ts.map +1 -0
  200. package/dist/pcd/lib/decompress-lzf.js +62 -0
  201. package/dist/pcd/lib/decompress-lzf.js.map +1 -0
  202. package/dist/pcd/lib/get-pcd-schema.cjs +70 -0
  203. package/dist/pcd/lib/get-pcd-schema.cjs.map +7 -0
  204. package/dist/pcd/lib/get-pcd-schema.d.ts +10 -0
  205. package/dist/pcd/lib/get-pcd-schema.d.ts.map +1 -0
  206. package/dist/pcd/lib/get-pcd-schema.js +53 -0
  207. package/dist/pcd/lib/get-pcd-schema.js.map +1 -0
  208. package/dist/pcd/lib/parse-pcd.cjs +354 -0
  209. package/dist/pcd/lib/parse-pcd.cjs.map +7 -0
  210. package/dist/pcd/lib/parse-pcd.d.ts +20 -0
  211. package/dist/pcd/lib/parse-pcd.d.ts.map +1 -0
  212. package/dist/pcd/lib/parse-pcd.js +341 -0
  213. package/dist/pcd/lib/parse-pcd.js.map +1 -0
  214. package/dist/pcd/lib/pcd-types.cjs +19 -0
  215. package/dist/pcd/lib/pcd-types.cjs.map +7 -0
  216. package/dist/pcd/lib/pcd-types.d.ts +31 -0
  217. package/dist/pcd/lib/pcd-types.d.ts.map +1 -0
  218. package/dist/pcd/lib/pcd-types.js +5 -0
  219. package/dist/pcd/lib/pcd-types.js.map +1 -0
  220. package/dist/pcd/pcd-format.cjs +42 -0
  221. package/dist/pcd/pcd-format.cjs.map +7 -0
  222. package/dist/pcd/pcd-format.d.ts +16 -0
  223. package/dist/pcd/pcd-format.d.ts.map +1 -0
  224. package/dist/pcd/pcd-format.js +19 -0
  225. package/dist/pcd/pcd-format.js.map +1 -0
  226. package/dist/pcd/pcd-loader-types.cjs +64 -0
  227. package/dist/pcd/pcd-loader-types.cjs.map +7 -0
  228. package/dist/pcd/pcd-loader-types.d.ts +105 -0
  229. package/dist/pcd/pcd-loader-types.d.ts.map +1 -0
  230. package/dist/pcd/pcd-loader-types.js +35 -0
  231. package/dist/pcd/pcd-loader-types.js.map +1 -0
  232. package/dist/pcd/pcd-loader.cjs +144 -0
  233. package/dist/pcd/pcd-loader.cjs.map +7 -0
  234. package/dist/pcd/pcd-loader.d.ts +44 -0
  235. package/dist/pcd/pcd-loader.d.ts.map +1 -0
  236. package/dist/pcd/pcd-loader.js +128 -0
  237. package/dist/pcd/pcd-loader.js.map +1 -0
  238. package/dist/pcd/pcd-writer.cjs +134 -0
  239. package/dist/pcd/pcd-writer.cjs.map +7 -0
  240. package/dist/pcd/pcd-writer.d.ts +37 -0
  241. package/dist/pcd/pcd-writer.d.ts.map +1 -0
  242. package/dist/pcd/pcd-writer.js +115 -0
  243. package/dist/pcd/pcd-writer.js.map +1 -0
  244. package/dist/pcd/unbundled.cjs +33 -0
  245. package/dist/pcd/unbundled.cjs.map +7 -0
  246. package/dist/pcd/unbundled.d.ts +3 -0
  247. package/dist/pcd/unbundled.d.ts.map +1 -0
  248. package/dist/pcd/unbundled.js +5 -0
  249. package/dist/pcd/unbundled.js.map +1 -0
  250. package/dist/pcd/workers/pcd-worker.cjs +23 -0
  251. package/dist/pcd/workers/pcd-worker.cjs.map +7 -0
  252. package/dist/pcd/workers/pcd-worker.d.ts +2 -0
  253. package/dist/pcd/workers/pcd-worker.d.ts.map +1 -0
  254. package/dist/pcd/workers/pcd-worker.js +23 -0
  255. package/dist/pcd/workers/pcd-worker.js.map +1 -0
  256. package/dist/pcd-worker.js +17522 -0
  257. package/dist/ply/bundled.cjs +33 -0
  258. package/dist/ply/bundled.cjs.map +7 -0
  259. package/dist/ply/bundled.d.ts +3 -0
  260. package/dist/ply/bundled.d.ts.map +1 -0
  261. package/dist/ply/bundled.js +5 -0
  262. package/dist/ply/bundled.js.map +1 -0
  263. package/dist/ply/index.cjs +40 -0
  264. package/dist/ply/index.cjs.map +7 -0
  265. package/dist/ply/index.d.ts +8 -0
  266. package/dist/ply/index.d.ts.map +1 -0
  267. package/dist/ply/index.js +11 -0
  268. package/dist/ply/index.js.map +1 -0
  269. package/dist/ply/lib/get-ply-schema.cjs +126 -0
  270. package/dist/ply/lib/get-ply-schema.cjs.map +7 -0
  271. package/dist/ply/lib/get-ply-schema.d.ts +10 -0
  272. package/dist/ply/lib/get-ply-schema.d.ts.map +1 -0
  273. package/dist/ply/lib/get-ply-schema.js +117 -0
  274. package/dist/ply/lib/get-ply-schema.js.map +1 -0
  275. package/dist/ply/lib/normalize-ply.cjs +96 -0
  276. package/dist/ply/lib/normalize-ply.cjs.map +7 -0
  277. package/dist/ply/lib/normalize-ply.d.ts +8 -0
  278. package/dist/ply/lib/normalize-ply.d.ts.map +1 -0
  279. package/dist/ply/lib/normalize-ply.js +89 -0
  280. package/dist/ply/lib/normalize-ply.js.map +1 -0
  281. package/dist/ply/lib/parse-ply-arrow.cjs +552 -0
  282. package/dist/ply/lib/parse-ply-arrow.cjs.map +7 -0
  283. package/dist/ply/lib/parse-ply-arrow.d.ts +25 -0
  284. package/dist/ply/lib/parse-ply-arrow.d.ts.map +1 -0
  285. package/dist/ply/lib/parse-ply-arrow.js +493 -0
  286. package/dist/ply/lib/parse-ply-arrow.js.map +1 -0
  287. package/dist/ply/lib/parse-ply-in-batches.cjs +607 -0
  288. package/dist/ply/lib/parse-ply-in-batches.cjs.map +7 -0
  289. package/dist/ply/lib/parse-ply-in-batches.d.ts +9 -0
  290. package/dist/ply/lib/parse-ply-in-batches.d.ts.map +1 -0
  291. package/dist/ply/lib/parse-ply-in-batches.js +625 -0
  292. package/dist/ply/lib/parse-ply-in-batches.js.map +1 -0
  293. package/dist/ply/lib/parse-ply.cjs +755 -0
  294. package/dist/ply/lib/parse-ply.cjs.map +7 -0
  295. package/dist/ply/lib/parse-ply.d.ts +69 -0
  296. package/dist/ply/lib/parse-ply.d.ts.map +1 -0
  297. package/dist/ply/lib/parse-ply.js +851 -0
  298. package/dist/ply/lib/parse-ply.js.map +1 -0
  299. package/dist/ply/lib/ply-types.cjs +19 -0
  300. package/dist/ply/lib/ply-types.cjs.map +7 -0
  301. package/dist/ply/lib/ply-types.d.ts +37 -0
  302. package/dist/ply/lib/ply-types.d.ts.map +1 -0
  303. package/dist/ply/lib/ply-types.js +2 -0
  304. package/dist/ply/lib/ply-types.js.map +1 -0
  305. package/dist/ply/ply-format.cjs +43 -0
  306. package/dist/ply/ply-format.cjs.map +7 -0
  307. package/dist/ply/ply-format.d.ts +18 -0
  308. package/dist/ply/ply-format.d.ts.map +1 -0
  309. package/dist/ply/ply-format.js +22 -0
  310. package/dist/ply/ply-format.js.map +1 -0
  311. package/dist/ply/ply-loader-types.cjs +65 -0
  312. package/dist/ply/ply-loader-types.cjs.map +7 -0
  313. package/dist/ply/ply-loader-types.d.ts +111 -0
  314. package/dist/ply/ply-loader-types.d.ts.map +1 -0
  315. package/dist/ply/ply-loader-types.js +38 -0
  316. package/dist/ply/ply-loader-types.js.map +1 -0
  317. package/dist/ply/ply-loader.cjs +134 -0
  318. package/dist/ply/ply-loader.cjs.map +7 -0
  319. package/dist/ply/ply-loader.d.ts +44 -0
  320. package/dist/ply/ply-loader.d.ts.map +1 -0
  321. package/dist/ply/ply-loader.js +121 -0
  322. package/dist/ply/ply-loader.js.map +1 -0
  323. package/dist/ply/ply-writer.cjs +175 -0
  324. package/dist/ply/ply-writer.cjs.map +7 -0
  325. package/dist/ply/ply-writer.d.ts +37 -0
  326. package/dist/ply/ply-writer.d.ts.map +1 -0
  327. package/dist/ply/ply-writer.js +140 -0
  328. package/dist/ply/ply-writer.js.map +1 -0
  329. package/dist/ply/unbundled.cjs +33 -0
  330. package/dist/ply/unbundled.cjs.map +7 -0
  331. package/dist/ply/unbundled.d.ts +3 -0
  332. package/dist/ply/unbundled.d.ts.map +1 -0
  333. package/dist/ply/unbundled.js +5 -0
  334. package/dist/ply/unbundled.js.map +1 -0
  335. package/dist/ply/workers/ply-worker.cjs +34 -0
  336. package/dist/ply/workers/ply-worker.cjs.map +7 -0
  337. package/dist/ply/workers/ply-worker.d.ts +2 -0
  338. package/dist/ply/workers/ply-worker.d.ts.map +1 -0
  339. package/dist/ply/workers/ply-worker.js +37 -0
  340. package/dist/ply/workers/ply-worker.js.map +1 -0
  341. package/dist/ply-worker.js +19175 -0
  342. package/package.json +234 -4
  343. package/src/index.ts +19 -0
  344. package/src/las/bundled.ts +39 -0
  345. package/src/las/index.ts +70 -0
  346. package/src/las/las-copc-loader-types.ts +18 -0
  347. package/src/las/las-copc-loader.ts +61 -0
  348. package/src/las/las-format.ts +21 -0
  349. package/src/las/las-loader-shared.ts +124 -0
  350. package/src/las/las-loader-types.ts +27 -0
  351. package/src/las/las-loader.ts +109 -0
  352. package/src/las/las-writer.ts +1473 -0
  353. package/src/las/laz-rs-loader-types.ts +21 -0
  354. package/src/las/laz-rs-loader.ts +53 -0
  355. package/src/las/lazperf-loader-types.ts +22 -0
  356. package/src/las/lazperf-loader.ts +65 -0
  357. package/src/las/lib/LASZIP-LICENSE +202 -0
  358. package/src/las/lib/LASZIP-NOTICE +4 -0
  359. package/src/las/lib/copc/parse-las.ts +265 -0
  360. package/src/las/lib/get-las-schema.ts +50 -0
  361. package/src/las/lib/las-compatibility.ts +178 -0
  362. package/src/las/lib/las-extra-bytes.ts +274 -0
  363. package/src/las/lib/las-types.ts +206 -0
  364. package/src/las/lib/las-waveform.ts +292 -0
  365. package/src/las/lib/laz-perf/laslaz-decoder.ts +443 -0
  366. package/src/las/lib/laz-perf/parse-las.ts +412 -0
  367. package/src/las/lib/laz-rs-wasm/laslaz-decoder.ts +488 -0
  368. package/src/las/lib/laz-rs-wasm/parse-las.ts +412 -0
  369. package/src/las/lib/typescript/parse-las.ts +3730 -0
  370. package/src/las/libs/laz-perf/laz-perf.ts +20615 -0
  371. package/src/las/libs/laz-rs-wasm/laz_rs_wasm.d.ts +89 -0
  372. package/src/las/libs/laz-rs-wasm/laz_rs_wasm.js +497 -0
  373. package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm +0 -0
  374. package/src/las/libs/laz-rs-wasm/laz_rs_wasm_bg.wasm.d.ts +38 -0
  375. package/src/las/libs/laz-rs-wasm/package.json +19 -0
  376. package/src/las/unbundled.ts +38 -0
  377. package/src/las/workers/las-worker.ts +24 -0
  378. package/src/pcd/bundled.ts +9 -0
  379. package/src/pcd/index.ts +13 -0
  380. package/src/pcd/lib/decompress-lzf.ts +68 -0
  381. package/src/pcd/lib/get-pcd-schema.ts +66 -0
  382. package/src/pcd/lib/parse-pcd.ts +474 -0
  383. package/src/pcd/lib/pcd-types.ts +34 -0
  384. package/src/pcd/pcd-format.ts +21 -0
  385. package/src/pcd/pcd-loader-types.ts +53 -0
  386. package/src/pcd/pcd-loader.ts +179 -0
  387. package/src/pcd/pcd-writer.ts +152 -0
  388. package/src/pcd/unbundled.ts +6 -0
  389. package/src/pcd/workers/pcd-worker.ts +24 -0
  390. package/src/ply/bundled.ts +9 -0
  391. package/src/ply/index.ts +15 -0
  392. package/src/ply/lib/get-ply-schema.ts +133 -0
  393. package/src/ply/lib/normalize-ply.ts +110 -0
  394. package/src/ply/lib/parse-ply-arrow.ts +676 -0
  395. package/src/ply/lib/parse-ply-in-batches.ts +827 -0
  396. package/src/ply/lib/parse-ply.ts +1081 -0
  397. package/src/ply/lib/ply-types.ts +47 -0
  398. package/src/ply/ply-format.ts +24 -0
  399. package/src/ply/ply-loader-types.ts +61 -0
  400. package/src/ply/ply-loader.ts +185 -0
  401. package/src/ply/ply-writer.ts +215 -0
  402. package/src/ply/unbundled.ts +6 -0
  403. package/src/ply/workers/ply-worker.ts +40 -0
  404. package/third-party-licenses/plasio-LICENSE +21 -0
  405. package/third-party-licenses/three-LICENSE +21 -0
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/las/lib/laz-perf/parse-las.ts
21
+ var parse_las_exports = {};
22
+ __export(parse_las_exports, {
23
+ parseLAS: () => parseLAS,
24
+ parseLASChunked: () => parseLASChunked,
25
+ parseLASInBatches: () => parseLASInBatches
26
+ });
27
+ module.exports = __toCommonJS(parse_las_exports);
28
+ var import_schema_utils = require("@loaders.gl/core/schema-utils");
29
+ var import_loader_utils = require("@loaders.gl/core/loader-utils");
30
+ var import_get_las_schema = require("../get-las-schema.cjs");
31
+ var import_laslaz_decoder = require("./laslaz-decoder.cjs");
32
+ var DEFAULT_BATCH_SIZE = 1e3 * 100;
33
+ function parseLAS(arrayBuffer, options) {
34
+ return parseLASMesh(arrayBuffer, options);
35
+ }
36
+ async function* parseLASInBatches(arrayBufferIterator, options = {}) {
37
+ const arrayBuffer = await (0, import_loader_utils.concatenateArrayBuffersAsync)(arrayBufferIterator);
38
+ const batchSize = getBatchSize(options);
39
+ for (const { decoder, header } of parseLASChunkedIterator(arrayBuffer, batchSize)) {
40
+ yield parseLASMeshBatch(decoder, header, options);
41
+ }
42
+ }
43
+ function parseLASMesh(arrayBuffer, options = {}) {
44
+ let pointIndex = 0;
45
+ let positions;
46
+ let colors;
47
+ let intensities;
48
+ let classifications;
49
+ let originalHeader;
50
+ const lasMesh = {
51
+ loader: "las",
52
+ loaderData: {},
53
+ // shape: 'mesh',
54
+ schema: { fields: [], metadata: {} },
55
+ header: {
56
+ vertexCount: 0,
57
+ boundingBox: [
58
+ [0, 0, 0],
59
+ [0, 0, 0]
60
+ ]
61
+ },
62
+ attributes: {},
63
+ topology: "point-list",
64
+ mode: 0
65
+ // GL.POINTS
66
+ };
67
+ parseLASChunked(arrayBuffer, (decoder = {}, lasHeader) => {
68
+ if (!originalHeader) {
69
+ originalHeader = lasHeader;
70
+ const total = lasHeader.totalToRead;
71
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
72
+ positions = new PositionsType(total * 3);
73
+ colors = lasHeader.hasColor ? new Uint8Array(total * 4) : null;
74
+ intensities = new Uint16Array(total);
75
+ classifications = new Uint8Array(total);
76
+ lasMesh.loaderData = lasHeader;
77
+ lasMesh.attributes = {
78
+ POSITION: { value: positions, size: 3 },
79
+ // non-gltf attributes, use non-capitalized names for now
80
+ intensity: { value: intensities, size: 1 },
81
+ classification: { value: classifications, size: 1 }
82
+ };
83
+ if (colors) {
84
+ lasMesh.attributes.COLOR_0 = { value: colors, size: 4 };
85
+ }
86
+ }
87
+ const batchSize = decoder.pointsCount;
88
+ const {
89
+ scale: [scaleX, scaleY, scaleZ],
90
+ offset: [offsetX, offsetY, offsetZ]
91
+ } = lasHeader;
92
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
93
+ for (let i = 0; i < batchSize; i++) {
94
+ const { position, color, intensity, classification } = decoder.getPoint(i);
95
+ positions[pointIndex * 3] = position[0] * scaleX + offsetX;
96
+ positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
97
+ positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
98
+ if (color && colors) {
99
+ if (twoByteColor) {
100
+ colors[pointIndex * 4] = color[0] / 256;
101
+ colors[pointIndex * 4 + 1] = color[1] / 256;
102
+ colors[pointIndex * 4 + 2] = color[2] / 256;
103
+ } else {
104
+ colors[pointIndex * 4] = color[0];
105
+ colors[pointIndex * 4 + 1] = color[1];
106
+ colors[pointIndex * 4 + 2] = color[2];
107
+ }
108
+ colors[pointIndex * 4 + 3] = 255;
109
+ }
110
+ intensities[pointIndex] = intensity;
111
+ classifications[pointIndex] = classification;
112
+ pointIndex++;
113
+ }
114
+ const meshBatch = {
115
+ ...lasMesh,
116
+ header: {
117
+ vertexCount: lasHeader.totalRead
118
+ },
119
+ progress: lasHeader.totalRead / lasHeader.totalToRead
120
+ };
121
+ options?.onProgress?.({
122
+ ...meshBatch,
123
+ phase: "decode",
124
+ completed: lasHeader.totalRead,
125
+ total: lasHeader.totalToRead,
126
+ unit: "points"
127
+ });
128
+ });
129
+ lasMesh.header = {
130
+ vertexCount: originalHeader.totalToRead,
131
+ boundingBox: (0, import_schema_utils.getMeshBoundingBox)(lasMesh?.attributes || {}) ?? void 0
132
+ };
133
+ if (lasMesh) {
134
+ lasMesh.schema = (0, import_get_las_schema.getLASSchema)(lasMesh.loaderData, lasMesh.attributes);
135
+ }
136
+ return lasMesh;
137
+ }
138
+ function parseLASMeshBatch(decoder, lasHeader, options = {}) {
139
+ const batchSize = decoder.pointsCount;
140
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
141
+ const positions = new PositionsType(batchSize * 3);
142
+ const colors = lasHeader.hasColor ? new Uint8Array(batchSize * 4) : null;
143
+ const intensities = new Uint16Array(batchSize);
144
+ const classifications = new Uint8Array(batchSize);
145
+ populateLASAttributes(decoder, lasHeader, options, {
146
+ positions,
147
+ colors,
148
+ intensities,
149
+ classifications,
150
+ pointOffset: 0
151
+ });
152
+ const attributes = {
153
+ POSITION: { value: positions, size: 3 },
154
+ intensity: { value: intensities, size: 1 },
155
+ classification: { value: classifications, size: 1 }
156
+ };
157
+ if (colors) {
158
+ attributes.COLOR_0 = { value: colors, size: 4 };
159
+ }
160
+ const batchHeader = { ...lasHeader };
161
+ const lasMesh = {
162
+ loader: "las",
163
+ loaderData: batchHeader,
164
+ schema: { fields: [], metadata: {} },
165
+ header: {
166
+ vertexCount: batchSize,
167
+ boundingBox: (0, import_schema_utils.getMeshBoundingBox)(attributes)
168
+ },
169
+ attributes,
170
+ topology: "point-list",
171
+ mode: 0,
172
+ progress: lasHeader.totalRead / lasHeader.totalToRead
173
+ };
174
+ lasMesh.schema = (0, import_get_las_schema.getLASSchema)(batchHeader, lasMesh.attributes);
175
+ return lasMesh;
176
+ }
177
+ function populateLASAttributes(decoder, lasHeader, options, target) {
178
+ const batchSize = decoder.pointsCount;
179
+ const {
180
+ scale: [scaleX, scaleY, scaleZ],
181
+ offset: [offsetX, offsetY, offsetZ]
182
+ } = lasHeader;
183
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
184
+ for (let i = 0; i < batchSize; i++) {
185
+ const { position, color, intensity, classification } = decoder.getPoint(i);
186
+ const pointIndex = target.pointOffset + i;
187
+ target.positions[pointIndex * 3] = position[0] * scaleX + offsetX;
188
+ target.positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
189
+ target.positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
190
+ if (color && target.colors) {
191
+ if (twoByteColor) {
192
+ target.colors[pointIndex * 4] = color[0] / 256;
193
+ target.colors[pointIndex * 4 + 1] = color[1] / 256;
194
+ target.colors[pointIndex * 4 + 2] = color[2] / 256;
195
+ } else {
196
+ target.colors[pointIndex * 4] = color[0];
197
+ target.colors[pointIndex * 4 + 1] = color[1];
198
+ target.colors[pointIndex * 4 + 2] = color[2];
199
+ }
200
+ target.colors[pointIndex * 4 + 3] = 255;
201
+ }
202
+ target.intensities[pointIndex] = intensity;
203
+ target.classifications[pointIndex] = classification;
204
+ }
205
+ }
206
+ function parseLASChunked(rawData, onParseData = {}, batchSize = DEFAULT_BATCH_SIZE) {
207
+ for (const { decoder, header } of parseLASChunkedIterator(rawData, batchSize)) {
208
+ onParseData(decoder, header);
209
+ }
210
+ }
211
+ function* parseLASChunkedIterator(rawData, batchSize = DEFAULT_BATCH_SIZE) {
212
+ const dataHandler = new import_laslaz_decoder.LASFile(rawData);
213
+ try {
214
+ dataHandler.open();
215
+ const header = dataHandler.getHeader();
216
+ const Unpacker = dataHandler.getUnpacker();
217
+ header.totalToRead = header.pointsCount;
218
+ let totalRead = 0;
219
+ while (true) {
220
+ const chunk = dataHandler.readData(batchSize);
221
+ totalRead += chunk.count;
222
+ header.totalRead = totalRead;
223
+ const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
224
+ yield { decoder: unpacker, header };
225
+ if (!chunk.hasMoreData || totalRead >= header.totalToRead) {
226
+ break;
227
+ }
228
+ }
229
+ } catch (e) {
230
+ throw e;
231
+ } finally {
232
+ dataHandler.close();
233
+ }
234
+ }
235
+ function getBatchSize(options) {
236
+ const batchSize = options.batchSize ?? options.core?.batchSize;
237
+ return typeof batchSize === "number" ? batchSize : DEFAULT_BATCH_SIZE;
238
+ }
239
+ function detectTwoByteColors(decoder = {}, batchSize, colorDepth) {
240
+ let twoByteColor = false;
241
+ switch (colorDepth) {
242
+ case 8:
243
+ twoByteColor = false;
244
+ break;
245
+ case 16:
246
+ twoByteColor = true;
247
+ break;
248
+ case "auto":
249
+ if (decoder.getPoint(0).color) {
250
+ for (let i = 0; i < batchSize; i++) {
251
+ const { color } = decoder.getPoint(i);
252
+ if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
253
+ twoByteColor = true;
254
+ }
255
+ }
256
+ }
257
+ break;
258
+ default:
259
+ console.warn("las: illegal value for options.las.colorDepth");
260
+ break;
261
+ }
262
+ return twoByteColor;
263
+ }
264
+ // Annotate the CommonJS export names for ESM import in node:
265
+ 0 && (module.exports = {
266
+ parseLAS,
267
+ parseLASChunked,
268
+ parseLASInBatches
269
+ });
270
+ //# sourceMappingURL=parse-las.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/las/lib/laz-perf/parse-las.ts"],
4
+ "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// ported and es6-ified from https://github.com/verma/plasio/\n// import type {ArrowTable, ColumnarTable} from '@loaders.gl/core/schema';\nimport type {LASLoaderOptions} from '../../las-loader-types';\nimport type {LASMesh, LASHeader} from '../las-types';\nimport type {MeshAttributes} from '@loaders.gl/core/schema';\nimport {getMeshBoundingBox /* , convertMeshToTable */} from '@loaders.gl/core/schema-utils';\nimport {concatenateArrayBuffersAsync} from '@loaders.gl/core/loader-utils';\nimport {getLASSchema} from '../get-las-schema';\nimport {LASFile} from './laslaz-decoder';\n\ntype LASChunk = {\n count: number;\n buffer: ArrayBuffer;\n hasMoreData: boolean;\n};\n\ntype LASDecoder = {\n pointsCount: number;\n getPoint(index: number): {\n position: [number, number, number];\n color?: [number, number, number];\n intensity: number;\n classification: number;\n };\n};\n\ntype LASDecodedChunk = {\n decoder: LASDecoder;\n header: LASHeader;\n};\n\nconst DEFAULT_BATCH_SIZE = 1000 * 100;\n\n/**\n * Parsing of .las file\n * @param arrayBuffer\n * @param options\n * @returns LASMesh\n */\nexport function parseLAS(arrayBuffer: ArrayBuffer, options?: LASLoaderOptions): LASMesh {\n return parseLASMesh(arrayBuffer, options);\n // This code breaks pointcloud example on the website\n // const mesh = parseLASMesh(arrayBuffer, options);\n // return convertMeshToTable(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;\n}\n\n/**\n * Parse LAS/LAZ data in decoded point batches.\n * @param arrayBufferIterator Iterator yielding LAS/LAZ binary chunks\n * @param options LAS loader options\n * @returns Async iterable of mesh batches\n */\nexport async function* parseLASInBatches(\n arrayBufferIterator:\n | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n | Iterable<ArrayBufferLike | ArrayBufferView>,\n options: LASLoaderOptions = {}\n): AsyncIterable<LASMesh> {\n const arrayBuffer = await concatenateArrayBuffersAsync(arrayBufferIterator);\n const batchSize = getBatchSize(options);\n\n for (const {decoder, header} of parseLASChunkedIterator(arrayBuffer, batchSize)) {\n yield parseLASMeshBatch(decoder, header, options);\n }\n}\n\n/**\n * Parsing of .las file\n * @param arrayBuffer\n * @param options\n * @returns LASHeader\n */\nfunction parseLASMesh(arrayBuffer: ArrayBuffer, options: LASLoaderOptions = {}): LASMesh {\n let pointIndex: number = 0;\n\n let positions: Float32Array | Float64Array;\n let colors: Uint8Array | null;\n let intensities: Uint16Array;\n let classifications: Uint8Array;\n let originalHeader: any;\n\n const lasMesh: LASMesh = {\n loader: 'las',\n loaderData: {} as LASHeader,\n // shape: 'mesh',\n schema: {fields: [], metadata: {}},\n header: {\n vertexCount: 0,\n boundingBox: [\n [0, 0, 0],\n [0, 0, 0]\n ]\n },\n attributes: {},\n topology: 'point-list',\n mode: 0 // GL.POINTS\n };\n\n /* eslint-disable max-statements */\n // @ts-ignore Possibly undefined\n parseLASChunked(arrayBuffer, (decoder: any = {}, lasHeader: LASHeader) => {\n if (!originalHeader) {\n originalHeader = lasHeader;\n const total = lasHeader.totalToRead;\n\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n positions = new PositionsType(total * 3);\n // laslaz-decoder.js `pointFormatReaders`\n colors = lasHeader.hasColor ? new Uint8Array(total * 4) : null;\n intensities = new Uint16Array(total);\n classifications = new Uint8Array(total);\n\n lasMesh.loaderData = lasHeader;\n lasMesh.attributes = {\n POSITION: {value: positions, size: 3},\n // non-gltf attributes, use non-capitalized names for now\n intensity: {value: intensities, size: 1},\n classification: {value: classifications, size: 1}\n };\n\n if (colors) {\n lasMesh.attributes.COLOR_0 = {value: colors, size: 4};\n }\n }\n\n const batchSize = decoder.pointsCount;\n const {\n scale: [scaleX, scaleY, scaleZ],\n offset: [offsetX, offsetY, offsetZ]\n } = lasHeader;\n\n const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);\n\n for (let i = 0; i < batchSize; i++) {\n const {position, color, intensity, classification} = decoder.getPoint(i);\n\n positions[pointIndex * 3] = position[0] * scaleX + offsetX;\n positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;\n positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;\n\n if (color && colors) {\n if (twoByteColor) {\n colors[pointIndex * 4] = color[0] / 256;\n colors[pointIndex * 4 + 1] = color[1] / 256;\n colors[pointIndex * 4 + 2] = color[2] / 256;\n } else {\n colors[pointIndex * 4] = color[0];\n colors[pointIndex * 4 + 1] = color[1];\n colors[pointIndex * 4 + 2] = color[2];\n }\n colors[pointIndex * 4 + 3] = 255;\n }\n\n intensities[pointIndex] = intensity;\n classifications[pointIndex] = classification;\n\n pointIndex++;\n }\n\n const meshBatch = {\n ...lasMesh,\n header: {\n vertexCount: lasHeader.totalRead\n },\n progress: lasHeader.totalRead / lasHeader.totalToRead\n };\n\n options?.onProgress?.({\n ...meshBatch,\n phase: 'decode',\n completed: lasHeader.totalRead,\n total: lasHeader.totalToRead,\n unit: 'points'\n });\n });\n /* eslint-enable max-statements */\n\n lasMesh.header = {\n vertexCount: originalHeader.totalToRead,\n boundingBox: getMeshBoundingBox(lasMesh?.attributes || {}) ?? undefined\n };\n\n if (lasMesh) {\n lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);\n }\n return lasMesh;\n}\n\n/**\n * Convert one decoded LAS/LAZ chunk into a mesh.\n * @param decoder Point decoder for the current chunk\n * @param lasHeader LAS file header with current progress\n * @param options LAS loader options\n * @returns Mesh containing one decoded point batch\n */\nfunction parseLASMeshBatch(\n decoder: LASDecoder,\n lasHeader: LASHeader,\n options: LASLoaderOptions = {}\n): LASMesh {\n const batchSize = decoder.pointsCount;\n const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;\n const positions = new PositionsType(batchSize * 3);\n const colors = lasHeader.hasColor ? new Uint8Array(batchSize * 4) : null;\n const intensities = new Uint16Array(batchSize);\n const classifications = new Uint8Array(batchSize);\n\n populateLASAttributes(decoder, lasHeader, options, {\n positions,\n colors,\n intensities,\n classifications,\n pointOffset: 0\n });\n\n const attributes: MeshAttributes = {\n POSITION: {value: positions, size: 3},\n intensity: {value: intensities, size: 1},\n classification: {value: classifications, size: 1}\n };\n\n if (colors) {\n attributes.COLOR_0 = {value: colors, size: 4};\n }\n\n const batchHeader = {...lasHeader};\n const lasMesh: LASMesh = {\n loader: 'las',\n loaderData: batchHeader,\n schema: {fields: [], metadata: {}},\n header: {\n vertexCount: batchSize,\n boundingBox: getMeshBoundingBox(attributes)\n },\n attributes,\n topology: 'point-list',\n mode: 0,\n progress: lasHeader.totalRead / lasHeader.totalToRead\n } as LASMesh & {progress: number};\n\n lasMesh.schema = getLASSchema(batchHeader, lasMesh.attributes);\n return lasMesh;\n}\n\n/**\n * Fill typed LAS attribute arrays from a decoded chunk.\n * @param decoder Point decoder for the current chunk\n * @param lasHeader LAS file header\n * @param options LAS loader options\n * @param target Target attribute arrays and write offset\n */\nfunction populateLASAttributes(\n decoder: LASDecoder,\n lasHeader: LASHeader,\n options: LASLoaderOptions,\n target: {\n positions: Float32Array | Float64Array;\n colors: Uint8Array | null;\n intensities: Uint16Array;\n classifications: Uint8Array;\n pointOffset: number;\n }\n): void {\n const batchSize = decoder.pointsCount;\n const {\n scale: [scaleX, scaleY, scaleZ],\n offset: [offsetX, offsetY, offsetZ]\n } = lasHeader;\n const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);\n\n for (let i = 0; i < batchSize; i++) {\n const {position, color, intensity, classification} = decoder.getPoint(i);\n const pointIndex = target.pointOffset + i;\n\n target.positions[pointIndex * 3] = position[0] * scaleX + offsetX;\n target.positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;\n target.positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;\n\n if (color && target.colors) {\n if (twoByteColor) {\n target.colors[pointIndex * 4] = color[0] / 256;\n target.colors[pointIndex * 4 + 1] = color[1] / 256;\n target.colors[pointIndex * 4 + 2] = color[2] / 256;\n } else {\n target.colors[pointIndex * 4] = color[0];\n target.colors[pointIndex * 4 + 1] = color[1];\n target.colors[pointIndex * 4 + 2] = color[2];\n }\n target.colors[pointIndex * 4 + 3] = 255;\n }\n\n target.intensities[pointIndex] = intensity;\n target.classifications[pointIndex] = classification;\n }\n}\n\n/**\n * parse laz data\n * @param rawData\n * @param onParseData\n * @return parsed point cloud\n */\n/* eslint-enable max-statements */\nexport function parseLASChunked(\n rawData: ArrayBuffer,\n onParseData: any = {},\n batchSize: number = DEFAULT_BATCH_SIZE\n): void {\n for (const {decoder, header} of parseLASChunkedIterator(rawData, batchSize)) {\n onParseData(decoder, header);\n }\n}\n\n/**\n * Decode LAS/LAZ data into point chunks.\n * @param rawData Complete LAS/LAZ file data\n * @param batchSize Number of returned points per chunk\n * @returns Iterable of decoded point chunks\n */\nfunction* parseLASChunkedIterator(\n rawData: ArrayBuffer,\n batchSize: number = DEFAULT_BATCH_SIZE\n): Iterable<LASDecodedChunk> {\n const dataHandler = new LASFile(rawData);\n\n try {\n // open data\n dataHandler.open();\n\n const header = dataHandler.getHeader();\n // start loading\n const Unpacker = dataHandler.getUnpacker();\n\n header.totalToRead = header.pointsCount;\n let totalRead = 0;\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const chunk: LASChunk = dataHandler.readData(batchSize);\n\n totalRead += chunk.count;\n\n header.totalRead = totalRead;\n\n const unpacker = new Unpacker(chunk.buffer, chunk.count, header);\n\n // surface unpacker and progress via call back\n // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app\n yield {decoder: unpacker as unknown as LASDecoder, header};\n\n if (!chunk.hasMoreData || totalRead >= header.totalToRead) {\n break;\n }\n }\n } catch (e) {\n throw e;\n } finally {\n dataHandler.close();\n }\n}\n\n/**\n * Get the requested LAS point batch size.\n * @param options LAS loader options\n * @returns Point count per decoded batch\n */\nfunction getBatchSize(options: LASLoaderOptions): number {\n const batchSize = options.batchSize ?? options.core?.batchSize;\n return typeof batchSize === 'number' ? batchSize : DEFAULT_BATCH_SIZE;\n}\n\n/**\n * @param decoder\n * @param batchSize\n * @param colorDepth\n * @returns boolean\n */\nfunction detectTwoByteColors(\n decoder: any = {},\n batchSize: number,\n colorDepth?: number | string\n): boolean {\n let twoByteColor = false;\n switch (colorDepth) {\n case 8:\n twoByteColor = false;\n break;\n case 16:\n twoByteColor = true;\n break;\n case 'auto':\n if (decoder.getPoint(0).color) {\n for (let i = 0; i < batchSize; i++) {\n const {color} = decoder.getPoint(i);\n // eslint-disable-next-line max-depth\n if (color[0] > 255 || color[1] > 255 || color[2] > 255) {\n twoByteColor = true;\n }\n }\n }\n break;\n default:\n // eslint-disable-next-line\n console.warn('las: illegal value for options.las.colorDepth');\n break;\n }\n return twoByteColor;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ import type { LASLoaderOptions } from "../../las-loader-types.js";
2
+ import type { LASMesh } from "../las-types.js";
3
+ /**
4
+ * Parsing of .las file
5
+ * @param arrayBuffer
6
+ * @param options
7
+ * @returns LASMesh
8
+ */
9
+ export declare function parseLAS(arrayBuffer: ArrayBuffer, options?: LASLoaderOptions): LASMesh;
10
+ /**
11
+ * Parse LAS/LAZ data in decoded point batches.
12
+ * @param arrayBufferIterator Iterator yielding LAS/LAZ binary chunks
13
+ * @param options LAS loader options
14
+ * @returns Async iterable of mesh batches
15
+ */
16
+ export declare function parseLASInBatches(arrayBufferIterator: AsyncIterable<ArrayBufferLike | ArrayBufferView> | Iterable<ArrayBufferLike | ArrayBufferView>, options?: LASLoaderOptions): AsyncIterable<LASMesh>;
17
+ /**
18
+ * parse laz data
19
+ * @param rawData
20
+ * @param onParseData
21
+ * @return parsed point cloud
22
+ */
23
+ export declare function parseLASChunked(rawData: ArrayBuffer, onParseData?: any, batchSize?: number): void;
24
+ //# sourceMappingURL=parse-las.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-las.d.ts","sourceRoot":"","sources":["../../../../src/las/lib/laz-perf/parse-las.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,gBAAgB,EAAC,kCAA+B;AAC7D,OAAO,KAAK,EAAC,OAAO,EAAY,wBAAqB;AA8BrD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAKtF;AAED;;;;;GAKG;AACH,wBAAuB,iBAAiB,CACtC,mBAAmB,EACf,aAAa,CAAC,eAAe,GAAG,eAAe,CAAC,GAChD,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC,EAC/C,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAAC,OAAO,CAAC,CAOxB;AAwOD;;;;;GAKG;AAEH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,WAAW,GAAE,GAAQ,EACrB,SAAS,GAAE,MAA2B,GACrC,IAAI,CAIN"}
@@ -0,0 +1,307 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { getMeshBoundingBox /* , convertMeshToTable */ } from '@loaders.gl/core/schema-utils';
5
+ import { concatenateArrayBuffersAsync } from '@loaders.gl/core/loader-utils';
6
+ import { getLASSchema } from "../get-las-schema.js";
7
+ import { LASFile } from "./laslaz-decoder.js";
8
+ const DEFAULT_BATCH_SIZE = 1000 * 100;
9
+ /**
10
+ * Parsing of .las file
11
+ * @param arrayBuffer
12
+ * @param options
13
+ * @returns LASMesh
14
+ */
15
+ export function parseLAS(arrayBuffer, options) {
16
+ return parseLASMesh(arrayBuffer, options);
17
+ // This code breaks pointcloud example on the website
18
+ // const mesh = parseLASMesh(arrayBuffer, options);
19
+ // return convertMeshToTable(mesh, options?.las?.shape || 'mesh') as LASMesh | ArrowTable | ColumnarTable;
20
+ }
21
+ /**
22
+ * Parse LAS/LAZ data in decoded point batches.
23
+ * @param arrayBufferIterator Iterator yielding LAS/LAZ binary chunks
24
+ * @param options LAS loader options
25
+ * @returns Async iterable of mesh batches
26
+ */
27
+ export async function* parseLASInBatches(arrayBufferIterator, options = {}) {
28
+ const arrayBuffer = await concatenateArrayBuffersAsync(arrayBufferIterator);
29
+ const batchSize = getBatchSize(options);
30
+ for (const { decoder, header } of parseLASChunkedIterator(arrayBuffer, batchSize)) {
31
+ yield parseLASMeshBatch(decoder, header, options);
32
+ }
33
+ }
34
+ /**
35
+ * Parsing of .las file
36
+ * @param arrayBuffer
37
+ * @param options
38
+ * @returns LASHeader
39
+ */
40
+ function parseLASMesh(arrayBuffer, options = {}) {
41
+ let pointIndex = 0;
42
+ let positions;
43
+ let colors;
44
+ let intensities;
45
+ let classifications;
46
+ let originalHeader;
47
+ const lasMesh = {
48
+ loader: 'las',
49
+ loaderData: {},
50
+ // shape: 'mesh',
51
+ schema: { fields: [], metadata: {} },
52
+ header: {
53
+ vertexCount: 0,
54
+ boundingBox: [
55
+ [0, 0, 0],
56
+ [0, 0, 0]
57
+ ]
58
+ },
59
+ attributes: {},
60
+ topology: 'point-list',
61
+ mode: 0 // GL.POINTS
62
+ };
63
+ /* eslint-disable max-statements */
64
+ // @ts-ignore Possibly undefined
65
+ parseLASChunked(arrayBuffer, (decoder = {}, lasHeader) => {
66
+ if (!originalHeader) {
67
+ originalHeader = lasHeader;
68
+ const total = lasHeader.totalToRead;
69
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
70
+ positions = new PositionsType(total * 3);
71
+ // laslaz-decoder.js `pointFormatReaders`
72
+ colors = lasHeader.hasColor ? new Uint8Array(total * 4) : null;
73
+ intensities = new Uint16Array(total);
74
+ classifications = new Uint8Array(total);
75
+ lasMesh.loaderData = lasHeader;
76
+ lasMesh.attributes = {
77
+ POSITION: { value: positions, size: 3 },
78
+ // non-gltf attributes, use non-capitalized names for now
79
+ intensity: { value: intensities, size: 1 },
80
+ classification: { value: classifications, size: 1 }
81
+ };
82
+ if (colors) {
83
+ lasMesh.attributes.COLOR_0 = { value: colors, size: 4 };
84
+ }
85
+ }
86
+ const batchSize = decoder.pointsCount;
87
+ const { scale: [scaleX, scaleY, scaleZ], offset: [offsetX, offsetY, offsetZ] } = lasHeader;
88
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
89
+ for (let i = 0; i < batchSize; i++) {
90
+ const { position, color, intensity, classification } = decoder.getPoint(i);
91
+ positions[pointIndex * 3] = position[0] * scaleX + offsetX;
92
+ positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
93
+ positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
94
+ if (color && colors) {
95
+ if (twoByteColor) {
96
+ colors[pointIndex * 4] = color[0] / 256;
97
+ colors[pointIndex * 4 + 1] = color[1] / 256;
98
+ colors[pointIndex * 4 + 2] = color[2] / 256;
99
+ }
100
+ else {
101
+ colors[pointIndex * 4] = color[0];
102
+ colors[pointIndex * 4 + 1] = color[1];
103
+ colors[pointIndex * 4 + 2] = color[2];
104
+ }
105
+ colors[pointIndex * 4 + 3] = 255;
106
+ }
107
+ intensities[pointIndex] = intensity;
108
+ classifications[pointIndex] = classification;
109
+ pointIndex++;
110
+ }
111
+ const meshBatch = {
112
+ ...lasMesh,
113
+ header: {
114
+ vertexCount: lasHeader.totalRead
115
+ },
116
+ progress: lasHeader.totalRead / lasHeader.totalToRead
117
+ };
118
+ options?.onProgress?.({
119
+ ...meshBatch,
120
+ phase: 'decode',
121
+ completed: lasHeader.totalRead,
122
+ total: lasHeader.totalToRead,
123
+ unit: 'points'
124
+ });
125
+ });
126
+ /* eslint-enable max-statements */
127
+ lasMesh.header = {
128
+ vertexCount: originalHeader.totalToRead,
129
+ boundingBox: getMeshBoundingBox(lasMesh?.attributes || {}) ?? undefined
130
+ };
131
+ if (lasMesh) {
132
+ lasMesh.schema = getLASSchema(lasMesh.loaderData, lasMesh.attributes);
133
+ }
134
+ return lasMesh;
135
+ }
136
+ /**
137
+ * Convert one decoded LAS/LAZ chunk into a mesh.
138
+ * @param decoder Point decoder for the current chunk
139
+ * @param lasHeader LAS file header with current progress
140
+ * @param options LAS loader options
141
+ * @returns Mesh containing one decoded point batch
142
+ */
143
+ function parseLASMeshBatch(decoder, lasHeader, options = {}) {
144
+ const batchSize = decoder.pointsCount;
145
+ const PositionsType = options.las?.fp64 ? Float64Array : Float32Array;
146
+ const positions = new PositionsType(batchSize * 3);
147
+ const colors = lasHeader.hasColor ? new Uint8Array(batchSize * 4) : null;
148
+ const intensities = new Uint16Array(batchSize);
149
+ const classifications = new Uint8Array(batchSize);
150
+ populateLASAttributes(decoder, lasHeader, options, {
151
+ positions,
152
+ colors,
153
+ intensities,
154
+ classifications,
155
+ pointOffset: 0
156
+ });
157
+ const attributes = {
158
+ POSITION: { value: positions, size: 3 },
159
+ intensity: { value: intensities, size: 1 },
160
+ classification: { value: classifications, size: 1 }
161
+ };
162
+ if (colors) {
163
+ attributes.COLOR_0 = { value: colors, size: 4 };
164
+ }
165
+ const batchHeader = { ...lasHeader };
166
+ const lasMesh = {
167
+ loader: 'las',
168
+ loaderData: batchHeader,
169
+ schema: { fields: [], metadata: {} },
170
+ header: {
171
+ vertexCount: batchSize,
172
+ boundingBox: getMeshBoundingBox(attributes)
173
+ },
174
+ attributes,
175
+ topology: 'point-list',
176
+ mode: 0,
177
+ progress: lasHeader.totalRead / lasHeader.totalToRead
178
+ };
179
+ lasMesh.schema = getLASSchema(batchHeader, lasMesh.attributes);
180
+ return lasMesh;
181
+ }
182
+ /**
183
+ * Fill typed LAS attribute arrays from a decoded chunk.
184
+ * @param decoder Point decoder for the current chunk
185
+ * @param lasHeader LAS file header
186
+ * @param options LAS loader options
187
+ * @param target Target attribute arrays and write offset
188
+ */
189
+ function populateLASAttributes(decoder, lasHeader, options, target) {
190
+ const batchSize = decoder.pointsCount;
191
+ const { scale: [scaleX, scaleY, scaleZ], offset: [offsetX, offsetY, offsetZ] } = lasHeader;
192
+ const twoByteColor = detectTwoByteColors(decoder, batchSize, options.las?.colorDepth);
193
+ for (let i = 0; i < batchSize; i++) {
194
+ const { position, color, intensity, classification } = decoder.getPoint(i);
195
+ const pointIndex = target.pointOffset + i;
196
+ target.positions[pointIndex * 3] = position[0] * scaleX + offsetX;
197
+ target.positions[pointIndex * 3 + 1] = position[1] * scaleY + offsetY;
198
+ target.positions[pointIndex * 3 + 2] = position[2] * scaleZ + offsetZ;
199
+ if (color && target.colors) {
200
+ if (twoByteColor) {
201
+ target.colors[pointIndex * 4] = color[0] / 256;
202
+ target.colors[pointIndex * 4 + 1] = color[1] / 256;
203
+ target.colors[pointIndex * 4 + 2] = color[2] / 256;
204
+ }
205
+ else {
206
+ target.colors[pointIndex * 4] = color[0];
207
+ target.colors[pointIndex * 4 + 1] = color[1];
208
+ target.colors[pointIndex * 4 + 2] = color[2];
209
+ }
210
+ target.colors[pointIndex * 4 + 3] = 255;
211
+ }
212
+ target.intensities[pointIndex] = intensity;
213
+ target.classifications[pointIndex] = classification;
214
+ }
215
+ }
216
+ /**
217
+ * parse laz data
218
+ * @param rawData
219
+ * @param onParseData
220
+ * @return parsed point cloud
221
+ */
222
+ /* eslint-enable max-statements */
223
+ export function parseLASChunked(rawData, onParseData = {}, batchSize = DEFAULT_BATCH_SIZE) {
224
+ for (const { decoder, header } of parseLASChunkedIterator(rawData, batchSize)) {
225
+ onParseData(decoder, header);
226
+ }
227
+ }
228
+ /**
229
+ * Decode LAS/LAZ data into point chunks.
230
+ * @param rawData Complete LAS/LAZ file data
231
+ * @param batchSize Number of returned points per chunk
232
+ * @returns Iterable of decoded point chunks
233
+ */
234
+ function* parseLASChunkedIterator(rawData, batchSize = DEFAULT_BATCH_SIZE) {
235
+ const dataHandler = new LASFile(rawData);
236
+ try {
237
+ // open data
238
+ dataHandler.open();
239
+ const header = dataHandler.getHeader();
240
+ // start loading
241
+ const Unpacker = dataHandler.getUnpacker();
242
+ header.totalToRead = header.pointsCount;
243
+ let totalRead = 0;
244
+ /* eslint-disable no-constant-condition */
245
+ while (true) {
246
+ const chunk = dataHandler.readData(batchSize);
247
+ totalRead += chunk.count;
248
+ header.totalRead = totalRead;
249
+ const unpacker = new Unpacker(chunk.buffer, chunk.count, header);
250
+ // surface unpacker and progress via call back
251
+ // use unpacker.pointsCount and unpacker.getPoint(i) to handle data in app
252
+ yield { decoder: unpacker, header };
253
+ if (!chunk.hasMoreData || totalRead >= header.totalToRead) {
254
+ break;
255
+ }
256
+ }
257
+ }
258
+ catch (e) {
259
+ throw e;
260
+ }
261
+ finally {
262
+ dataHandler.close();
263
+ }
264
+ }
265
+ /**
266
+ * Get the requested LAS point batch size.
267
+ * @param options LAS loader options
268
+ * @returns Point count per decoded batch
269
+ */
270
+ function getBatchSize(options) {
271
+ const batchSize = options.batchSize ?? options.core?.batchSize;
272
+ return typeof batchSize === 'number' ? batchSize : DEFAULT_BATCH_SIZE;
273
+ }
274
+ /**
275
+ * @param decoder
276
+ * @param batchSize
277
+ * @param colorDepth
278
+ * @returns boolean
279
+ */
280
+ function detectTwoByteColors(decoder = {}, batchSize, colorDepth) {
281
+ let twoByteColor = false;
282
+ switch (colorDepth) {
283
+ case 8:
284
+ twoByteColor = false;
285
+ break;
286
+ case 16:
287
+ twoByteColor = true;
288
+ break;
289
+ case 'auto':
290
+ if (decoder.getPoint(0).color) {
291
+ for (let i = 0; i < batchSize; i++) {
292
+ const { color } = decoder.getPoint(i);
293
+ // eslint-disable-next-line max-depth
294
+ if (color[0] > 255 || color[1] > 255 || color[2] > 255) {
295
+ twoByteColor = true;
296
+ }
297
+ }
298
+ }
299
+ break;
300
+ default:
301
+ // eslint-disable-next-line
302
+ console.warn('las: illegal value for options.las.colorDepth');
303
+ break;
304
+ }
305
+ return twoByteColor;
306
+ }
307
+ //# sourceMappingURL=parse-las.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-las.js","sourceRoot":"","sources":["../../../../src/las/lib/laz-perf/parse-las.ts"],"names":[],"mappings":"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"}