@loaders.gl/pointclouds 5.0.0-beta.1 → 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 (372) hide show
  1. package/LAS-README.md +1 -1
  2. package/PCD-README.md +1 -1
  3. package/PLY-README.md +1 -1
  4. package/README.md +5 -1
  5. package/dist/dist.dev.js +3584 -2211
  6. package/dist/dist.min.js +20 -20
  7. package/dist/index.cjs +0 -6
  8. package/dist/index.cjs.map +2 -2
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/las/bundled.cjs +0 -3
  14. package/dist/las/bundled.cjs.map +2 -2
  15. package/dist/las/bundled.d.ts +0 -1
  16. package/dist/las/bundled.d.ts.map +1 -1
  17. package/dist/las/bundled.js +0 -1
  18. package/dist/las/bundled.js.map +1 -1
  19. package/dist/las/index.cjs +0 -3
  20. package/dist/las/index.cjs.map +3 -3
  21. package/dist/las/index.d.ts +0 -2
  22. package/dist/las/index.d.ts.map +1 -1
  23. package/dist/las/index.js +0 -3
  24. package/dist/las/index.js.map +1 -1
  25. package/dist/las/las-copc-loader-types.cjs +1 -1
  26. package/dist/las/las-copc-loader-types.cjs.map +2 -2
  27. package/dist/las/las-copc-loader-types.d.ts +13 -9
  28. package/dist/las/las-copc-loader-types.d.ts.map +1 -1
  29. package/dist/las/las-copc-loader-types.js +1 -1
  30. package/dist/las/las-copc-loader-types.js.map +1 -1
  31. package/dist/las/las-copc-loader.cjs +8 -5
  32. package/dist/las/las-copc-loader.cjs.map +2 -2
  33. package/dist/las/las-copc-loader.d.ts +8 -6
  34. package/dist/las/las-copc-loader.d.ts.map +1 -1
  35. package/dist/las/las-copc-loader.js +11 -6
  36. package/dist/las/las-copc-loader.js.map +1 -1
  37. package/dist/las/las-loader-shared.cjs +4 -2
  38. package/dist/las/las-loader-shared.cjs.map +2 -2
  39. package/dist/las/las-loader-shared.d.ts +9 -7
  40. package/dist/las/las-loader-shared.d.ts.map +1 -1
  41. package/dist/las/las-loader-shared.js +4 -2
  42. package/dist/las/las-loader-shared.js.map +1 -1
  43. package/dist/las/las-loader-types.cjs +3 -6
  44. package/dist/las/las-loader-types.cjs.map +2 -2
  45. package/dist/las/las-loader-types.d.ts +18 -45
  46. package/dist/las/las-loader-types.d.ts.map +1 -1
  47. package/dist/las/las-loader-types.js +1 -3
  48. package/dist/las/las-loader-types.js.map +1 -1
  49. package/dist/las/las-loader.cjs +61 -13
  50. package/dist/las/las-loader.cjs.map +3 -3
  51. package/dist/las/las-loader.d.ts +51 -5
  52. package/dist/las/las-loader.d.ts.map +1 -1
  53. package/dist/las/las-loader.js +56 -6
  54. package/dist/las/las-loader.js.map +1 -1
  55. package/dist/las/las-writer.cjs +3 -3
  56. package/dist/las/las-writer.cjs.map +2 -2
  57. package/dist/las/las-writer.d.ts +4 -3
  58. package/dist/las/las-writer.d.ts.map +1 -1
  59. package/dist/las/las-writer.js +4 -6
  60. package/dist/las/las-writer.js.map +1 -1
  61. package/dist/las/laz-rs-loader-types.cjs +1 -1
  62. package/dist/las/laz-rs-loader-types.cjs.map +2 -2
  63. package/dist/las/laz-rs-loader-types.d.ts +13 -9
  64. package/dist/las/laz-rs-loader-types.d.ts.map +1 -1
  65. package/dist/las/laz-rs-loader-types.js +1 -1
  66. package/dist/las/laz-rs-loader-types.js.map +1 -1
  67. package/dist/las/laz-rs-loader.cjs +8 -5
  68. package/dist/las/laz-rs-loader.cjs.map +2 -2
  69. package/dist/las/laz-rs-loader.d.ts +8 -6
  70. package/dist/las/laz-rs-loader.d.ts.map +1 -1
  71. package/dist/las/laz-rs-loader.js +11 -6
  72. package/dist/las/laz-rs-loader.js.map +1 -1
  73. package/dist/las/lazperf-loader-types.cjs +1 -1
  74. package/dist/las/lazperf-loader-types.cjs.map +2 -2
  75. package/dist/las/lazperf-loader-types.d.ts +14 -10
  76. package/dist/las/lazperf-loader-types.d.ts.map +1 -1
  77. package/dist/las/lazperf-loader-types.js +1 -1
  78. package/dist/las/lazperf-loader-types.js.map +1 -1
  79. package/dist/las/lazperf-loader.cjs +9 -6
  80. package/dist/las/lazperf-loader.cjs.map +2 -2
  81. package/dist/las/lazperf-loader.d.ts +9 -7
  82. package/dist/las/lazperf-loader.d.ts.map +1 -1
  83. package/dist/las/lazperf-loader.js +12 -7
  84. package/dist/las/lazperf-loader.js.map +1 -1
  85. package/dist/las/lib/copc/parse-las.cjs +1 -1
  86. package/dist/las/lib/copc/parse-las.cjs.map +2 -2
  87. package/dist/las/lib/copc/parse-las.js +1 -1
  88. package/dist/las/lib/copc/parse-las.js.map +1 -1
  89. package/dist/las/lib/get-las-schema.cjs +5 -0
  90. package/dist/las/lib/get-las-schema.cjs.map +2 -2
  91. package/dist/las/lib/get-las-schema.d.ts.map +1 -1
  92. package/dist/las/lib/get-las-schema.js +6 -0
  93. package/dist/las/lib/get-las-schema.js.map +1 -1
  94. package/dist/las/lib/las-extra-bytes.cjs +6 -1
  95. package/dist/las/lib/las-extra-bytes.cjs.map +2 -2
  96. package/dist/las/lib/las-extra-bytes.d.ts.map +1 -1
  97. package/dist/las/lib/las-extra-bytes.js +6 -4
  98. package/dist/las/lib/las-extra-bytes.js.map +1 -1
  99. package/dist/las/lib/laz-perf/parse-las.cjs +9 -8
  100. package/dist/las/lib/laz-perf/parse-las.cjs.map +3 -3
  101. package/dist/las/lib/laz-perf/parse-las.js +9 -8
  102. package/dist/las/lib/laz-perf/parse-las.js.map +1 -1
  103. package/dist/las/lib/laz-rs-wasm/parse-las.cjs +9 -8
  104. package/dist/las/lib/laz-rs-wasm/parse-las.cjs.map +3 -3
  105. package/dist/las/lib/laz-rs-wasm/parse-las.js +9 -8
  106. package/dist/las/lib/laz-rs-wasm/parse-las.js.map +1 -1
  107. package/dist/las/lib/typescript/parse-las.cjs +135 -13
  108. package/dist/las/lib/typescript/parse-las.cjs.map +3 -3
  109. package/dist/las/lib/typescript/parse-las.d.ts.map +1 -1
  110. package/dist/las/lib/typescript/parse-las.js +106 -10
  111. package/dist/las/lib/typescript/parse-las.js.map +1 -1
  112. package/dist/las/unbundled.cjs +0 -2
  113. package/dist/las/unbundled.cjs.map +2 -2
  114. package/dist/las/unbundled.d.ts +1 -1
  115. package/dist/las/unbundled.d.ts.map +1 -1
  116. package/dist/las/unbundled.js +1 -1
  117. package/dist/las/unbundled.js.map +1 -1
  118. package/dist/las/workers/las-worker.cjs +5 -5
  119. package/dist/las/workers/las-worker.cjs.map +2 -2
  120. package/dist/las/workers/las-worker.js +6 -6
  121. package/dist/las/workers/las-worker.js.map +1 -1
  122. package/dist/las-copc-loader-types.cjs +51 -0
  123. package/dist/las-copc-loader-types.cjs.map +7 -0
  124. package/dist/las-copc-loader-types.d.ts +2 -0
  125. package/dist/las-copc-loader-types.d.ts.map +1 -0
  126. package/dist/las-copc-loader-types.js +2 -0
  127. package/dist/las-copc-loader-types.js.map +1 -0
  128. package/dist/las-copc-loader.cjs +62 -0
  129. package/dist/las-copc-loader.cjs.map +7 -0
  130. package/dist/las-copc-loader.d.ts +2 -0
  131. package/dist/las-copc-loader.d.ts.map +1 -0
  132. package/dist/las-copc-loader.js +2 -0
  133. package/dist/las-copc-loader.js.map +1 -0
  134. package/dist/las-loader-types.cjs +53 -0
  135. package/dist/las-loader-types.cjs.map +7 -0
  136. package/dist/las-loader-types.d.ts +2 -0
  137. package/dist/las-loader-types.d.ts.map +1 -0
  138. package/dist/las-loader-types.js +2 -0
  139. package/dist/las-loader-types.js.map +1 -0
  140. package/dist/las-loader.cjs +130 -0
  141. package/dist/las-loader.cjs.map +7 -0
  142. package/dist/las-loader.d.ts +2 -0
  143. package/dist/las-loader.d.ts.map +1 -0
  144. package/dist/las-loader.js +2 -0
  145. package/dist/las-loader.js.map +1 -0
  146. package/dist/las-worker.js +1219 -253
  147. package/dist/las-writer.cjs +1056 -0
  148. package/dist/las-writer.cjs.map +7 -0
  149. package/dist/las-writer.d.ts +2 -0
  150. package/dist/las-writer.d.ts.map +1 -0
  151. package/dist/las-writer.js +2 -0
  152. package/dist/las-writer.js.map +1 -0
  153. package/dist/laz-rs-loader-types.cjs +51 -0
  154. package/dist/laz-rs-loader-types.cjs.map +7 -0
  155. package/dist/laz-rs-loader-types.d.ts +2 -0
  156. package/dist/laz-rs-loader-types.d.ts.map +1 -0
  157. package/dist/laz-rs-loader-types.js +2 -0
  158. package/dist/laz-rs-loader-types.js.map +1 -0
  159. package/dist/laz-rs-loader.cjs +277 -0
  160. package/dist/laz-rs-loader.cjs.map +7 -0
  161. package/dist/laz-rs-loader.d.ts +2 -0
  162. package/dist/laz-rs-loader.d.ts.map +1 -0
  163. package/dist/laz-rs-loader.js +2 -0
  164. package/dist/laz-rs-loader.js.map +1 -0
  165. package/dist/lazperf-loader-types.cjs +51 -0
  166. package/dist/lazperf-loader-types.cjs.map +7 -0
  167. package/dist/lazperf-loader-types.d.ts +2 -0
  168. package/dist/lazperf-loader-types.d.ts.map +1 -0
  169. package/dist/lazperf-loader-types.js +2 -0
  170. package/dist/lazperf-loader-types.js.map +1 -0
  171. package/dist/lazperf-loader.cjs +65 -0
  172. package/dist/lazperf-loader.cjs.map +7 -0
  173. package/dist/lazperf-loader.d.ts +2 -0
  174. package/dist/lazperf-loader.d.ts.map +1 -0
  175. package/dist/lazperf-loader.js +2 -0
  176. package/dist/lazperf-loader.js.map +1 -0
  177. package/dist/pcd/bundled.cjs +2 -4
  178. package/dist/pcd/bundled.cjs.map +2 -2
  179. package/dist/pcd/bundled.d.ts +1 -1
  180. package/dist/pcd/bundled.d.ts.map +1 -1
  181. package/dist/pcd/bundled.js +1 -1
  182. package/dist/pcd/bundled.js.map +1 -1
  183. package/dist/pcd/index.cjs +0 -3
  184. package/dist/pcd/index.cjs.map +3 -3
  185. package/dist/pcd/index.d.ts +0 -2
  186. package/dist/pcd/index.d.ts.map +1 -1
  187. package/dist/pcd/index.js +0 -3
  188. package/dist/pcd/index.js.map +1 -1
  189. package/dist/pcd/pcd-loader-types.cjs +9 -10
  190. package/dist/pcd/pcd-loader-types.cjs.map +2 -2
  191. package/dist/pcd/pcd-loader-types.d.ts +18 -41
  192. package/dist/pcd/pcd-loader-types.d.ts.map +1 -1
  193. package/dist/pcd/pcd-loader-types.js +6 -6
  194. package/dist/pcd/pcd-loader-types.js.map +1 -1
  195. package/dist/pcd/pcd-loader.cjs +82 -25
  196. package/dist/pcd/pcd-loader.cjs.map +3 -3
  197. package/dist/pcd/pcd-loader.d.ts +42 -6
  198. package/dist/pcd/pcd-loader.d.ts.map +1 -1
  199. package/dist/pcd/pcd-loader.js +72 -21
  200. package/dist/pcd/pcd-loader.js.map +1 -1
  201. package/dist/pcd/pcd-writer.cjs +3 -3
  202. package/dist/pcd/pcd-writer.cjs.map +2 -2
  203. package/dist/pcd/pcd-writer.d.ts +5 -4
  204. package/dist/pcd/pcd-writer.d.ts.map +1 -1
  205. package/dist/pcd/pcd-writer.js +4 -4
  206. package/dist/pcd/pcd-writer.js.map +1 -1
  207. package/dist/pcd/unbundled.cjs +2 -4
  208. package/dist/pcd/unbundled.cjs.map +2 -2
  209. package/dist/pcd/unbundled.d.ts +1 -1
  210. package/dist/pcd/unbundled.d.ts.map +1 -1
  211. package/dist/pcd/unbundled.js +1 -1
  212. package/dist/pcd/unbundled.js.map +1 -1
  213. package/dist/pcd/workers/pcd-worker.cjs +5 -5
  214. package/dist/pcd/workers/pcd-worker.cjs.map +2 -2
  215. package/dist/pcd/workers/pcd-worker.js +6 -6
  216. package/dist/pcd/workers/pcd-worker.js.map +1 -1
  217. package/dist/pcd-loader-types.cjs +65 -0
  218. package/dist/pcd-loader-types.cjs.map +7 -0
  219. package/dist/pcd-loader-types.d.ts +2 -0
  220. package/dist/pcd-loader-types.d.ts.map +1 -0
  221. package/dist/pcd-loader-types.js +2 -0
  222. package/dist/pcd-loader-types.js.map +1 -0
  223. package/dist/pcd-loader.cjs +203 -0
  224. package/dist/pcd-loader.cjs.map +7 -0
  225. package/dist/pcd-loader.d.ts +2 -0
  226. package/dist/pcd-loader.d.ts.map +1 -0
  227. package/dist/pcd-loader.js +2 -0
  228. package/dist/pcd-loader.js.map +1 -0
  229. package/dist/pcd-worker.js +1457 -418
  230. package/dist/pcd-writer.cjs +136 -0
  231. package/dist/pcd-writer.cjs.map +7 -0
  232. package/dist/pcd-writer.d.ts +2 -0
  233. package/dist/pcd-writer.d.ts.map +1 -0
  234. package/dist/pcd-writer.js +2 -0
  235. package/dist/pcd-writer.js.map +1 -0
  236. package/dist/ply/bundled.cjs +2 -4
  237. package/dist/ply/bundled.cjs.map +2 -2
  238. package/dist/ply/bundled.d.ts +1 -1
  239. package/dist/ply/bundled.d.ts.map +1 -1
  240. package/dist/ply/bundled.js +1 -1
  241. package/dist/ply/bundled.js.map +1 -1
  242. package/dist/ply/index.cjs +0 -3
  243. package/dist/ply/index.cjs.map +3 -3
  244. package/dist/ply/index.d.ts +0 -2
  245. package/dist/ply/index.d.ts.map +1 -1
  246. package/dist/ply/index.js +0 -3
  247. package/dist/ply/index.js.map +1 -1
  248. package/dist/ply/lib/get-ply-schema.cjs +4 -2
  249. package/dist/ply/lib/get-ply-schema.cjs.map +2 -2
  250. package/dist/ply/lib/get-ply-schema.d.ts +6 -0
  251. package/dist/ply/lib/get-ply-schema.d.ts.map +1 -1
  252. package/dist/ply/lib/get-ply-schema.js +1 -1
  253. package/dist/ply/lib/get-ply-schema.js.map +1 -1
  254. package/dist/ply/lib/parse-ply-arrow.cjs +1 -1
  255. package/dist/ply/lib/parse-ply-arrow.cjs.map +2 -2
  256. package/dist/ply/lib/parse-ply-arrow.js +2 -2
  257. package/dist/ply/lib/parse-ply-arrow.js.map +1 -1
  258. package/dist/ply/lib/parse-ply-in-batches.cjs +14 -8
  259. package/dist/ply/lib/parse-ply-in-batches.cjs.map +3 -3
  260. package/dist/ply/lib/parse-ply-in-batches.d.ts.map +1 -1
  261. package/dist/ply/lib/parse-ply-in-batches.js +9 -4
  262. package/dist/ply/lib/parse-ply-in-batches.js.map +1 -1
  263. package/dist/ply/lib/parse-ply.cjs +3 -0
  264. package/dist/ply/lib/parse-ply.cjs.map +2 -2
  265. package/dist/ply/lib/parse-ply.d.ts +1 -1
  266. package/dist/ply/lib/parse-ply.d.ts.map +1 -1
  267. package/dist/ply/lib/parse-ply.js +4 -0
  268. package/dist/ply/lib/parse-ply.js.map +1 -1
  269. package/dist/ply/ply-loader-types.cjs +9 -10
  270. package/dist/ply/ply-loader-types.cjs.map +2 -2
  271. package/dist/ply/ply-loader-types.d.ts +19 -42
  272. package/dist/ply/ply-loader-types.d.ts.map +1 -1
  273. package/dist/ply/ply-loader-types.js +6 -6
  274. package/dist/ply/ply-loader-types.js.map +1 -1
  275. package/dist/ply/ply-loader.cjs +82 -24
  276. package/dist/ply/ply-loader.cjs.map +3 -3
  277. package/dist/ply/ply-loader.d.ts +43 -6
  278. package/dist/ply/ply-loader.d.ts.map +1 -1
  279. package/dist/ply/ply-loader.js +71 -19
  280. package/dist/ply/ply-loader.js.map +1 -1
  281. package/dist/ply/ply-writer.cjs +3 -3
  282. package/dist/ply/ply-writer.cjs.map +2 -2
  283. package/dist/ply/ply-writer.d.ts +5 -4
  284. package/dist/ply/ply-writer.d.ts.map +1 -1
  285. package/dist/ply/ply-writer.js +4 -4
  286. package/dist/ply/ply-writer.js.map +1 -1
  287. package/dist/ply/unbundled.cjs +2 -4
  288. package/dist/ply/unbundled.cjs.map +2 -2
  289. package/dist/ply/unbundled.d.ts +1 -1
  290. package/dist/ply/unbundled.d.ts.map +1 -1
  291. package/dist/ply/unbundled.js +1 -1
  292. package/dist/ply/unbundled.js.map +1 -1
  293. package/dist/ply/workers/ply-worker.cjs +6 -6
  294. package/dist/ply/workers/ply-worker.cjs.map +2 -2
  295. package/dist/ply/workers/ply-worker.js +8 -8
  296. package/dist/ply/workers/ply-worker.js.map +1 -1
  297. package/dist/ply-loader-types.cjs +66 -0
  298. package/dist/ply-loader-types.cjs.map +7 -0
  299. package/dist/ply-loader-types.d.ts +2 -0
  300. package/dist/ply-loader-types.d.ts.map +1 -0
  301. package/dist/ply-loader-types.js +2 -0
  302. package/dist/ply-loader-types.js.map +1 -0
  303. package/dist/ply-loader.cjs +194 -0
  304. package/dist/ply-loader.cjs.map +7 -0
  305. package/dist/ply-loader.d.ts +2 -0
  306. package/dist/ply-loader.d.ts.map +1 -0
  307. package/dist/ply-loader.js +2 -0
  308. package/dist/ply-loader.js.map +1 -0
  309. package/dist/ply-worker.js +2099 -312
  310. package/dist/ply-writer.cjs +177 -0
  311. package/dist/ply-writer.cjs.map +7 -0
  312. package/dist/ply-writer.d.ts +2 -0
  313. package/dist/ply-writer.d.ts.map +1 -0
  314. package/dist/ply-writer.js +2 -0
  315. package/dist/ply-writer.js.map +1 -0
  316. package/package.json +75 -71
  317. package/src/index.ts +3 -3
  318. package/src/las/bundled.ts +0 -1
  319. package/src/las/index.ts +0 -4
  320. package/src/las/las-copc-loader-types.ts +3 -3
  321. package/src/las/las-copc-loader.ts +12 -12
  322. package/src/las/las-loader-shared.ts +9 -7
  323. package/src/las/las-loader-types.ts +3 -6
  324. package/src/las/las-loader.ts +63 -9
  325. package/src/las/las-writer.ts +17 -13
  326. package/src/las/laz-rs-loader-types.ts +3 -3
  327. package/src/las/laz-rs-loader.ts +11 -11
  328. package/src/las/lazperf-loader-types.ts +3 -3
  329. package/src/las/lazperf-loader.ts +13 -13
  330. package/src/las/lib/copc/parse-las.ts +1 -1
  331. package/src/las/lib/get-las-schema.ts +5 -0
  332. package/src/las/lib/las-extra-bytes.ts +6 -4
  333. package/src/las/lib/laz-perf/parse-las.ts +8 -9
  334. package/src/las/lib/laz-rs-wasm/parse-las.ts +8 -9
  335. package/src/las/lib/typescript/parse-las.ts +143 -11
  336. package/src/las/libs/laz-rs-wasm/README.md +5 -0
  337. package/src/las/libs/laz-rs-wasm/package.json +6 -0
  338. package/src/las/unbundled.ts +1 -1
  339. package/src/las/workers/las-worker.ts +6 -6
  340. package/src/las-copc-loader-types.ts +1 -0
  341. package/src/las-copc-loader.ts +1 -0
  342. package/src/las-loader-types.ts +1 -0
  343. package/src/las-loader.ts +1 -0
  344. package/src/las-writer.ts +1 -0
  345. package/src/laz-rs-loader-types.ts +1 -0
  346. package/src/laz-rs-loader.ts +1 -0
  347. package/src/lazperf-loader-types.ts +1 -0
  348. package/src/lazperf-loader.ts +1 -0
  349. package/src/pcd/bundled.ts +1 -4
  350. package/src/pcd/index.ts +0 -4
  351. package/src/pcd/pcd-loader-types.ts +10 -11
  352. package/src/pcd/pcd-loader.ts +97 -29
  353. package/src/pcd/pcd-writer.ts +12 -8
  354. package/src/pcd/unbundled.ts +1 -1
  355. package/src/pcd/workers/pcd-worker.ts +6 -6
  356. package/src/pcd-loader-types.ts +1 -0
  357. package/src/pcd-loader.ts +1 -0
  358. package/src/pcd-writer.ts +1 -0
  359. package/src/ply/bundled.ts +1 -4
  360. package/src/ply/index.ts +0 -4
  361. package/src/ply/lib/get-ply-schema.ts +1 -1
  362. package/src/ply/lib/parse-ply-arrow.ts +2 -2
  363. package/src/ply/lib/parse-ply-in-batches.ts +9 -4
  364. package/src/ply/lib/parse-ply.ts +4 -1
  365. package/src/ply/ply-loader-types.ts +10 -11
  366. package/src/ply/ply-loader.ts +94 -24
  367. package/src/ply/ply-writer.ts +12 -8
  368. package/src/ply/unbundled.ts +1 -1
  369. package/src/ply/workers/ply-worker.ts +8 -8
  370. package/src/ply-loader-types.ts +1 -0
  371. package/src/ply-loader.ts +1 -0
  372. package/src/ply-writer.ts +1 -0
@@ -2,6 +2,9 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
+ import {makeArrowMetadataBatch, updateArrowTableMetadata} from '@loaders.gl/core/schema-utils';
6
+ import * as arrow from 'apache-arrow';
7
+ import {makeMetadataFromLasHeader} from '../get-las-schema';
5
8
  import type {MeshArrowTable, MeshAttributes} from '@loaders.gl/core/schema';
6
9
  import {makeMeshArrowTable, type MeshArrowAttributes} from '@loaders.gl/core/schema-utils';
7
10
  import {
@@ -375,6 +378,7 @@ export async function* parseLASInBatches(
375
378
  let header: LASHeader | null = null;
376
379
  let sourcePointIndex = 0;
377
380
  let totalRead = 0;
381
+ let lastTable: LASArrowTable | undefined;
378
382
 
379
383
  while (true) {
380
384
  const next = await inputIterator.next();
@@ -385,6 +389,7 @@ export async function* parseLASInBatches(
385
389
  pending = concatenateUint8Arrays(pending, toUint8Array(chunk));
386
390
  if (!header) {
387
391
  header = tryParseHeader(pending, absoluteOffset);
392
+ if (header && pending.byteLength < header.pointsOffset) header = null;
388
393
  if (header) {
389
394
  header.totalToRead = header.pointsCount;
390
395
  }
@@ -393,7 +398,68 @@ export async function* parseLASInBatches(
393
398
  continue;
394
399
  }
395
400
  if (header.isCompressed) {
396
- yield* parseLAZInBatches(pending, inputIterator, header, options);
401
+ const extendedOffset = header.metadata?.evlrOffset;
402
+ let inputOffset = pending.byteLength;
403
+ const extendedChunks: Uint8Array<ArrayBufferLike>[] = [];
404
+ if (extendedOffset && extendedOffset < inputOffset) {
405
+ extendedChunks.push(pending.subarray(extendedOffset));
406
+ }
407
+ const trackedIterator: AsyncIterator<ArrayBufferLike | ArrayBufferView> = {
408
+ async next() {
409
+ const next = await inputIterator.next();
410
+ if (!next.done && extendedOffset) {
411
+ const bytes = toUint8Array(next.value);
412
+ const start = Math.max(extendedOffset - inputOffset, 0);
413
+ if (start < bytes.byteLength) extendedChunks.push(bytes.slice(start));
414
+ inputOffset += bytes.byteLength;
415
+ }
416
+ return next;
417
+ }
418
+ };
419
+ if (header.pointsCount === 0) {
420
+ const {laszip} = await readLASZipVLRFromInput(pending, trackedIterator, header);
421
+ validateTypeScriptLAZSupport(header, laszip);
422
+ lastTable = makeEmptyLASBatch(header, options);
423
+ } else {
424
+ for await (const table of parseLAZInBatches(pending, trackedIterator, header, options)) {
425
+ lastTable = updateArrowTableMetadata(
426
+ table,
427
+ makeMetadataFromLasHeader({
428
+ ...header,
429
+ totalRead: table.loaderData.totalRead,
430
+ metadata: table.loaderData.metadata || header.metadata
431
+ })
432
+ );
433
+ yield lastTable;
434
+ }
435
+ }
436
+ if (
437
+ extendedOffset &&
438
+ lastTable &&
439
+ header.metadata?.evlrCount &&
440
+ (lastTable.loaderData.metadata?.evlrs.length ?? 0) < header.metadata.evlrCount
441
+ ) {
442
+ while (!(await trackedIterator.next()).done) {
443
+ // Finish reading trailing records if the decoder stopped at its chunk table.
444
+ }
445
+ // The tracked iterator retains only the extended-record suffix.
446
+ const suffix = extendedChunks.reduce<Uint8Array<ArrayBufferLike>>(
447
+ concatenateUint8Arrays,
448
+ new Uint8Array(0)
449
+ );
450
+ const update = makeLASMetadataUpdate(
451
+ lastTable,
452
+ header,
453
+ suffix,
454
+ extendedOffset,
455
+ lastTable.loaderData.totalRead
456
+ );
457
+ if (update) {
458
+ yield update;
459
+ return;
460
+ }
461
+ }
462
+ if (header.pointsCount === 0 && lastTable) yield lastTable;
397
463
  return;
398
464
  }
399
465
 
@@ -409,7 +475,11 @@ export async function* parseLASInBatches(
409
475
  totalRead = batch.totalRead;
410
476
  pending = batch.pending;
411
477
  absoluteOffset = batch.absoluteOffset;
412
- yield parseLASArrowTableBatch(batch.arrayBuffer, batch.header, options);
478
+ lastTable = updateArrowTableMetadata(
479
+ parseLASArrowTableBatch(batch.arrayBuffer, batch.header, options),
480
+ makeMetadataFromLasHeader({...header, totalRead})
481
+ );
482
+ yield lastTable;
413
483
  }
414
484
  }
415
485
 
@@ -419,6 +489,60 @@ export async function* parseLASInBatches(
419
489
  if (totalRead < header.totalToRead) {
420
490
  throw new Error('LASLoader: truncated LAS point data');
421
491
  }
492
+ if (!lastTable) {
493
+ lastTable = makeEmptyLASBatch(header, options);
494
+ yield lastTable;
495
+ }
496
+ const update = makeLASMetadataUpdate(lastTable, header, pending, absoluteOffset, totalRead);
497
+ if (update) yield update;
498
+ }
499
+
500
+ /** Creates the declared point schema and original header metadata for a zero-point stream. */
501
+ function makeEmptyLASBatch(header: LASHeader, options: LASLoaderOptions): LASArrowTable {
502
+ const table = parseLASArrowTableBatch(new ArrayBuffer(0), {...header, pointsOffset: 0}, options);
503
+ return updateArrowTableMetadata(
504
+ {...table, loaderData: header},
505
+ makeMetadataFromLasHeader(header)
506
+ );
507
+ }
508
+
509
+ /** Builds a schema-only batch carrying late extended records and their absolute offsets. */
510
+ function makeLASMetadataUpdate(
511
+ lastTable: LASArrowTable,
512
+ header: LASHeader,
513
+ pending: Uint8Array,
514
+ absoluteOffset: number,
515
+ totalRead: number
516
+ ): LASArrowTable | undefined {
517
+ const metadata = header.metadata;
518
+ if (metadata?.evlrOffset && metadata.evlrCount) {
519
+ const relativeOffset = metadata.evlrOffset - absoluteOffset;
520
+ const records = parseLASExtendedVariableLengthRecords(
521
+ new DataView(pending.buffer, pending.byteOffset, pending.byteLength),
522
+ relativeOffset,
523
+ metadata.evlrCount
524
+ ).map(record => ({...record, offset: record.offset + absoluteOffset}));
525
+ const finalMetadata = {
526
+ ...metadata,
527
+ evlrs: records,
528
+ extraBytes: [...metadata.extraBytes],
529
+ waveformPacketDescriptors: [...metadata.waveformPacketDescriptors]
530
+ };
531
+ for (const record of records)
532
+ parseTypedLASMetadataRecord(
533
+ {...record, data: record.data || new Uint8Array()},
534
+ finalMetadata
535
+ );
536
+ resolveLASGeoTIFFKeyDirectory(finalMetadata);
537
+ const finalHeader = {...header, totalRead, metadata: finalMetadata};
538
+ if (records.length > 0) {
539
+ const data = new arrow.Table([makeArrowMetadataBatch(lastTable.data.schema)]);
540
+ return updateArrowTableMetadata(
541
+ {...lastTable, data, loaderData: finalHeader},
542
+ makeMetadataFromLasHeader(finalHeader)
543
+ );
544
+ }
545
+ }
422
546
  }
423
547
 
424
548
  /** Decode LAS data into raw point chunks. */
@@ -1017,7 +1141,7 @@ function* parseLAZChunkedIterator(
1017
1141
  if (header.pointsFormatId <= 5 || laszip.variableChunks) {
1018
1142
  yield* decodeLAZFileFromCompleteBytes(new Uint8Array(arrayBuffer), header, laszip, {
1019
1143
  ...options,
1020
- batchSize
1144
+ core: {...options.core, batchSize}
1021
1145
  });
1022
1146
  return;
1023
1147
  }
@@ -1052,7 +1176,11 @@ function* decodeLAZFileFromCompleteBytes(
1052
1176
  options: LASLoaderOptions = {}
1053
1177
  ): Iterable<LASDecodedChunk> {
1054
1178
  const batchSize = getBatchSize(options);
1055
- const outputHeader = {...header, totalToRead: header.pointsCount};
1179
+ const outputHeader = {
1180
+ ...header,
1181
+ metadata: parseLASMetadata(bytes, header),
1182
+ totalToRead: header.pointsCount
1183
+ };
1056
1184
  const state = createRawPointBatchState(
1057
1185
  batchSize,
1058
1186
  header.pointsStructSize,
@@ -1207,8 +1335,12 @@ function hasCompleteLASMetadata(arrayBuffer: ArrayBufferLike, header: LASHeader)
1207
1335
  return arrayBuffer.byteLength >= Math.max(vlrEnd, header.pointsOffset);
1208
1336
  }
1209
1337
 
1210
- function parseLASMetadata(arrayBuffer: ArrayBufferLike, header: LASHeader): LASMetadata {
1211
- const dataView = new DataView(arrayBuffer);
1338
+ function parseLASMetadata(
1339
+ arrayBuffer: ArrayBufferLike | ArrayBufferView,
1340
+ header: LASHeader
1341
+ ): LASMetadata {
1342
+ const dataView = makeDataView(arrayBuffer);
1343
+ const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);
1212
1344
  const version = header.versionAsString || '1.0';
1213
1345
  const versionParts = version.split('.').map(Number);
1214
1346
  const isAtLeast14 = versionParts[0] > 1 || (versionParts[0] === 1 && versionParts[1] >= 4);
@@ -1223,9 +1355,9 @@ function parseLASMetadata(arrayBuffer: ArrayBufferLike, header: LASHeader): LASM
1223
1355
  versionParts[0] > 1 || (versionParts[0] === 1 && versionParts[1] >= 3)
1224
1356
  ? dataView.getBigUint64(227, true)
1225
1357
  : undefined,
1226
- projectId: formatLASProjectId(new Uint8Array(arrayBuffer, 8, 16)),
1227
- systemIdentifier: readLASString(new Uint8Array(arrayBuffer), 26, 32),
1228
- generatingSoftware: readLASString(new Uint8Array(arrayBuffer), 58, 32),
1358
+ projectId: formatLASProjectId(bytes.subarray(8, 24)),
1359
+ systemIdentifier: readLASString(bytes, 26, 32),
1360
+ generatingSoftware: readLASString(bytes, 58, 32),
1229
1361
  creationDayOfYear: dataView.getUint16(90, true),
1230
1362
  creationYear: dataView.getUint16(92, true),
1231
1363
  headerSize: header.headerSize!,
@@ -1287,7 +1419,7 @@ function parseLASExtendedVariableLengthRecords(
1287
1419
  evlrOffset: number,
1288
1420
  evlrCount: number
1289
1421
  ): LASExtendedVariableLengthRecord[] {
1290
- if (!evlrOffset || !evlrCount || evlrOffset >= dataView.byteLength) {
1422
+ if (evlrOffset < 0 || !evlrCount || evlrOffset >= dataView.byteLength) {
1291
1423
  return [];
1292
1424
  }
1293
1425
  const bytes = new Uint8Array(dataView.buffer, dataView.byteOffset, dataView.byteLength);
@@ -2011,7 +2143,7 @@ function detectTwoByteColors(
2011
2143
  }
2012
2144
 
2013
2145
  function getBatchSize(options: LASLoaderOptions): number {
2014
- const batchSize = options.batchSize ?? options.core?.batchSize;
2146
+ const batchSize = options.core?.batchSize;
2015
2147
  return typeof batchSize === 'number' ? batchSize : DEFAULT_BATCH_SIZE;
2016
2148
  }
2017
2149
 
@@ -0,0 +1,5 @@
1
+ # laz-rs-wasm
2
+
3
+ WebAssembly bindings for laz-rs LAZ decompression.
4
+
5
+ Supported formats: LAS, LAZ.
@@ -15,5 +15,11 @@
15
15
  "types": "laz_rs_wasm.d.ts",
16
16
  "sideEffects": [
17
17
  "./snippets/*"
18
+ ],
19
+ "description": "WebAssembly bindings for laz-rs LAZ decompression",
20
+ "keywords": [
21
+ "loaders.gl",
22
+ "LAS",
23
+ "LAZ"
18
24
  ]
19
25
  }
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  export type {LASLoaderOptions} from './las-loader-types';
6
- export {LASLoader, LASWorkerLoader} from './las-loader-types';
6
+ export {LASLoader} from './las-loader-types';
7
7
  export {LASCOPCLoader} from './las-copc-loader-types';
8
8
  export {LAZPerfLoader} from './lazperf-loader-types';
9
9
  export {LAZRsLoader} from './laz-rs-loader-types';
@@ -3,22 +3,22 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import {createLoaderWorker} from '@loaders.gl/core/loader-utils';
6
- import {LASLoaderWithParser} from '../las-loader';
6
+ import {LASColumnLoader} from '../las-loader';
7
7
 
8
8
  createLoaderWorker({
9
- ...LASLoaderWithParser,
9
+ ...LASColumnLoader,
10
10
  /** Decodes worker output as transferable columns; caller formatting follows hydration. */
11
11
  parse(input, options) {
12
- return LASLoaderWithParser.parse(input, {
12
+ return LASColumnLoader.parse(input, {
13
13
  ...options,
14
- las: {...options?.las, shape: 'arrow-table', colorFormat: 'uint8norm'}
14
+ las: {...options?.las, shape: 'arrow', colorFormat: 'uint8norm'}
15
15
  });
16
16
  },
17
17
  /** Keeps the primary TypeScript decoder alive for the full input stream. */
18
18
  parseInBatches(input, options) {
19
- return LASLoaderWithParser.parseInBatches(input, {
19
+ return LASColumnLoader.parseInBatches(input, {
20
20
  ...options,
21
- las: {...options?.las, shape: 'arrow-table', colorFormat: 'uint8norm'}
21
+ las: {...options?.las, shape: 'arrow', colorFormat: 'uint8norm'}
22
22
  });
23
23
  }
24
24
  });
@@ -0,0 +1 @@
1
+ export * from './las/las-copc-loader-types.js';
@@ -0,0 +1 @@
1
+ export * from './las/las-copc-loader.js';
@@ -0,0 +1 @@
1
+ export * from './las/las-loader-types.js';
@@ -0,0 +1 @@
1
+ export * from './las/las-loader.js';
@@ -0,0 +1 @@
1
+ export * from './las/las-writer.js';
@@ -0,0 +1 @@
1
+ export * from './las/laz-rs-loader-types.js';
@@ -0,0 +1 @@
1
+ export * from './las/laz-rs-loader.js';
@@ -0,0 +1 @@
1
+ export * from './las/lazperf-loader-types.js';
@@ -0,0 +1 @@
1
+ export * from './las/lazperf-loader.js';
@@ -3,7 +3,4 @@
3
3
  // Copyright vis.gl contributors
4
4
 
5
5
  export type {PCDLoaderOptions} from './pcd-loader-types';
6
- export {
7
- PCDLoaderWithParser as PCDWorkerLoader,
8
- PCDLoaderWithParser as PCDLoader
9
- } from './pcd-loader';
6
+ export {PCDLoaderWithParser as PCDLoader} from './pcd-loader';
package/src/pcd/index.ts CHANGED
@@ -7,7 +7,3 @@ export {PCDFormat} from './pcd-format';
7
7
  export {PCDLoader} from './pcd-loader-types';
8
8
  export type {PCDWriterOptions} from './pcd-writer';
9
9
  export {PCDWriter} from './pcd-writer';
10
-
11
- // DEPRECATED EXPORTS
12
- /** @deprecated Use PCDLoader. */
13
- export {PCDWorkerLoader} from './pcd-loader-types';
@@ -2,11 +2,11 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
+ import type {Table, RecordBatch} from 'apache-arrow';
5
6
  import type {Loader, LoaderOptions} from '@loaders.gl/core/loader-utils';
6
- import type {MeshArrowTable, ArrowTableBatch} from '@loaders.gl/core/schema';
7
7
  import type {PCDMesh} from './lib/pcd-types';
8
8
  import {PCDFormat} from './pcd-format';
9
- import {serializeArrowWorkerTable} from '@loaders.gl/core/schema-utils/arrow-transport';
9
+ import {serializeArrowWorkerTable} from '@loaders.gl/core/arrow-worker-transport';
10
10
 
11
11
  // __VERSION__ is injected by babel-plugin-version-inline
12
12
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
@@ -15,7 +15,7 @@ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
15
15
  export type PCDLoaderOptions = LoaderOptions & {
16
16
  pcd?: {
17
17
  /** Output shape. Defaults to a Mesh Arrow table. */
18
- shape?: 'mesh' | 'arrow-table';
18
+ shape?: 'mesh' | 'arrow';
19
19
  /** Color storage format. Defaults to uint8norm for backwards compatibility. */
20
20
  colorFormat?: 'uint8norm' | 'float16' | 'float32';
21
21
  /** Override the URL to the worker bundle (by default loads from unpkg.com) */
@@ -27,7 +27,7 @@ export type PCDLoaderOptions = LoaderOptions & {
27
27
  * Preloads the parser-bearing PCD loader implementation.
28
28
  */
29
29
  async function preload() {
30
- const {PCDLoaderWithParser} = await import('@loaders.gl/pointclouds/pcd/pcd-loader');
30
+ const {PCDLoaderWithParser} = await import('@loaders.gl/pointclouds/pcd-loader');
31
31
  return PCDLoaderWithParser;
32
32
  }
33
33
 
@@ -35,19 +35,18 @@ async function preload() {
35
35
  * Metadata-only worker loader for PCD - Point Cloud Data
36
36
  */
37
37
  export const PCDLoader = {
38
+ defaultShape: 'arrow',
39
+ supportsNativeArrow: true,
38
40
  ...PCDFormat,
39
- dataType: null as unknown as PCDMesh | MeshArrowTable,
40
- batchType: null as unknown as PCDMesh | ArrowTableBatch,
41
+ dataType: null as unknown as PCDMesh | Table,
42
+ batchType: null as unknown as PCDMesh | RecordBatch,
41
43
  version: VERSION,
42
44
  worker: true,
43
45
  /** Enables the stateful input/output batch protocol on the built-in worker. */
44
46
  workerInBatches: true,
45
47
  serializeWorkerResult: serializeArrowWorkerTable,
46
48
  options: {
47
- pcd: {shape: 'arrow-table', colorFormat: 'uint8norm'}
49
+ pcd: {shape: 'arrow', colorFormat: 'uint8norm'}
48
50
  },
49
51
  preload
50
- } as const satisfies Loader<PCDMesh | MeshArrowTable, PCDMesh | ArrowTableBatch, PCDLoaderOptions>;
51
-
52
- /** @deprecated Use PCDLoader. */
53
- export const PCDWorkerLoader = PCDLoader;
52
+ } as const satisfies Loader<PCDMesh | Table, PCDMesh | RecordBatch, PCDLoaderOptions>;
@@ -2,6 +2,8 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
+ import {refineArrowTableBatches, makeArrowMetadataBatch} from '@loaders.gl/core/schema-utils';
6
+ import type {Table, RecordBatch} from 'apache-arrow';
5
7
  import type {PCDLoaderOptions} from './pcd-loader-types';
6
8
 
7
9
  import {
@@ -13,8 +15,8 @@ import type {ArrowTableBatch, MeshArrowTable} from '@loaders.gl/core/schema';
13
15
  import {
14
16
  deserializeArrowWorkerTable,
15
17
  serializeArrowWorkerTable
16
- } from '@loaders.gl/core/schema-utils/arrow-transport';
17
- import {convertMeshToTable, convertTableToMesh} from '@loaders.gl/core/schema-utils';
18
+ } from '@loaders.gl/core/arrow-worker-transport';
19
+ import {convertMeshToArrowTableWrapper, convertTableToMesh} from '@loaders.gl/core/schema-utils';
18
20
  import type {PCDMesh} from './lib/pcd-types';
19
21
  import {parsePCD, parsePCDHeader} from './lib/parse-pcd';
20
22
  import {PCDLoader as PCDLoaderMetadata} from './pcd-loader-types';
@@ -24,7 +26,7 @@ const {preload: _PCDLoaderPreload, ...PCDLoaderMetadataWithoutPreload} = PCDLoad
24
26
  type PCDParsedBatch = PCDMesh | ArrowTableBatch;
25
27
 
26
28
  function convertPCDMesh(mesh: PCDMesh, options?: PCDLoaderOptions): PCDMesh | MeshArrowTable {
27
- const table = convertMeshToTable(mesh, 'arrow-table');
29
+ const table = convertMeshToArrowTableWrapper(mesh);
28
30
  return options?.pcd?.shape === 'mesh'
29
31
  ? convertPCDTableToMesh(table, mesh)
30
32
  : {...table, loader: mesh.loader, loaderData: mesh.loaderData};
@@ -33,33 +35,14 @@ function convertPCDMesh(mesh: PCDMesh, options?: PCDLoaderOptions): PCDMesh | Me
33
35
  /**
34
36
  * Loader for PCD - Point Cloud Data
35
37
  */
36
- export const PCDLoaderWithParser = {
38
+ export const PCDColumnLoader = {
37
39
  ...PCDLoaderMetadataWithoutPreload,
40
+ dataType: null as unknown as PCDMesh | MeshArrowTable,
41
+ batchType: null as unknown as PCDMesh | ArrowTableBatch,
38
42
  parse: async (arrayBuffer, options) => convertPCDMesh(parsePCD(arrayBuffer, options), options),
39
43
  parseSync: (arrayBuffer, options) => convertPCDMesh(parsePCD(arrayBuffer, options), options),
40
- parseInBatches: async function* (
41
- arrayBuffer:
42
- | AsyncIterable<ArrayBufferLike | ArrayBufferView>
43
- | Iterable<ArrayBufferLike | ArrayBufferView>,
44
- options
45
- ): AsyncIterable<PCDParsedBatch> {
46
- const batchSize = getNumericBatchSize(options);
47
- const data = await concatenateArrayBuffersAsync(arrayBuffer);
48
- const textData = new TextDecoder().decode(data);
49
- const pcdHeader = parsePCDHeader(textData);
50
-
51
- if (pcdHeader.data === 'ascii') {
52
- yield* parsePCDASCIIInBatches(data, options, batchSize);
53
- return;
54
- }
55
-
56
- if (pcdHeader.data === 'binary') {
57
- yield* parsePCDBinaryInBatches(data, options, batchSize);
58
- return;
59
- }
60
-
61
- yield makePCDBatch(parsePCD(data, options), options);
62
- },
44
+ parseInBatches: (input, options) =>
45
+ refineArrowTableBatches(parsePCDWithMetadataInBatches(input, options)),
63
46
  serializeWorkerResult: serializeArrowWorkerTable,
64
47
  deserializeWorkerResult: deserializePCDWorkerResult,
65
48
  serializeWorkerBatch: serializeArrowWorkerTable,
@@ -68,7 +51,7 @@ export const PCDLoaderWithParser = {
68
51
 
69
52
  /** Returns a numeric batch size when batching has an explicit row count. */
70
53
  function getNumericBatchSize(options?: PCDLoaderOptions): number | undefined {
71
- const batchSize = options?.batchSize ?? options?.core?.batchSize;
54
+ const batchSize = options?.core?.batchSize;
72
55
  return typeof batchSize === 'number' ? batchSize : undefined;
73
56
  }
74
57
 
@@ -118,7 +101,7 @@ function* parsePCDBinaryInBatches(
118
101
  }
119
102
 
120
103
  function makePCDBatch(mesh: PCDMesh, options?: PCDLoaderOptions): PCDParsedBatch {
121
- const table = convertMeshToTable(mesh, 'arrow-table');
104
+ const table = convertMeshToArrowTableWrapper(mesh);
122
105
  if (options?.pcd?.shape === 'mesh') {
123
106
  return convertPCDTableToMesh(table, mesh);
124
107
  }
@@ -177,3 +160,88 @@ function deserializePCDWorkerResult(
177
160
  function deserializePCDWorkerBatch(result: unknown, options?: PCDLoaderOptions): PCDParsedBatch {
178
161
  return deserializePCDWorkerResult(result, options) as PCDParsedBatch;
179
162
  }
163
+
164
+ /** Parses PCD batches before shared cumulative metadata refinement. */
165
+ async function* parsePCDWithMetadataInBatches(
166
+ arrayBuffer:
167
+ | AsyncIterable<ArrayBufferLike | ArrayBufferView>
168
+ | Iterable<ArrayBufferLike | ArrayBufferView>,
169
+ options?: PCDLoaderOptions
170
+ ): AsyncIterable<PCDParsedBatch> {
171
+ const batchSize = getNumericBatchSize(options);
172
+ const data = await concatenateArrayBuffersAsync(arrayBuffer);
173
+ const textData = new TextDecoder().decode(data);
174
+ const pcdHeader = parsePCDHeader(textData);
175
+
176
+ if (pcdHeader.data === 'ascii') {
177
+ yield* parsePCDASCIIInBatches(data, options, batchSize);
178
+ return;
179
+ }
180
+
181
+ if (pcdHeader.data === 'binary') {
182
+ yield* parsePCDBinaryInBatches(data, options, batchSize);
183
+ return;
184
+ }
185
+
186
+ yield makePCDBatch(parsePCD(data, options), options);
187
+ }
188
+
189
+ /** Exposes native Arrow output while retaining the worker's column protocol. */
190
+ export const PCDLoaderWithParser = {
191
+ ...PCDColumnLoader,
192
+ dataType: PCDLoaderMetadata.dataType,
193
+ batchType: PCDLoaderMetadata.batchType,
194
+ parse: async (input: ArrayBuffer, options?: PCDLoaderOptions) =>
195
+ unwrapPCDTable(await PCDColumnLoader.parse(input, options)),
196
+ parseSync: (input: ArrayBuffer, options?: PCDLoaderOptions) =>
197
+ unwrapPCDTable(PCDColumnLoader.parseSync(input, options)),
198
+ async *parseInBatches(input, options) {
199
+ for await (const batch of PCDColumnLoader.parseInBatches(input, options)) {
200
+ if (isColumnBatch(batch)) {
201
+ batch.data.schema.metadata.set(
202
+ 'loaders.gl.pcd.header',
203
+ JSON.stringify((batch as ArrowTableBatch & {loaderData?: unknown}).loaderData)
204
+ );
205
+ for (const recordBatch of batch.data.batches) {
206
+ recordBatch.schema.metadata.set(
207
+ 'loaders.gl.pcd.header',
208
+ batch.data.schema.metadata.get('loaders.gl.pcd.header')!
209
+ );
210
+ }
211
+ if (batch.data.batches.length) yield* batch.data.batches;
212
+ else yield makeArrowMetadataBatch(batch.data.schema);
213
+ } else yield batch;
214
+ }
215
+ },
216
+ deserializeWorkerResult: (result: unknown, options?: PCDLoaderOptions) =>
217
+ unwrapPCDTable(PCDColumnLoader.deserializeWorkerResult(result, options)),
218
+ deserializeWorkerBatch(result: unknown, options?: PCDLoaderOptions) {
219
+ const batch = PCDColumnLoader.deserializeWorkerBatch(result, options);
220
+ if (isColumnBatch(batch)) {
221
+ const recordBatch = batch.data.batches[0] ?? makeArrowMetadataBatch(batch.data.schema);
222
+ recordBatch.schema.metadata.set(
223
+ 'loaders.gl.pcd.header',
224
+ JSON.stringify((batch as ArrowTableBatch & {loaderData?: unknown}).loaderData)
225
+ );
226
+ return recordBatch;
227
+ }
228
+ return batch;
229
+ }
230
+ } as const satisfies LoaderWithParser<PCDMesh | Table, PCDMesh | RecordBatch, PCDLoaderOptions>;
231
+
232
+ /** Returns the Arrow table with its file metadata or the requested mesh. */
233
+ function unwrapPCDTable(result: PCDMesh | MeshArrowTable): PCDMesh | Table {
234
+ if ('shape' in result && result.shape === 'arrow-table') {
235
+ result.data.schema.metadata.set(
236
+ 'loaders.gl.pcd.header',
237
+ JSON.stringify((result as MeshArrowTable & {loaderData?: unknown}).loaderData)
238
+ );
239
+ return result.data;
240
+ }
241
+ return result as PCDMesh;
242
+ }
243
+
244
+ /** Identifies the private Arrow batch envelope. */
245
+ function isColumnBatch(batch: PCDMesh | ArrowTableBatch): batch is ArrowTableBatch {
246
+ return 'shape' in batch && batch.shape === 'arrow-table';
247
+ }
@@ -2,9 +2,10 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
+ import type {Table} from 'apache-arrow';
5
6
  import type {WriterOptions, WriterWithEncoder} from '@loaders.gl/core/loader-utils';
6
7
  import type {Mesh, MeshArrowTable, MeshAttribute} from '@loaders.gl/core/schema';
7
- import {convertMeshToTable, convertTableToMesh} from '@loaders.gl/core/schema-utils';
8
+ import {convertMeshToArrowTableWrapper, convertTableToMesh} from '@loaders.gl/core/schema-utils';
8
9
  import {PCDFormat} from './pcd-format';
9
10
 
10
11
  // __VERSION__ is injected by babel-plugin-version-inline
@@ -22,7 +23,7 @@ export type PCDWriterOptions = WriterOptions & {
22
23
  */
23
24
  export const PCDWriter = {
24
25
  ...PCDFormat,
25
- dataType: null as unknown as Mesh | MeshArrowTable,
26
+ dataType: null as unknown as Mesh | MeshArrowTable | Table,
26
27
  batchType: null as never,
27
28
  version: VERSION,
28
29
  options: {
@@ -32,16 +33,19 @@ export const PCDWriter = {
32
33
  encode: async (data, options) => encodePCDSync(data, options),
33
34
  encodeSync: encodePCDSync,
34
35
  encodeTextSync: encodePCD
35
- } as const satisfies WriterWithEncoder<Mesh | MeshArrowTable, never, PCDWriterOptions>;
36
+ } as const satisfies WriterWithEncoder<Mesh | MeshArrowTable | Table, never, PCDWriterOptions>;
36
37
 
37
38
  /** Encode mesh category data as PCD bytes. */
38
- function encodePCDSync(data: Mesh | MeshArrowTable, options?: PCDWriterOptions): ArrayBuffer {
39
+ function encodePCDSync(
40
+ data: Mesh | MeshArrowTable | Table,
41
+ options?: PCDWriterOptions
42
+ ): ArrayBuffer {
39
43
  const text = encodePCD(data, options);
40
44
  return new TextEncoder().encode(text).buffer;
41
45
  }
42
46
 
43
47
  /** Encode mesh category data as ASCII PCD text. */
44
- function encodePCD(data: Mesh | MeshArrowTable, options?: PCDWriterOptions): string {
48
+ function encodePCD(data: Mesh | MeshArrowTable | Table, options?: PCDWriterOptions): string {
45
49
  const mesh = convertTableToMesh(normalizeMeshArrowTable(data));
46
50
  const positionAttribute = getRequiredAttribute(mesh, 'POSITION');
47
51
  const normalAttribute = mesh.attributes.NORMAL;
@@ -106,11 +110,11 @@ function encodePCD(data: Mesh | MeshArrowTable, options?: PCDWriterOptions): str
106
110
  }
107
111
 
108
112
  /** Return mesh data as a MeshArrowTable, converting plain Mesh data first. */
109
- function normalizeMeshArrowTable(data: Mesh | MeshArrowTable): MeshArrowTable {
110
- if ('shape' in data && data.shape === 'arrow-table') {
113
+ function normalizeMeshArrowTable(data: Mesh | MeshArrowTable | Table): MeshArrowTable | Table {
114
+ if (!('attributes' in data)) {
111
115
  return data;
112
116
  }
113
- return convertMeshToTable(data as Mesh, 'arrow-table');
117
+ return convertMeshToArrowTableWrapper(data as Mesh);
114
118
  }
115
119
 
116
120
  /** Return a required mesh attribute or throw a format-specific error. */
@@ -3,4 +3,4 @@
3
3
  // Copyright vis.gl contributors
4
4
 
5
5
  export type {PCDLoaderOptions} from './pcd-loader-types';
6
- export {PCDWorkerLoader, PCDLoader} from './pcd-loader-types';
6
+ export {PCDLoader} from './pcd-loader-types';
@@ -3,22 +3,22 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import {createLoaderWorker} from '@loaders.gl/core/loader-utils';
6
- import {PCDLoaderWithParser} from '../pcd-loader';
6
+ import {PCDColumnLoader} from '../pcd-loader';
7
7
 
8
8
  createLoaderWorker({
9
- ...PCDLoaderWithParser,
9
+ ...PCDColumnLoader,
10
10
  /** Always returns columnar data; legacy mesh conversion runs on the caller. */
11
11
  parse(input, options) {
12
- return PCDLoaderWithParser.parse(input, {
12
+ return PCDColumnLoader.parse(input, {
13
13
  ...options,
14
- pcd: {...options?.pcd, shape: 'arrow-table'}
14
+ pcd: {...options?.pcd, shape: 'arrow'}
15
15
  });
16
16
  },
17
17
  /** Keeps one columnar parser alive for the entire worker input stream. */
18
18
  parseInBatches(input, options) {
19
- return PCDLoaderWithParser.parseInBatches(input, {
19
+ return PCDColumnLoader.parseInBatches(input, {
20
20
  ...options,
21
- pcd: {...options?.pcd, shape: 'arrow-table'}
21
+ pcd: {...options?.pcd, shape: 'arrow'}
22
22
  });
23
23
  }
24
24
  });