@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0

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 (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,381 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** The number of offset arrays of each geometry type */
4
+ const OFFSET_LEVELS = {
5
+ Point: 0,
6
+ LineString: 1,
7
+ MultiPoint: 1,
8
+ Polygon: 2,
9
+ MultiLineString: 2,
10
+ MultiPolygon: 3,
11
+ };
12
+ /** The initial number of rows when no capacity is given */
13
+ const DEFAULT_CAPACITY = 64;
14
+ /** A Float64Array that grows as values are pushed */
15
+ class GrowingFloat64 {
16
+ constructor(capacity) {
17
+ Object.defineProperty(this, "data", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ Object.defineProperty(this, "length", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: 0
28
+ });
29
+ this.data = new Float64Array(Math.max(4, capacity));
30
+ }
31
+ push2(a, b) {
32
+ if (this.length + 2 > this.data.length) {
33
+ const next = new Float64Array(Math.max(this.data.length * 2, this.length + 2));
34
+ next.set(this.data);
35
+ this.data = next;
36
+ }
37
+ this.data[this.length++] = a;
38
+ this.data[this.length++] = b;
39
+ }
40
+ /** A copy of exactly the pushed values */
41
+ finish() {
42
+ return this.data.slice(0, this.length);
43
+ }
44
+ }
45
+ /** An Int32Array that grows as values are pushed */
46
+ class GrowingInt32 {
47
+ constructor(capacity) {
48
+ Object.defineProperty(this, "data", {
49
+ enumerable: true,
50
+ configurable: true,
51
+ writable: true,
52
+ value: void 0
53
+ });
54
+ Object.defineProperty(this, "length", {
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true,
58
+ value: 0
59
+ });
60
+ this.data = new Int32Array(Math.max(4, capacity));
61
+ }
62
+ push(value) {
63
+ if (this.length + 1 > this.data.length) {
64
+ const next = new Int32Array(this.data.length * 2);
65
+ next.set(this.data);
66
+ this.data = next;
67
+ }
68
+ this.data[this.length++] = value;
69
+ }
70
+ get(index) {
71
+ return this.data[index];
72
+ }
73
+ /** The last value pushed */
74
+ last() {
75
+ return this.data[this.length - 1];
76
+ }
77
+ /** A copy of exactly the pushed values */
78
+ finish() {
79
+ return this.data.slice(0, this.length);
80
+ }
81
+ }
82
+ /** The geometry column of one geometry type, collected row by row */
83
+ class GeometryColumnBuilder {
84
+ constructor(type, capacity) {
85
+ Object.defineProperty(this, "type", {
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true,
89
+ value: type
90
+ });
91
+ /** The number of rows collected */
92
+ Object.defineProperty(this, "rows", {
93
+ enumerable: true,
94
+ configurable: true,
95
+ writable: true,
96
+ value: 0
97
+ });
98
+ Object.defineProperty(this, "coords", {
99
+ enumerable: true,
100
+ configurable: true,
101
+ writable: true,
102
+ value: void 0
103
+ });
104
+ /** The offset arrays, outermost first; each starts with 0 */
105
+ Object.defineProperty(this, "offsets", {
106
+ enumerable: true,
107
+ configurable: true,
108
+ writable: true,
109
+ value: []
110
+ });
111
+ this.coords = new GrowingFloat64(capacity * 2);
112
+ for (let level = 0; level < OFFSET_LEVELS[type]; level++) {
113
+ const offsets = new GrowingInt32(capacity + 1);
114
+ offsets.push(0);
115
+ this.offsets.push(offsets);
116
+ }
117
+ }
118
+ /** The number of coordinates collected */
119
+ get vertexCount() {
120
+ return this.coords.length / 2;
121
+ }
122
+ pushPositions(positions) {
123
+ for (const position of positions)
124
+ this.coords.push2(position[0], position[1]);
125
+ }
126
+ /** Closes an element of an offset level at the current end of the level below it */
127
+ close(level) {
128
+ const below = level + 1 < this.offsets.length ? this.offsets[level + 1].length - 1 : null;
129
+ this.offsets[level].push(below ?? this.vertexCount);
130
+ }
131
+ /** Adds the coordinates of one row, shaped as for the type of the column */
132
+ add(coordinates) {
133
+ switch (this.type) {
134
+ case 'Point': {
135
+ const position = coordinates;
136
+ this.coords.push2(position[0], position[1]);
137
+ break;
138
+ }
139
+ case 'LineString':
140
+ case 'MultiPoint':
141
+ this.pushPositions(coordinates);
142
+ this.close(0);
143
+ break;
144
+ case 'Polygon':
145
+ case 'MultiLineString':
146
+ for (const ring of coordinates) {
147
+ this.pushPositions(ring);
148
+ this.close(1);
149
+ }
150
+ this.close(0);
151
+ break;
152
+ case 'MultiPolygon':
153
+ for (const polygon of coordinates) {
154
+ for (const ring of polygon) {
155
+ this.pushPositions(ring);
156
+ this.close(2);
157
+ }
158
+ this.close(1);
159
+ }
160
+ this.close(0);
161
+ break;
162
+ }
163
+ this.rows++;
164
+ }
165
+ /** The column as collected: one row per row added */
166
+ finish() {
167
+ const geometry = { type: this.type, coords: this.coords.finish() };
168
+ if (this.offsets.length > 0)
169
+ geometry.offsets = this.offsets.map((o) => o.finish());
170
+ return geometry;
171
+ }
172
+ /**
173
+ * The column spread over the rows of the table, with an empty run (NaN coordinates for a
174
+ * Point) for every row without a geometry
175
+ *
176
+ * @param childOf The child of every row of the table (negative for a row without a geometry)
177
+ * @param length The number of rows of the table
178
+ */
179
+ finishSpread(childOf, length) {
180
+ if (this.type === 'Point') {
181
+ const source = this.coords.finish();
182
+ const coords = new Float64Array(length * 2);
183
+ let k = 0;
184
+ for (let row = 0; row < length; row++) {
185
+ if (childOf[row] < 0) {
186
+ coords[row * 2] = Number.NaN;
187
+ coords[row * 2 + 1] = Number.NaN;
188
+ }
189
+ else {
190
+ coords[row * 2] = source[k * 2];
191
+ coords[row * 2 + 1] = source[k * 2 + 1];
192
+ k++;
193
+ }
194
+ }
195
+ return { type: 'Point', coords };
196
+ }
197
+ const outer = this.offsets[0];
198
+ const first = new Int32Array(length + 1);
199
+ let k = 0;
200
+ for (let row = 0; row < length; row++) {
201
+ if (childOf[row] >= 0)
202
+ k++;
203
+ first[row + 1] = outer.get(k);
204
+ }
205
+ return {
206
+ type: this.type,
207
+ coords: this.coords.finish(),
208
+ offsets: [first, ...this.offsets.slice(1).map((o) => o.finish())],
209
+ };
210
+ }
211
+ }
212
+ /** Whether a GeoJSON geometry type is one a table holds */
213
+ function isTableGeometryType(type) {
214
+ return type in OFFSET_LEVELS;
215
+ }
216
+ /**
217
+ * Creates a builder that makes a table from rows added one at a time.
218
+ *
219
+ * The coordinates are collected into growing typed arrays in the layout of GeoArrow. When every
220
+ * row has the same geometry type the table has one geometry column of that type; otherwise it
221
+ * has a mixed geometry column. An attribute whose values are all numbers (or null) becomes a
222
+ * `Float64Array` with NaN for null; any other attribute becomes a plain array.
223
+ *
224
+ * @param options `geometryType` fixes the geometry type of every row (a geometry of another
225
+ * type throws), and gives the type of a table without any geometry. `capacity` is the
226
+ * expected number of rows, to size the arrays from the start. `columns` limits the attributes
227
+ * that become columns to these names (every one is created, even if no row has it)
228
+ * @returns A new builder
229
+ */
230
+ export function createTableBuilder(options) {
231
+ const fixedType = options?.geometryType;
232
+ const capacity = Math.max(1, Math.floor(options?.capacity ?? DEFAULT_CAPACITY));
233
+ const fixedColumns = options?.columns !== undefined;
234
+ let length = 0;
235
+ let finished = false;
236
+ /** The child of every row (-1 for a row without a geometry) */
237
+ let childOf = new Int8Array(capacity);
238
+ /** The row within its child of every row */
239
+ let childRow = new Int32Array(capacity);
240
+ const children = [];
241
+ const childByType = new Map();
242
+ const columns = new Map();
243
+ for (const name of options?.columns ?? [])
244
+ columns.set(name, { values: [], numeric: true });
245
+ let ids = null;
246
+ const ensureRowCapacity = () => {
247
+ if (length < childOf.length)
248
+ return;
249
+ const nextOf = new Int8Array(childOf.length * 2);
250
+ nextOf.set(childOf);
251
+ childOf = nextOf;
252
+ const nextRow = new Int32Array(childRow.length * 2);
253
+ nextRow.set(childRow);
254
+ childRow = nextRow;
255
+ };
256
+ const childFor = (type) => {
257
+ let child = childByType.get(type);
258
+ if (child === undefined) {
259
+ child = children.length;
260
+ children.push(new GeometryColumnBuilder(type, capacity));
261
+ childByType.set(type, child);
262
+ }
263
+ return child;
264
+ };
265
+ const checkOpen = () => {
266
+ if (finished)
267
+ throw new Error('TableBuilder: finish was already called');
268
+ };
269
+ const add = (geometry, properties, id) => {
270
+ checkOpen();
271
+ ensureRowCapacity();
272
+ const row = length;
273
+ let child = -1;
274
+ if (geometry && isTableGeometryType(geometry.type)) {
275
+ if (fixedType !== undefined && geometry.type !== fixedType) {
276
+ throw new TypeError(`TableBuilder: row ${row} is a ${geometry.type}, but the table holds ${fixedType}`);
277
+ }
278
+ child = childFor(geometry.type);
279
+ childRow[row] = children[child].rows;
280
+ children[child].add(geometry.coordinates);
281
+ }
282
+ childOf[row] = child;
283
+ if (properties) {
284
+ for (const name of Object.keys(properties)) {
285
+ let column = columns.get(name);
286
+ if (!column) {
287
+ if (fixedColumns)
288
+ continue;
289
+ column = { values: new Array(row).fill(null), numeric: true };
290
+ columns.set(name, column);
291
+ }
292
+ const value = properties[name] ?? null;
293
+ if (value !== null && typeof value !== 'number')
294
+ column.numeric = false;
295
+ column.values.push(value);
296
+ }
297
+ }
298
+ for (const column of columns.values()) {
299
+ if (column.values.length === row)
300
+ column.values.push(null);
301
+ }
302
+ if (id !== undefined && ids === null)
303
+ ids = Array.from({ length: row }, (_, i) => i);
304
+ if (ids !== null)
305
+ ids.push(id ?? row);
306
+ length++;
307
+ };
308
+ const finish = () => {
309
+ checkOpen();
310
+ finished = true;
311
+ const types = childOf.slice(0, length);
312
+ let geometry;
313
+ if (children.length === 0) {
314
+ geometry = emptyGeometry(fixedType ?? 'Point', length);
315
+ }
316
+ else if (children.length === 1) {
317
+ const only = children[0];
318
+ geometry = only.rows === length ? only.finish() : only.finishSpread(types, length);
319
+ }
320
+ else {
321
+ const offsets = childRow.slice(0, length);
322
+ for (let row = 0; row < length; row++)
323
+ if (types[row] < 0)
324
+ offsets[row] = 0;
325
+ geometry = {
326
+ type: 'Mixed',
327
+ types,
328
+ offsets,
329
+ children: children.map((child) => child.finish()),
330
+ };
331
+ }
332
+ const table = { length, geometry, columns: {} };
333
+ const out = table.columns;
334
+ for (const [name, column] of columns) {
335
+ out[name] = column.numeric
336
+ ? Float64Array.from(column.values, (value) => value === null ? Number.NaN : value)
337
+ : column.values;
338
+ }
339
+ if (ids !== null)
340
+ table.ids = ids;
341
+ return table;
342
+ };
343
+ return { add, finish };
344
+ }
345
+ /** A geometry column of one type whose rows all have no geometry */
346
+ function emptyGeometry(type, length) {
347
+ if (type === 'Point') {
348
+ return { type, coords: new Float64Array(length * 2).fill(Number.NaN) };
349
+ }
350
+ const levels = OFFSET_LEVELS[type];
351
+ const offsets = [new Int32Array(length + 1)];
352
+ for (let level = 1; level < levels; level++)
353
+ offsets.push(new Int32Array(1));
354
+ return { type, coords: new Float64Array(0), offsets };
355
+ }
356
+ /**
357
+ * Makes a table from an array of GeoJSON features.
358
+ *
359
+ * It is {@link createTableBuilder} with one `add` per feature: the geometry, the properties and
360
+ * the id of each feature become a row. Rows of different geometry types give a mixed geometry
361
+ * column.
362
+ *
363
+ * @param features The features, in row order
364
+ * @param options `columns` limits the properties that become columns to these names
365
+ * @returns The table
366
+ *
367
+ * @example
368
+ * ```ts
369
+ * import { tableFromFeatures } from '@sakuzu/maplibre-gl-draw/table';
370
+ *
371
+ * const table = tableFromFeatures(collection.features, { columns: ['name', 'visitors'] });
372
+ * draw.datasets.add({ id: 'places', table });
373
+ * ```
374
+ */
375
+ export function tableFromFeatures(features, options) {
376
+ const builder = createTableBuilder({ capacity: features.length, columns: options?.columns });
377
+ for (const feature of features) {
378
+ builder.add(feature.geometry, feature.properties, feature.id);
379
+ }
380
+ return builder.finish();
381
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Read a large table in a Worker and put it on the map.
3
+ *
4
+ * Use it when the data has hundreds of thousands of rows or more and comes from a file: read
5
+ * and prepare it in a Worker, and the main thread only receives it and passes it to
6
+ * `draw.datasets.add`. For a few thousand rows, passing an array of features as `rows` is
7
+ * simpler. It depends on neither maplibre nor WebGL nor the DOM, so a Worker can import it
8
+ * without pulling in the engine.
9
+ *
10
+ * ```ts
11
+ * // worker.ts
12
+ * import {
13
+ * tableFromFeatures, prepareTable, transferList,
14
+ * } from '@sakuzu/maplibre-gl-draw/table';
15
+ *
16
+ * const features = await readGeoJSON(url); // read it any way you like
17
+ * const prepared = prepareTable(tableFromFeatures(features));
18
+ * self.postMessage(prepared, { transfer: transferList(prepared) });
19
+ *
20
+ * // main.ts
21
+ * worker.onmessage = (e) =>
22
+ * draw.datasets.add({ id: 'places', table: e.data });
23
+ * ```
24
+ *
25
+ * Read next: the guide
26
+ * [showing large data](https://sakuzu.github.io/maplibre-gl-draw/guides/large-data). The
27
+ * functions used most are {@link tableFromFeatures}, {@link createTableBuilder},
28
+ * {@link prepareTable} and {@link transferList}.
29
+ *
30
+ * @module table
31
+ */
32
+ export type { TableBuilder } from './builder.js';
33
+ export { createTableBuilder, tableFromFeatures } from './builder.js';
34
+ export type { Table } from './types.js';
35
+ export { prepareTable, transferList } from './prepare.js';
36
+ export type { PreparedTable } from './types.js';
37
+ export type { Column, DictionaryColumn, GeometryType, TableGeometry, TableMixedGeometry, } from './types.js';
@@ -0,0 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export { createTableBuilder, tableFromFeatures } from './builder.js';
4
+ // Prepare in a Worker
5
+ export { prepareTable, transferList } from './prepare.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -6,7 +6,7 @@
6
6
  * The rows are ordered along a Hilbert curve of the centers of their bboxes and grouped bottom up
7
7
  * into nodes of a fixed size. The whole tree is three typed arrays, so it is built in one pass
8
8
  * without an object per row, and it can be built in a Worker and sent to the main thread without
9
- * a copy (`prepareDatasetColumnar`). The contents of a dataset are replaced as a
9
+ * a copy (`prepareTable`). The contents of a dataset are replaced as a
10
10
  * whole, so a tree that cannot be updated in place is enough.
11
11
  *
12
12
  * A pure module: it depends on nothing.
@@ -0,0 +1 @@
1
+ export {};
@@ -4,9 +4,9 @@
4
4
  * The splitting of the rows of a dataset into spatial chunks
5
5
  *
6
6
  * A pure function over typed arrays: it depends on neither the features, nor maplibre, nor
7
- * WebGL, so it runs in a Worker as well (`prepareDatasetColumnar` calls it there). Both kinds of
8
- * contents use it: the features (`chunk.ts` computes the per-row arrays from them) and the
9
- * columnar input (`columnar/prepare.ts`).
7
+ * WebGL, so it runs in a Worker as well (`prepareTable` calls it there). Both kinds of contents
8
+ * use it: the features (`dataset/chunk.ts` computes the per-row arrays from them) and the tables
9
+ * (`prepare.ts`).
10
10
  *
11
11
  * The rule: the rows are cut in half at the median of the centers of their bboxes (the way a k-d
12
12
  * tree is built) until a range holds at most the target number of rows and the target number of
@@ -0,0 +1,44 @@
1
+ import type { PreparedTable, Table } from './types.js';
2
+ /**
3
+ * Computes the bboxes, the spatial chunks and the spatial index of a table, and returns them
4
+ * with the table.
5
+ *
6
+ * It is the work that the dataset would otherwise do on the main thread when it is given the
7
+ * table. Call it where the table is read (in a Worker), send the result to the main thread and
8
+ * pass it as `table` to `draw.datasets.add` or to `Dataset.setTable`. It uses neither maplibre nor
9
+ * WebGL, so it runs in any Worker.
10
+ *
11
+ * @param table The table
12
+ * @returns The table with its prepared arrays, which belong to this table only
13
+ * @throws when the shape of the table does not add up (the same checks as `Dataset.setTable`)
14
+ *
15
+ * @example In a Worker
16
+ * ```ts
17
+ * import { prepareTable, transferList } from '@sakuzu/maplibre-gl-draw/table';
18
+ *
19
+ * self.onmessage = async (event) => {
20
+ * const table = await readTable(event.data); // your reader, which returns a Table
21
+ * const prepared = prepareTable(table);
22
+ * self.postMessage(prepared, { transfer: transferList(prepared) });
23
+ * };
24
+ * ```
25
+ */
26
+ export declare function prepareTable(table: Table): PreparedTable;
27
+ /**
28
+ * Lists the buffers of a table, or of a prepared table, for the transfer list of `postMessage`.
29
+ *
30
+ * The buffers move to the other thread without a copy. The geometry arrays of every child of a
31
+ * mixed geometry column are listed too, and for a prepared table the prepared arrays as well.
32
+ * Each buffer appears once, even when several arrays share it. A `SharedArrayBuffer` is left
33
+ * out (it is shared, not moved). After the transfer the arrays are empty on the sending side.
34
+ *
35
+ * @param table The table, or the result of {@link prepareTable}
36
+ * @returns The buffers to pass as the transfer list
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const prepared = prepareTable(tableFromFeatures(features));
41
+ * self.postMessage(prepared, { transfer: transferList(prepared) });
42
+ * ```
43
+ */
44
+ export declare function transferList(table: Table | PreparedTable): ArrayBuffer[];
@@ -0,0 +1,136 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { buildPackedRTree } from './packed-rtree.js';
4
+ import { partitionRows } from './partition.js';
5
+ import { isDictionaryColumn, TableReader } from './table.js';
6
+ /**
7
+ * Computes the bboxes, the spatial chunks and the spatial index of a table, and returns them
8
+ * with the table.
9
+ *
10
+ * It is the work that the dataset would otherwise do on the main thread when it is given the
11
+ * table. Call it where the table is read (in a Worker), send the result to the main thread and
12
+ * pass it as `table` to `draw.datasets.add` or to `Dataset.setTable`. It uses neither maplibre nor
13
+ * WebGL, so it runs in any Worker.
14
+ *
15
+ * @param table The table
16
+ * @returns The table with its prepared arrays, which belong to this table only
17
+ * @throws when the shape of the table does not add up (the same checks as `Dataset.setTable`)
18
+ *
19
+ * @example In a Worker
20
+ * ```ts
21
+ * import { prepareTable, transferList } from '@sakuzu/maplibre-gl-draw/table';
22
+ *
23
+ * self.onmessage = async (event) => {
24
+ * const table = await readTable(event.data); // your reader, which returns a Table
25
+ * const prepared = prepareTable(table);
26
+ * self.postMessage(prepared, { transfer: transferList(prepared) });
27
+ * };
28
+ * ```
29
+ */
30
+ export function prepareTable(table) {
31
+ const reader = new TableReader(table);
32
+ const rowBounds = reader.computeBounds();
33
+ const chunks = partitionRows(rowBounds, reader.computeVertexCounts());
34
+ const index = buildPackedRTree(rowBounds);
35
+ return {
36
+ table,
37
+ length: reader.length,
38
+ bounds: extentOf(rowBounds),
39
+ rowBounds,
40
+ chunkRows: chunks.rows,
41
+ chunkOffsets: chunks.offsets,
42
+ chunkBounds: chunks.bounds,
43
+ indexNodeSize: index.nodeSize,
44
+ indexItemCount: index.numItems,
45
+ indexBoxes: index.boxes,
46
+ indexEntries: index.indices,
47
+ indexLevels: index.levelBounds,
48
+ };
49
+ }
50
+ /** The extent of the bboxes of the rows (NaN for a row without a geometry), or null */
51
+ function extentOf(rowBounds) {
52
+ let west = Number.POSITIVE_INFINITY;
53
+ let south = Number.POSITIVE_INFINITY;
54
+ let east = Number.NEGATIVE_INFINITY;
55
+ let north = Number.NEGATIVE_INFINITY;
56
+ for (let i = 0; i < rowBounds.length; i += 4) {
57
+ if (Number.isNaN(rowBounds[i]))
58
+ continue;
59
+ west = Math.min(west, rowBounds[i]);
60
+ south = Math.min(south, rowBounds[i + 1]);
61
+ east = Math.max(east, rowBounds[i + 2]);
62
+ north = Math.max(north, rowBounds[i + 3]);
63
+ }
64
+ return west <= east ? [west, south, east, north] : null;
65
+ }
66
+ /**
67
+ * Whether a value is a prepared table rather than a bare table
68
+ *
69
+ * @internal
70
+ */
71
+ export function isPreparedTable(value) {
72
+ return 'table' in value && typeof value.table === 'object' && value.table !== null;
73
+ }
74
+ /**
75
+ * Lists the buffers of a table, or of a prepared table, for the transfer list of `postMessage`.
76
+ *
77
+ * The buffers move to the other thread without a copy. The geometry arrays of every child of a
78
+ * mixed geometry column are listed too, and for a prepared table the prepared arrays as well.
79
+ * Each buffer appears once, even when several arrays share it. A `SharedArrayBuffer` is left
80
+ * out (it is shared, not moved). After the transfer the arrays are empty on the sending side.
81
+ *
82
+ * @param table The table, or the result of {@link prepareTable}
83
+ * @returns The buffers to pass as the transfer list
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * const prepared = prepareTable(tableFromFeatures(features));
88
+ * self.postMessage(prepared, { transfer: transferList(prepared) });
89
+ * ```
90
+ */
91
+ export function transferList(table) {
92
+ const buffers = new Set();
93
+ const add = (view) => {
94
+ if (view && view.buffer instanceof ArrayBuffer)
95
+ buffers.add(view.buffer);
96
+ };
97
+ const addColumn = (column) => {
98
+ if (!column)
99
+ return;
100
+ if (isDictionaryColumn(column))
101
+ add(column.codes);
102
+ else if (ArrayBuffer.isView(column))
103
+ add(column);
104
+ };
105
+ const addGeometry = (geometry) => {
106
+ add(geometry.coords);
107
+ for (const offsets of geometry.offsets ?? [])
108
+ add(offsets);
109
+ };
110
+ const prepared = isPreparedTable(table) ? table : null;
111
+ const input = prepared ? prepared.table : table;
112
+ const geometry = input.geometry;
113
+ if (geometry.type === 'Mixed') {
114
+ add(geometry.types);
115
+ add(geometry.offsets);
116
+ for (const child of geometry.children)
117
+ addGeometry(child);
118
+ }
119
+ else {
120
+ addGeometry(geometry);
121
+ }
122
+ add(input.validity);
123
+ addColumn(input.ids);
124
+ for (const column of Object.values(input.columns ?? {}))
125
+ addColumn(column);
126
+ if (prepared) {
127
+ add(prepared.rowBounds);
128
+ add(prepared.chunkRows);
129
+ add(prepared.chunkOffsets);
130
+ add(prepared.chunkBounds);
131
+ add(prepared.indexBoxes);
132
+ add(prepared.indexEntries);
133
+ add(prepared.indexLevels);
134
+ }
135
+ return [...buffers];
136
+ }
@@ -0,0 +1 @@
1
+ export {};