@sakuzu/maplibre-gl-draw 1.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 (636) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +661 -0
  3. package/README.ja.md +248 -0
  4. package/README.md +255 -0
  5. package/THIRD_PARTY_NOTICES.md +275 -0
  6. package/dist/api/api.d.ts +1259 -0
  7. package/dist/api/api.js +86 -0
  8. package/dist/api/context.d.ts +173 -0
  9. package/dist/api/context.js +193 -0
  10. package/dist/api/display-api.d.ts +1 -0
  11. package/dist/api/display-api.js +23 -0
  12. package/dist/api/event-api.d.ts +13 -0
  13. package/dist/api/event-api.js +17 -0
  14. package/dist/api/extension-api.d.ts +46 -0
  15. package/dist/api/extension-api.js +85 -0
  16. package/dist/api/feature-api.d.ts +11 -0
  17. package/dist/api/feature-api.js +101 -0
  18. package/dist/api/geometry/apply.d.ts +51 -0
  19. package/dist/api/geometry/apply.js +114 -0
  20. package/dist/api/geometry/boolean.d.ts +28 -0
  21. package/dist/api/geometry/boolean.js +65 -0
  22. package/dist/api/geometry/buffer.d.ts +11 -0
  23. package/dist/api/geometry/buffer.js +105 -0
  24. package/dist/api/geometry/split.d.ts +16 -0
  25. package/dist/api/geometry/split.js +75 -0
  26. package/dist/api/geometry/targets.d.ts +76 -0
  27. package/dist/api/geometry/targets.js +158 -0
  28. package/dist/api/geometry/types.d.ts +31 -0
  29. package/dist/api/geometry/types.js +3 -0
  30. package/dist/api/geometry-operations.d.ts +162 -0
  31. package/dist/api/geometry-operations.js +94 -0
  32. package/dist/api/group-api.d.ts +10 -0
  33. package/dist/api/group-api.js +78 -0
  34. package/dist/api/import-export/constants.d.ts +29 -0
  35. package/dist/api/import-export/constants.js +40 -0
  36. package/dist/api/import-export/embedded-file.d.ts +13 -0
  37. package/dist/api/import-export/embedded-file.js +31 -0
  38. package/dist/api/import-export/file-name.d.ts +10 -0
  39. package/dist/api/import-export/file-name.js +20 -0
  40. package/dist/api/import-export/format-detection.d.ts +12 -0
  41. package/dist/api/import-export/format-detection.js +29 -0
  42. package/dist/api/import-export/geojson-export.d.ts +19 -0
  43. package/dist/api/import-export/geojson-export.js +262 -0
  44. package/dist/api/import-export/geojson-import.d.ts +34 -0
  45. package/dist/api/import-export/geojson-import.js +538 -0
  46. package/dist/api/import-export/geometry-validation.d.ts +20 -0
  47. package/dist/api/import-export/geometry-validation.js +107 -0
  48. package/dist/api/import-export/image-import.d.ts +12 -0
  49. package/dist/api/import-export/image-import.js +53 -0
  50. package/dist/api/import-export/index.d.ts +9 -0
  51. package/dist/api/import-export/index.js +107 -0
  52. package/dist/api/import-export/native-format.d.ts +15 -0
  53. package/dist/api/import-export/native-format.js +126 -0
  54. package/dist/api/import-export/native-validation.d.ts +28 -0
  55. package/dist/api/import-export/native-validation.js +212 -0
  56. package/dist/api/import-export/own-property.d.ts +10 -0
  57. package/dist/api/import-export/own-property.js +19 -0
  58. package/dist/api/import-export/style-validation.d.ts +27 -0
  59. package/dist/api/import-export/style-validation.js +49 -0
  60. package/dist/api/import-export/types.d.ts +26 -0
  61. package/dist/api/import-export/types.js +3 -0
  62. package/dist/api/index.d.ts +15 -0
  63. package/dist/api/index.js +3 -0
  64. package/dist/api/input-api.d.ts +158 -0
  65. package/dist/api/input-api.js +144 -0
  66. package/dist/api/instance-api.d.ts +38 -0
  67. package/dist/api/instance-api.js +136 -0
  68. package/dist/api/layer-api.d.ts +12 -0
  69. package/dist/api/layer-api.js +62 -0
  70. package/dist/api/selection-api.d.ts +7 -0
  71. package/dist/api/selection-api.js +78 -0
  72. package/dist/api/snapping-api.d.ts +125 -0
  73. package/dist/api/snapping-api.js +50 -0
  74. package/dist/api/topology-api.d.ts +30 -0
  75. package/dist/api/topology-api.js +16 -0
  76. package/dist/api/tracing-api.d.ts +31 -0
  77. package/dist/api/tracing-api.js +16 -0
  78. package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
  79. package/dist/dispatcher/hit-test/box-strategies.js +275 -0
  80. package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
  81. package/dist/dispatcher/hit-test/box-strategy.js +37 -0
  82. package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
  83. package/dist/dispatcher/hit-test/globe-shape.js +70 -0
  84. package/dist/dispatcher/hit-test/index.d.ts +14 -0
  85. package/dist/dispatcher/hit-test/index.js +9 -0
  86. package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
  87. package/dist/dispatcher/hit-test/local-frame.js +112 -0
  88. package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
  89. package/dist/dispatcher/hit-test/segment-grid.js +79 -0
  90. package/dist/dispatcher/hit-test/service.d.ts +120 -0
  91. package/dist/dispatcher/hit-test/service.js +333 -0
  92. package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
  93. package/dist/dispatcher/hit-test/strategies/base.js +66 -0
  94. package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
  95. package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
  96. package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
  97. package/dist/dispatcher/hit-test/strategies/image.js +115 -0
  98. package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
  99. package/dist/dispatcher/hit-test/strategies/index.js +10 -0
  100. package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
  101. package/dist/dispatcher/hit-test/strategies/line.js +30 -0
  102. package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
  103. package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
  104. package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
  105. package/dist/dispatcher/hit-test/strategies/point.js +29 -0
  106. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
  107. package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
  108. package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
  109. package/dist/dispatcher/hit-test/topmost.js +157 -0
  110. package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
  111. package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
  112. package/dist/dispatcher/index.d.ts +15 -0
  113. package/dist/dispatcher/index.js +3 -0
  114. package/dist/dispatcher/input-router.d.ts +1 -0
  115. package/dist/dispatcher/input-router.js +288 -0
  116. package/dist/dispatcher/normalizer.d.ts +1 -0
  117. package/dist/dispatcher/normalizer.js +513 -0
  118. package/dist/dispatcher/types.d.ts +144 -0
  119. package/dist/dispatcher/types.js +15 -0
  120. package/dist/display/chunk-set.d.ts +24 -0
  121. package/dist/display/chunk-set.js +533 -0
  122. package/dist/display/chunk.d.ts +1 -0
  123. package/dist/display/chunk.js +104 -0
  124. package/dist/display/columnar/index.d.ts +12 -0
  125. package/dist/display/columnar/index.js +13 -0
  126. package/dist/display/columnar/prepare.d.ts +42 -0
  127. package/dist/display/columnar/prepare.js +116 -0
  128. package/dist/display/columnar/source.d.ts +1 -0
  129. package/dist/display/columnar/source.js +531 -0
  130. package/dist/display/columnar/table.d.ts +1 -0
  131. package/dist/display/columnar/table.js +471 -0
  132. package/dist/display/columnar/types.d.ts +223 -0
  133. package/dist/display/columnar/types.js +3 -0
  134. package/dist/display/dataset.d.ts +2 -0
  135. package/dist/display/dataset.js +891 -0
  136. package/dist/display/index.d.ts +13 -0
  137. package/dist/display/index.js +3 -0
  138. package/dist/display/interaction.d.ts +1 -0
  139. package/dist/display/interaction.js +90 -0
  140. package/dist/display/manager.d.ts +1 -0
  141. package/dist/display/manager.js +440 -0
  142. package/dist/display/packed-rtree.d.ts +1 -0
  143. package/dist/display/packed-rtree.js +244 -0
  144. package/dist/display/partition.d.ts +1 -0
  145. package/dist/display/partition.js +226 -0
  146. package/dist/display/provider.d.ts +1 -0
  147. package/dist/display/provider.js +342 -0
  148. package/dist/display/retained.d.ts +40 -0
  149. package/dist/display/retained.js +898 -0
  150. package/dist/display/selection.d.ts +13 -0
  151. package/dist/display/selection.js +226 -0
  152. package/dist/display/source.d.ts +1 -0
  153. package/dist/display/source.js +119 -0
  154. package/dist/display/spatial.d.ts +1 -0
  155. package/dist/display/spatial.js +71 -0
  156. package/dist/display/style.d.ts +1 -0
  157. package/dist/display/style.js +126 -0
  158. package/dist/display/thinning.d.ts +65 -0
  159. package/dist/display/thinning.js +910 -0
  160. package/dist/display/triangulation.d.ts +1 -0
  161. package/dist/display/triangulation.js +0 -0
  162. package/dist/display/types.d.ts +561 -0
  163. package/dist/display/types.js +43 -0
  164. package/dist/extension/feature-handler.d.ts +182 -0
  165. package/dist/extension/feature-handler.js +3 -0
  166. package/dist/extension/index.d.ts +9 -0
  167. package/dist/extension/index.js +3 -0
  168. package/dist/extension/renderers.d.ts +208 -0
  169. package/dist/extension/renderers.js +3 -0
  170. package/dist/geometry/angle.d.ts +47 -0
  171. package/dist/geometry/angle.js +44 -0
  172. package/dist/geometry/bbox.d.ts +48 -0
  173. package/dist/geometry/bbox.js +83 -0
  174. package/dist/geometry/boolean.d.ts +162 -0
  175. package/dist/geometry/boolean.js +331 -0
  176. package/dist/geometry/buffer.d.ts +72 -0
  177. package/dist/geometry/buffer.js +218 -0
  178. package/dist/geometry/circle.d.ts +55 -0
  179. package/dist/geometry/circle.js +107 -0
  180. package/dist/geometry/coords.d.ts +97 -0
  181. package/dist/geometry/coords.js +149 -0
  182. package/dist/geometry/distance.d.ts +79 -0
  183. package/dist/geometry/distance.js +111 -0
  184. package/dist/geometry/errors.d.ts +74 -0
  185. package/dist/geometry/errors.js +104 -0
  186. package/dist/geometry/index.d.ts +28 -0
  187. package/dist/geometry/index.js +38 -0
  188. package/dist/geometry/measure.d.ts +81 -0
  189. package/dist/geometry/measure.js +236 -0
  190. package/dist/geometry/predicates.d.ts +62 -0
  191. package/dist/geometry/predicates.js +132 -0
  192. package/dist/geometry/simplify.d.ts +74 -0
  193. package/dist/geometry/simplify.js +159 -0
  194. package/dist/geometry/split.d.ts +68 -0
  195. package/dist/geometry/split.js +430 -0
  196. package/dist/geometry/types.d.ts +95 -0
  197. package/dist/geometry/types.js +3 -0
  198. package/dist/geometry/units.d.ts +35 -0
  199. package/dist/geometry/units.js +41 -0
  200. package/dist/index.d.ts +72 -0
  201. package/dist/index.js +20 -0
  202. package/dist/maplibre-gl-draw.d.ts +47 -0
  203. package/dist/maplibre-gl-draw.js +407 -0
  204. package/dist/messages.d.ts +64 -0
  205. package/dist/messages.js +36 -0
  206. package/dist/modes/cursor.d.ts +1 -0
  207. package/dist/modes/cursor.js +72 -0
  208. package/dist/modes/draw/circle.d.ts +1 -0
  209. package/dist/modes/draw/circle.js +222 -0
  210. package/dist/modes/draw/commit-layer.d.ts +26 -0
  211. package/dist/modes/draw/commit-layer.js +31 -0
  212. package/dist/modes/draw/freehand.d.ts +1 -0
  213. package/dist/modes/draw/freehand.js +264 -0
  214. package/dist/modes/draw/image.d.ts +1 -0
  215. package/dist/modes/draw/image.js +60 -0
  216. package/dist/modes/draw/index.d.ts +9 -0
  217. package/dist/modes/draw/index.js +11 -0
  218. package/dist/modes/draw/line.d.ts +1 -0
  219. package/dist/modes/draw/line.js +363 -0
  220. package/dist/modes/draw/point.d.ts +1 -0
  221. package/dist/modes/draw/point.js +87 -0
  222. package/dist/modes/draw/polygon.d.ts +1 -0
  223. package/dist/modes/draw/polygon.js +378 -0
  224. package/dist/modes/draw/trace-support.d.ts +79 -0
  225. package/dist/modes/draw/trace-support.js +161 -0
  226. package/dist/modes/handler.d.ts +285 -0
  227. package/dist/modes/handler.js +3 -0
  228. package/dist/modes/index.d.ts +7 -0
  229. package/dist/modes/index.js +3 -0
  230. package/dist/modes/manager.d.ts +15 -0
  231. package/dist/modes/manager.js +196 -0
  232. package/dist/modes/select/box-selection.d.ts +52 -0
  233. package/dist/modes/select/box-selection.js +140 -0
  234. package/dist/modes/select/click-handler.d.ts +32 -0
  235. package/dist/modes/select/click-handler.js +166 -0
  236. package/dist/modes/select/cursor-handler.d.ts +15 -0
  237. package/dist/modes/select/cursor-handler.js +59 -0
  238. package/dist/modes/select/drag/auxiliary.d.ts +26 -0
  239. package/dist/modes/select/drag/auxiliary.js +56 -0
  240. package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
  241. package/dist/modes/select/drag/intermediate-writes.js +171 -0
  242. package/dist/modes/select/drag/move.d.ts +24 -0
  243. package/dist/modes/select/drag/move.js +59 -0
  244. package/dist/modes/select/drag/operation.d.ts +30 -0
  245. package/dist/modes/select/drag/operation.js +18 -0
  246. package/dist/modes/select/drag/radius.d.ts +15 -0
  247. package/dist/modes/select/drag/radius.js +49 -0
  248. package/dist/modes/select/drag/transform.d.ts +17 -0
  249. package/dist/modes/select/drag/transform.js +155 -0
  250. package/dist/modes/select/drag/vertex.d.ts +17 -0
  251. package/dist/modes/select/drag/vertex.js +163 -0
  252. package/dist/modes/select/drag-handler.d.ts +1 -0
  253. package/dist/modes/select/drag-handler.js +254 -0
  254. package/dist/modes/select/hit-helpers.d.ts +40 -0
  255. package/dist/modes/select/hit-helpers.js +51 -0
  256. package/dist/modes/select/mode.d.ts +1 -0
  257. package/dist/modes/select/mode.js +397 -0
  258. package/dist/modes/select/shortcut-handler.d.ts +40 -0
  259. package/dist/modes/select/shortcut-handler.js +128 -0
  260. package/dist/operations/index.d.ts +9 -0
  261. package/dist/operations/index.js +3 -0
  262. package/dist/operations/layer-operations.d.ts +1 -0
  263. package/dist/operations/layer-operations.js +350 -0
  264. package/dist/operations/resize.d.ts +71 -0
  265. package/dist/operations/resize.js +252 -0
  266. package/dist/operations/rotate.d.ts +17 -0
  267. package/dist/operations/rotate.js +166 -0
  268. package/dist/operations/selection-operations.d.ts +20 -0
  269. package/dist/operations/selection-operations.js +159 -0
  270. package/dist/operations/shared-vertex.d.ts +1 -0
  271. package/dist/operations/shared-vertex.js +210 -0
  272. package/dist/operations/trace-graph.d.ts +96 -0
  273. package/dist/operations/trace-graph.js +283 -0
  274. package/dist/operations/vertex.d.ts +1 -0
  275. package/dist/operations/vertex.js +538 -0
  276. package/dist/plugins/index.d.ts +10 -0
  277. package/dist/plugins/index.js +3 -0
  278. package/dist/plugins/mutation-hooks.d.ts +28 -0
  279. package/dist/plugins/mutation-hooks.js +84 -0
  280. package/dist/plugins/plugin-context.d.ts +1 -0
  281. package/dist/plugins/plugin-context.js +367 -0
  282. package/dist/plugins/plugin-manager.d.ts +103 -0
  283. package/dist/plugins/plugin-manager.js +316 -0
  284. package/dist/plugins/plugin.d.ts +529 -0
  285. package/dist/plugins/plugin.js +3 -0
  286. package/dist/shared/config/constants.d.ts +66 -0
  287. package/dist/shared/config/constants.js +60 -0
  288. package/dist/shared/config/feature-style.d.ts +155 -0
  289. package/dist/shared/config/feature-style.js +154 -0
  290. package/dist/shared/config/index.d.ts +17 -0
  291. package/dist/shared/config/index.js +8 -0
  292. package/dist/shared/config/rendering.d.ts +107 -0
  293. package/dist/shared/config/rendering.js +33 -0
  294. package/dist/shared/config/selection-highlight.d.ts +29 -0
  295. package/dist/shared/config/selection-highlight.js +35 -0
  296. package/dist/shared/config/selection.d.ts +273 -0
  297. package/dist/shared/config/selection.js +266 -0
  298. package/dist/shared/config/topology.d.ts +33 -0
  299. package/dist/shared/config/topology.js +17 -0
  300. package/dist/shared/config/trace.d.ts +40 -0
  301. package/dist/shared/config/trace.js +17 -0
  302. package/dist/shared/math/angle.d.ts +21 -0
  303. package/dist/shared/math/angle.js +34 -0
  304. package/dist/shared/math/circle.d.ts +6 -0
  305. package/dist/shared/math/circle.js +10 -0
  306. package/dist/shared/math/constants.d.ts +48 -0
  307. package/dist/shared/math/constants.js +59 -0
  308. package/dist/shared/math/distance.d.ts +78 -0
  309. package/dist/shared/math/distance.js +147 -0
  310. package/dist/shared/math/globe-subdivision.d.ts +62 -0
  311. package/dist/shared/math/globe-subdivision.js +99 -0
  312. package/dist/shared/math/index.d.ts +17 -0
  313. package/dist/shared/math/index.js +21 -0
  314. package/dist/shared/math/intersection.d.ts +63 -0
  315. package/dist/shared/math/intersection.js +236 -0
  316. package/dist/shared/math/longitude.d.ts +20 -0
  317. package/dist/shared/math/longitude.js +31 -0
  318. package/dist/shared/math/mercator-plane.d.ts +27 -0
  319. package/dist/shared/math/mercator-plane.js +26 -0
  320. package/dist/shared/math/obb.d.ts +65 -0
  321. package/dist/shared/math/obb.js +107 -0
  322. package/dist/shared/math/rotation.d.ts +93 -0
  323. package/dist/shared/math/rotation.js +186 -0
  324. package/dist/shared/math/segment-grid.d.ts +69 -0
  325. package/dist/shared/math/segment-grid.js +159 -0
  326. package/dist/shared/math/transform.d.ts +140 -0
  327. package/dist/shared/math/transform.js +189 -0
  328. package/dist/shared/types/events.d.ts +128 -0
  329. package/dist/shared/types/events.js +3 -0
  330. package/dist/shared/types/model.d.ts +950 -0
  331. package/dist/shared/types/model.js +3 -0
  332. package/dist/shared/types/selection-box.d.ts +23 -0
  333. package/dist/shared/types/selection-box.js +3 -0
  334. package/dist/shared/types/style.d.ts +68 -0
  335. package/dist/shared/types/style.js +3 -0
  336. package/dist/shared/utils/color.d.ts +49 -0
  337. package/dist/shared/utils/color.js +180 -0
  338. package/dist/shared/utils/coordinates.d.ts +52 -0
  339. package/dist/shared/utils/coordinates.js +75 -0
  340. package/dist/shared/utils/embedded-image.d.ts +34 -0
  341. package/dist/shared/utils/embedded-image.js +161 -0
  342. package/dist/shared/utils/event-emitter.d.ts +262 -0
  343. package/dist/shared/utils/event-emitter.js +44 -0
  344. package/dist/shared/utils/feature-bbox.d.ts +8 -0
  345. package/dist/shared/utils/feature-bbox.js +207 -0
  346. package/dist/shared/utils/feature-segments.d.ts +23 -0
  347. package/dist/shared/utils/feature-segments.js +179 -0
  348. package/dist/shared/utils/id.d.ts +1 -0
  349. package/dist/shared/utils/id.js +35 -0
  350. package/dist/shared/utils/image.d.ts +34 -0
  351. package/dist/shared/utils/image.js +106 -0
  352. package/dist/shared/utils/index.d.ts +15 -0
  353. package/dist/shared/utils/index.js +24 -0
  354. package/dist/shared/utils/map.d.ts +26 -0
  355. package/dist/shared/utils/map.js +35 -0
  356. package/dist/shared/utils/name-generator.d.ts +197 -0
  357. package/dist/shared/utils/name-generator.js +337 -0
  358. package/dist/shared/utils/pixel-ratio.d.ts +111 -0
  359. package/dist/shared/utils/pixel-ratio.js +85 -0
  360. package/dist/shared/utils/property.d.ts +88 -0
  361. package/dist/shared/utils/property.js +140 -0
  362. package/dist/shared/utils/vertex-ref.d.ts +23 -0
  363. package/dist/shared/utils/vertex-ref.js +20 -0
  364. package/dist/snapping/custom-targets.d.ts +1 -0
  365. package/dist/snapping/custom-targets.js +21 -0
  366. package/dist/snapping/geometry.d.ts +1 -0
  367. package/dist/snapping/geometry.js +61 -0
  368. package/dist/snapping/index.d.ts +14 -0
  369. package/dist/snapping/index.js +4 -0
  370. package/dist/snapping/indicator.d.ts +19 -0
  371. package/dist/snapping/indicator.js +145 -0
  372. package/dist/snapping/providers/display.d.ts +72 -0
  373. package/dist/snapping/providers/display.js +268 -0
  374. package/dist/snapping/providers/guide.d.ts +69 -0
  375. package/dist/snapping/providers/guide.js +187 -0
  376. package/dist/snapping/providers/intersection.d.ts +1 -0
  377. package/dist/snapping/providers/intersection.js +92 -0
  378. package/dist/snapping/providers/shared.d.ts +39 -0
  379. package/dist/snapping/providers/shared.js +146 -0
  380. package/dist/snapping/providers/store.d.ts +1 -0
  381. package/dist/snapping/providers/store.js +132 -0
  382. package/dist/snapping/service.d.ts +1 -0
  383. package/dist/snapping/service.js +272 -0
  384. package/dist/snapping/types.d.ts +267 -0
  385. package/dist/snapping/types.js +66 -0
  386. package/dist/store/change-merger.d.ts +1 -0
  387. package/dist/store/change-merger.js +102 -0
  388. package/dist/store/draw-store.d.ts +1 -0
  389. package/dist/store/draw-store.js +396 -0
  390. package/dist/store/event-bridge.d.ts +1 -0
  391. package/dist/store/event-bridge.js +161 -0
  392. package/dist/store/index.d.ts +12 -0
  393. package/dist/store/index.js +4 -0
  394. package/dist/store/local-visibility.d.ts +21 -0
  395. package/dist/store/local-visibility.js +27 -0
  396. package/dist/store/lock.d.ts +67 -0
  397. package/dist/store/lock.js +54 -0
  398. package/dist/store/memory/change-bus.d.ts +60 -0
  399. package/dist/store/memory/change-bus.js +232 -0
  400. package/dist/store/memory/file-store.d.ts +15 -0
  401. package/dist/store/memory/file-store.js +33 -0
  402. package/dist/store/memory/frozen.d.ts +21 -0
  403. package/dist/store/memory/frozen.js +51 -0
  404. package/dist/store/memory/ui-state.d.ts +51 -0
  405. package/dist/store/memory/ui-state.js +223 -0
  406. package/dist/store/memory.d.ts +26 -0
  407. package/dist/store/memory.js +708 -0
  408. package/dist/store/spatial/index.d.ts +6 -0
  409. package/dist/store/spatial/index.js +4 -0
  410. package/dist/store/spatial/spatial-index.d.ts +90 -0
  411. package/dist/store/spatial/spatial-index.js +148 -0
  412. package/dist/store/spatial/store-spatial-index.d.ts +60 -0
  413. package/dist/store/spatial/store-spatial-index.js +125 -0
  414. package/dist/store/store.d.ts +417 -0
  415. package/dist/store/store.js +3 -0
  416. package/dist/store/types.d.ts +8 -0
  417. package/dist/store/types.js +3 -0
  418. package/dist/store/writable-layer.d.ts +35 -0
  419. package/dist/store/writable-layer.js +20 -0
  420. package/dist/view/cache/buffer.d.ts +28 -0
  421. package/dist/view/cache/buffer.js +176 -0
  422. package/dist/view/cache/earcut.d.ts +1 -0
  423. package/dist/view/cache/earcut.js +122 -0
  424. package/dist/view/cache/style-rule.d.ts +1 -0
  425. package/dist/view/cache/style-rule.js +97 -0
  426. package/dist/view/cache/terrain-fill.d.ts +30 -0
  427. package/dist/view/cache/terrain-fill.js +60 -0
  428. package/dist/view/cache/texture.d.ts +14 -0
  429. package/dist/view/cache/texture.js +292 -0
  430. package/dist/view/coordinator.d.ts +27 -0
  431. package/dist/view/coordinator.js +72 -0
  432. package/dist/view/feature-companion.d.ts +173 -0
  433. package/dist/view/feature-companion.js +108 -0
  434. package/dist/view/globe-subdivision.d.ts +78 -0
  435. package/dist/view/globe-subdivision.js +128 -0
  436. package/dist/view/index.d.ts +47 -0
  437. package/dist/view/index.js +20 -0
  438. package/dist/view/layer/attach.d.ts +20 -0
  439. package/dist/view/layer/attach.js +47 -0
  440. package/dist/view/layer/blend.d.ts +57 -0
  441. package/dist/view/layer/blend.js +14 -0
  442. package/dist/view/layer/custom-layer.d.ts +1 -0
  443. package/dist/view/layer/custom-layer.js +509 -0
  444. package/dist/view/layer/depth-state.d.ts +14 -0
  445. package/dist/view/layer/depth-state.js +44 -0
  446. package/dist/view/layer/display-list.d.ts +1 -0
  447. package/dist/view/layer/display-list.js +111 -0
  448. package/dist/view/layer/drape-planner.d.ts +139 -0
  449. package/dist/view/layer/drape-planner.js +726 -0
  450. package/dist/view/layer/frame-render.d.ts +57 -0
  451. package/dist/view/layer/frame-render.js +209 -0
  452. package/dist/view/layer/frame-state.d.ts +147 -0
  453. package/dist/view/layer/frame-state.js +484 -0
  454. package/dist/view/layer/gl-state.d.ts +77 -0
  455. package/dist/view/layer/gl-state.js +132 -0
  456. package/dist/view/layer/index.d.ts +6 -0
  457. package/dist/view/layer/index.js +5 -0
  458. package/dist/view/layer/render-scope.d.ts +30 -0
  459. package/dist/view/layer/render-scope.js +28 -0
  460. package/dist/view/layer/render.d.ts +87 -0
  461. package/dist/view/layer/render.js +187 -0
  462. package/dist/view/layer/renderers.d.ts +81 -0
  463. package/dist/view/layer/renderers.js +142 -0
  464. package/dist/view/layer/slot-manager.d.ts +26 -0
  465. package/dist/view/layer/slot-manager.js +133 -0
  466. package/dist/view/layer/slots.d.ts +33 -0
  467. package/dist/view/layer/slots.js +50 -0
  468. package/dist/view/layer/store-retained-bbox.d.ts +36 -0
  469. package/dist/view/layer/store-retained-bbox.js +188 -0
  470. package/dist/view/layer/store-retained-chunk.d.ts +97 -0
  471. package/dist/view/layer/store-retained-chunk.js +94 -0
  472. package/dist/view/layer/store-retained-classify.d.ts +34 -0
  473. package/dist/view/layer/store-retained-classify.js +88 -0
  474. package/dist/view/layer/store-retained-collect.d.ts +24 -0
  475. package/dist/view/layer/store-retained-collect.js +121 -0
  476. package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
  477. package/dist/view/layer/store-retained-coord-patch.js +168 -0
  478. package/dist/view/layer/store-retained-immediate.d.ts +63 -0
  479. package/dist/view/layer/store-retained-immediate.js +49 -0
  480. package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
  481. package/dist/view/layer/store-retained-invalidation.js +192 -0
  482. package/dist/view/layer/store-retained.d.ts +198 -0
  483. package/dist/view/layer/store-retained.js +430 -0
  484. package/dist/view/layer/terrain-resolver.d.ts +1 -0
  485. package/dist/view/layer/terrain-resolver.js +174 -0
  486. package/dist/view/renderers/batch-manager.d.ts +61 -0
  487. package/dist/view/renderers/batch-manager.js +718 -0
  488. package/dist/view/renderers/draw-factors.d.ts +60 -0
  489. package/dist/view/renderers/draw-factors.js +35 -0
  490. package/dist/view/renderers/drawer.d.ts +1 -0
  491. package/dist/view/renderers/drawer.js +346 -0
  492. package/dist/view/renderers/image.d.ts +1 -0
  493. package/dist/view/renderers/image.js +255 -0
  494. package/dist/view/renderers/line/dash.d.ts +31 -0
  495. package/dist/view/renderers/line/dash.js +152 -0
  496. package/dist/view/renderers/line/line-geometry.d.ts +39 -0
  497. package/dist/view/renderers/line/line-geometry.js +460 -0
  498. package/dist/view/renderers/line/line-gl.d.ts +1 -0
  499. package/dist/view/renderers/line/line-gl.js +236 -0
  500. package/dist/view/renderers/line/line-shader.d.ts +1 -0
  501. package/dist/view/renderers/line/line-shader.js +364 -0
  502. package/dist/view/renderers/line/line-types.d.ts +43 -0
  503. package/dist/view/renderers/line/line-types.js +3 -0
  504. package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
  505. package/dist/view/renderers/line/line-uniforms.js +390 -0
  506. package/dist/view/renderers/line/sdf-line.d.ts +92 -0
  507. package/dist/view/renderers/line/sdf-line.js +567 -0
  508. package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
  509. package/dist/view/renderers/point/billboard-depth.js +56 -0
  510. package/dist/view/renderers/point/point-instance.d.ts +124 -0
  511. package/dist/view/renderers/point/point-instance.js +738 -0
  512. package/dist/view/renderers/point/point-sdf.d.ts +58 -0
  513. package/dist/view/renderers/point/point-sdf.js +170 -0
  514. package/dist/view/renderers/point/point-shape.d.ts +99 -0
  515. package/dist/view/renderers/point/point-shape.js +504 -0
  516. package/dist/view/renderers/point/point-style.d.ts +1 -0
  517. package/dist/view/renderers/point/point-style.js +46 -0
  518. package/dist/view/renderers/polygon/batch.d.ts +26 -0
  519. package/dist/view/renderers/polygon/batch.js +336 -0
  520. package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
  521. package/dist/view/renderers/polygon/earcut-input.js +55 -0
  522. package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
  523. package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
  524. package/dist/view/renderers/polygon/fill.d.ts +74 -0
  525. package/dist/view/renderers/polygon/fill.js +251 -0
  526. package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
  527. package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
  528. package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
  529. package/dist/view/renderers/polygon/terrain-cull.js +14 -0
  530. package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
  531. package/dist/view/renderers/polygon/triangulator.js +3 -0
  532. package/dist/view/renderers/retained.d.ts +43 -0
  533. package/dist/view/renderers/retained.js +3 -0
  534. package/dist/view/renderers/stroke.d.ts +121 -0
  535. package/dist/view/renderers/stroke.js +621 -0
  536. package/dist/view/shaders/frame.d.ts +8 -0
  537. package/dist/view/shaders/frame.js +37 -0
  538. package/dist/view/shaders/helpers.d.ts +238 -0
  539. package/dist/view/shaders/helpers.js +611 -0
  540. package/dist/view/shaders/initializer.d.ts +27 -0
  541. package/dist/view/shaders/initializer.js +125 -0
  542. package/dist/view/shaders/projection.d.ts +123 -0
  543. package/dist/view/shaders/projection.js +299 -0
  544. package/dist/view/shaders/quad-grid.d.ts +77 -0
  545. package/dist/view/shaders/quad-grid.js +128 -0
  546. package/dist/view/shaders/quad.d.ts +189 -0
  547. package/dist/view/shaders/quad.js +582 -0
  548. package/dist/view/shaders/retained-origin.d.ts +50 -0
  549. package/dist/view/shaders/retained-origin.js +67 -0
  550. package/dist/view/shaders/terrain-shade.d.ts +23 -0
  551. package/dist/view/shaders/terrain-shade.js +93 -0
  552. package/dist/view/style-rule.d.ts +166 -0
  553. package/dist/view/style-rule.js +300 -0
  554. package/dist/view/terrain/anchor.d.ts +135 -0
  555. package/dist/view/terrain/anchor.js +226 -0
  556. package/dist/view/terrain/context.d.ts +132 -0
  557. package/dist/view/terrain/context.js +437 -0
  558. package/dist/view/terrain/dem-atlas.d.ts +97 -0
  559. package/dist/view/terrain/dem-atlas.js +534 -0
  560. package/dist/view/terrain/detect.d.ts +126 -0
  561. package/dist/view/terrain/detect.js +198 -0
  562. package/dist/view/terrain/drape/bin-store.d.ts +179 -0
  563. package/dist/view/terrain/drape/bin-store.js +529 -0
  564. package/dist/view/terrain/drape/binning.d.ts +259 -0
  565. package/dist/view/terrain/drape/binning.js +604 -0
  566. package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
  567. package/dist/view/terrain/drape/edge-constrain.js +175 -0
  568. package/dist/view/terrain/drape/geometry.d.ts +95 -0
  569. package/dist/view/terrain/drape/geometry.js +260 -0
  570. package/dist/view/terrain/drape/mesh.d.ts +50 -0
  571. package/dist/view/terrain/drape/mesh.js +86 -0
  572. package/dist/view/terrain/drape/pass.d.ts +122 -0
  573. package/dist/view/terrain/drape/pass.js +379 -0
  574. package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
  575. package/dist/view/terrain/drape/quad-glyphs.js +117 -0
  576. package/dist/view/terrain/drape/quad.d.ts +249 -0
  577. package/dist/view/terrain/drape/quad.js +835 -0
  578. package/dist/view/terrain/drape/renderer.d.ts +184 -0
  579. package/dist/view/terrain/drape/renderer.js +706 -0
  580. package/dist/view/terrain/drape/shared.d.ts +80 -0
  581. package/dist/view/terrain/drape/shared.js +173 -0
  582. package/dist/view/terrain/drape/stitch.d.ts +155 -0
  583. package/dist/view/terrain/drape/stitch.js +228 -0
  584. package/dist/view/terrain/ground.d.ts +72 -0
  585. package/dist/view/terrain/ground.js +151 -0
  586. package/dist/view/terrain/metrics.d.ts +180 -0
  587. package/dist/view/terrain/metrics.js +231 -0
  588. package/dist/view/terrain/occlusion.d.ts +11 -0
  589. package/dist/view/terrain/occlusion.js +129 -0
  590. package/dist/view/terrain/polygon.d.ts +86 -0
  591. package/dist/view/terrain/polygon.js +301 -0
  592. package/dist/view/terrain/shade.d.ts +48 -0
  593. package/dist/view/terrain/shade.js +45 -0
  594. package/dist/view/terrain/state.d.ts +99 -0
  595. package/dist/view/terrain/state.js +186 -0
  596. package/dist/view/terrain/tessellation.d.ts +265 -0
  597. package/dist/view/terrain/tessellation.js +924 -0
  598. package/dist/view/terrain/tiling.d.ts +56 -0
  599. package/dist/view/terrain/tiling.js +155 -0
  600. package/dist/view/terrain/upstream-terrain.d.ts +82 -0
  601. package/dist/view/terrain/upstream-terrain.js +116 -0
  602. package/dist/view/ui/auxiliary-handles.d.ts +151 -0
  603. package/dist/view/ui/auxiliary-handles.js +22 -0
  604. package/dist/view/ui/bounds.d.ts +53 -0
  605. package/dist/view/ui/bounds.js +149 -0
  606. package/dist/view/ui/box-selection.d.ts +1 -0
  607. package/dist/view/ui/box-selection.js +83 -0
  608. package/dist/view/ui/handle-test.d.ts +1 -0
  609. package/dist/view/ui/handle-test.js +437 -0
  610. package/dist/view/ui/handle-thinning.d.ts +122 -0
  611. package/dist/view/ui/handle-thinning.js +430 -0
  612. package/dist/view/ui/handles.d.ts +25 -0
  613. package/dist/view/ui/handles.js +673 -0
  614. package/dist/view/ui/helper.d.ts +19 -0
  615. package/dist/view/ui/helper.js +76 -0
  616. package/dist/view/ui/index.d.ts +15 -0
  617. package/dist/view/ui/index.js +15 -0
  618. package/dist/view/ui/selection-scope.d.ts +25 -0
  619. package/dist/view/ui/selection-scope.js +34 -0
  620. package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
  621. package/dist/view/ui/selection-ui/bounding-box.js +240 -0
  622. package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
  623. package/dist/view/ui/selection-ui/extension-registry.js +78 -0
  624. package/dist/view/ui/selection-ui/index.d.ts +12 -0
  625. package/dist/view/ui/selection-ui/index.js +12 -0
  626. package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
  627. package/dist/view/ui/selection-ui/renderer.js +227 -0
  628. package/dist/view/ui/selection-ui/types.d.ts +55 -0
  629. package/dist/view/ui/selection-ui/types.js +3 -0
  630. package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
  631. package/dist/view/ui/selection-ui-drawer.js +329 -0
  632. package/dist/view/ui/tentative.d.ts +1 -0
  633. package/dist/view/ui/tentative.js +320 -0
  634. package/dist/view/viewport.d.ts +119 -0
  635. package/dist/view/viewport.js +254 -0
  636. package/package.json +113 -0
@@ -0,0 +1,244 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * A static R-tree packed into typed arrays (the spatial index of a dataset)
5
+ *
6
+ * The rows are ordered along a Hilbert curve of the centers of their bboxes and grouped bottom up
7
+ * into nodes of a fixed size. The whole tree is three typed arrays, so it is built in one pass
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
10
+ * whole, so a tree that cannot be updated in place is enough.
11
+ *
12
+ * A pure module: it depends on nothing.
13
+ */
14
+ /** The number of entries of one node */
15
+ const DEFAULT_NODE_SIZE = 16;
16
+ /** The side of the Hilbert grid the centers are snapped to (2^16 cells) */
17
+ const HILBERT_SIDE = 1 << 16;
18
+ /**
19
+ * Builds a packed R-tree over the bboxes of the rows
20
+ *
21
+ * A row whose bbox is NaN (a row without a geometry) is left out.
22
+ *
23
+ * @param bounds `[minX, minY, maxX, maxY]` per row
24
+ *
25
+ * @internal
26
+ */
27
+ export function buildPackedRTree(bounds, nodeSize = DEFAULT_NODE_SIZE) {
28
+ const rowCount = bounds.length >> 2;
29
+ let numItems = 0;
30
+ for (let row = 0; row < rowCount; row++) {
31
+ if (!Number.isNaN(bounds[row * 4]))
32
+ numItems++;
33
+ }
34
+ // The level structure: leaves, then ceil(n / nodeSize) nodes per level up to a single root
35
+ // (an empty tree has the root alone)
36
+ let n = numItems;
37
+ let numNodes = n;
38
+ const levels = [n];
39
+ do {
40
+ n = Math.max(1, Math.ceil(n / nodeSize));
41
+ numNodes += n;
42
+ levels.push(numNodes);
43
+ } while (n !== 1);
44
+ const boxes = new Float64Array(numNodes * 4);
45
+ const indices = new Int32Array(numNodes);
46
+ const levelBounds = Int32Array.from(levels);
47
+ let minX = Number.POSITIVE_INFINITY;
48
+ let minY = Number.POSITIVE_INFINITY;
49
+ let maxX = Number.NEGATIVE_INFINITY;
50
+ let maxY = Number.NEGATIVE_INFINITY;
51
+ let leaf = 0;
52
+ for (let row = 0; row < rowCount; row++) {
53
+ const at = row * 4;
54
+ if (Number.isNaN(bounds[at]))
55
+ continue;
56
+ boxes[leaf * 4] = bounds[at];
57
+ boxes[leaf * 4 + 1] = bounds[at + 1];
58
+ boxes[leaf * 4 + 2] = bounds[at + 2];
59
+ boxes[leaf * 4 + 3] = bounds[at + 3];
60
+ indices[leaf] = row;
61
+ if (bounds[at] < minX)
62
+ minX = bounds[at];
63
+ if (bounds[at + 1] < minY)
64
+ minY = bounds[at + 1];
65
+ if (bounds[at + 2] > maxX)
66
+ maxX = bounds[at + 2];
67
+ if (bounds[at + 3] > maxY)
68
+ maxY = bounds[at + 3];
69
+ leaf++;
70
+ }
71
+ if (numItems === 0) {
72
+ // An empty tree: a root that nothing intersects
73
+ boxes.set([
74
+ Number.POSITIVE_INFINITY,
75
+ Number.POSITIVE_INFINITY,
76
+ Number.NEGATIVE_INFINITY,
77
+ Number.NEGATIVE_INFINITY,
78
+ ]);
79
+ return { nodeSize, numItems, boxes, indices, levelBounds };
80
+ }
81
+ if (numItems > nodeSize) {
82
+ // Order the leaves along the Hilbert curve of their centers
83
+ const width = maxX - minX || 1;
84
+ const height = maxY - minY || 1;
85
+ const values = new Float64Array(numItems);
86
+ const scale = HILBERT_SIDE - 1;
87
+ for (let i = 0; i < numItems; i++) {
88
+ const cx = (boxes[i * 4] + boxes[i * 4 + 2]) / 2;
89
+ const cy = (boxes[i * 4 + 1] + boxes[i * 4 + 3]) / 2;
90
+ const x = Math.floor((scale * (cx - minX)) / width);
91
+ const y = Math.floor((scale * (cy - minY)) / height);
92
+ values[i] = hilbertIndex(x, y);
93
+ }
94
+ sortLeaves(values, boxes, indices, 0, numItems - 1, nodeSize);
95
+ }
96
+ // Build the nodes level by level, bottom up
97
+ let pos = 0;
98
+ let write = numItems;
99
+ for (let level = 0; level < levelBounds.length - 1; level++) {
100
+ const end = levelBounds[level];
101
+ while (pos < end) {
102
+ const first = pos;
103
+ let nodeMinX = Number.POSITIVE_INFINITY;
104
+ let nodeMinY = Number.POSITIVE_INFINITY;
105
+ let nodeMaxX = Number.NEGATIVE_INFINITY;
106
+ let nodeMaxY = Number.NEGATIVE_INFINITY;
107
+ for (let j = 0; j < nodeSize && pos < end; j++, pos++) {
108
+ if (boxes[pos * 4] < nodeMinX)
109
+ nodeMinX = boxes[pos * 4];
110
+ if (boxes[pos * 4 + 1] < nodeMinY)
111
+ nodeMinY = boxes[pos * 4 + 1];
112
+ if (boxes[pos * 4 + 2] > nodeMaxX)
113
+ nodeMaxX = boxes[pos * 4 + 2];
114
+ if (boxes[pos * 4 + 3] > nodeMaxY)
115
+ nodeMaxY = boxes[pos * 4 + 3];
116
+ }
117
+ boxes[write * 4] = nodeMinX;
118
+ boxes[write * 4 + 1] = nodeMinY;
119
+ boxes[write * 4 + 2] = nodeMaxX;
120
+ boxes[write * 4 + 3] = nodeMaxY;
121
+ indices[write] = first;
122
+ write++;
123
+ }
124
+ }
125
+ return { nodeSize, numItems, boxes, indices, levelBounds };
126
+ }
127
+ /**
128
+ * Returns the rows whose bbox intersects the box (the edges count as intersecting), in no
129
+ * particular order
130
+ *
131
+ * @param out The array the rows are appended to
132
+ *
133
+ * @internal
134
+ */
135
+ export function searchPackedRTree(tree, minX, minY, maxX, maxY, out = []) {
136
+ const { boxes, indices, levelBounds, nodeSize, numItems } = tree;
137
+ if (numItems === 0)
138
+ return out;
139
+ const queue = [];
140
+ let node = levelBounds[levelBounds.length - 1] - 1;
141
+ while (node !== undefined) {
142
+ const end = Math.min(node + nodeSize, levelEnd(levelBounds, node));
143
+ for (let pos = node; pos < end; pos++) {
144
+ const at = pos * 4;
145
+ if (maxX < boxes[at] ||
146
+ maxY < boxes[at + 1] ||
147
+ minX > boxes[at + 2] ||
148
+ minY > boxes[at + 3]) {
149
+ continue;
150
+ }
151
+ if (node < numItems)
152
+ out.push(indices[pos]);
153
+ else
154
+ queue.push(indices[pos]);
155
+ }
156
+ node = queue.pop();
157
+ }
158
+ return out;
159
+ }
160
+ /** The end of the level that the position belongs to */
161
+ function levelEnd(levelBounds, position) {
162
+ let lo = 0;
163
+ let hi = levelBounds.length - 1;
164
+ while (lo < hi) {
165
+ const mid = (lo + hi) >> 1;
166
+ if (levelBounds[mid] > position)
167
+ hi = mid;
168
+ else
169
+ lo = mid + 1;
170
+ }
171
+ return levelBounds[lo];
172
+ }
173
+ /**
174
+ * The distance along the Hilbert curve of a cell of the 2^16 grid
175
+ */
176
+ function hilbertIndex(cellX, cellY) {
177
+ let x = cellX;
178
+ let y = cellY;
179
+ let d = 0;
180
+ for (let s = HILBERT_SIDE >> 1; s > 0; s >>= 1) {
181
+ const rx = (x & s) > 0 ? 1 : 0;
182
+ const ry = (y & s) > 0 ? 1 : 0;
183
+ d += s * s * ((3 * rx) ^ ry);
184
+ if (ry === 0) {
185
+ if (rx === 1) {
186
+ x = HILBERT_SIDE - 1 - x;
187
+ y = HILBERT_SIDE - 1 - y;
188
+ }
189
+ const t = x;
190
+ x = y;
191
+ y = t;
192
+ }
193
+ }
194
+ return d;
195
+ }
196
+ /**
197
+ * Sorts the leaves by their Hilbert value (quicksort on the parallel arrays)
198
+ *
199
+ * The order only matters between nodes, so a range that falls within one node is left as it is.
200
+ */
201
+ function sortLeaves(values, boxes, indices, left, right, nodeSize) {
202
+ let lo = left;
203
+ let hi = right;
204
+ while (Math.floor(lo / nodeSize) < Math.floor(hi / nodeSize)) {
205
+ const pivot = values[(lo + hi) >> 1];
206
+ let i = lo - 1;
207
+ let j = hi + 1;
208
+ while (true) {
209
+ do
210
+ i++;
211
+ while (values[i] < pivot);
212
+ do
213
+ j--;
214
+ while (values[j] > pivot);
215
+ if (i >= j)
216
+ break;
217
+ swapLeaves(values, boxes, indices, i, j);
218
+ }
219
+ // Recurse into the smaller side, loop on the larger one (the stack stays shallow)
220
+ if (j - lo < hi - j) {
221
+ sortLeaves(values, boxes, indices, lo, j, nodeSize);
222
+ lo = j + 1;
223
+ }
224
+ else {
225
+ sortLeaves(values, boxes, indices, j + 1, hi, nodeSize);
226
+ hi = j;
227
+ }
228
+ }
229
+ }
230
+ function swapLeaves(values, boxes, indices, i, j) {
231
+ const value = values[i];
232
+ values[i] = values[j];
233
+ values[j] = value;
234
+ const index = indices[i];
235
+ indices[i] = indices[j];
236
+ indices[j] = index;
237
+ const a = i * 4;
238
+ const b = j * 4;
239
+ for (let k = 0; k < 4; k++) {
240
+ const box = boxes[a + k];
241
+ boxes[a + k] = boxes[b + k];
242
+ boxes[b + k] = box;
243
+ }
244
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,226 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The splitting of the rows of a dataset into spatial chunks
5
+ *
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`).
10
+ *
11
+ * The rule: the rows are cut in half at the median of the centers of their bboxes (the way a k-d
12
+ * tree is built) until a range holds at most the target number of rows and the target number of
13
+ * vertices. Within a chunk the rows keep their original order (the draw order), and the chunks
14
+ * are ordered by the first row they hold.
15
+ */
16
+ /**
17
+ * Target number of features per chunk
18
+ *
19
+ * A chunk is also "the unit of work built in one frame". With terrain, building a chunk includes
20
+ * the subdivision and takes 0.2 to 0.5 seconds for 500 features (measured). Lowering the count
21
+ * makes the hitch per frame smaller at the cost of more draw calls. 96 was taken from "about
22
+ * 50 ms per chunk with terrain" (it was lowered from 192 because building got heavier once the
23
+ * step was matched to the real mesh of the tiles).
24
+ *
25
+ * @internal
26
+ */
27
+ export const CHUNK_TARGET_SIZE = 96;
28
+ /**
29
+ * Target number of vertices per chunk
30
+ *
31
+ * Cutting by the count alone lets a single feature such as a municipal boundary with 130,000
32
+ * vertices bring in the work of dozens of features. Measured, building the chunk that contained
33
+ * that one feature (63 features, 226,000 vertices in total) took 1.4 seconds even with the
34
+ * terrain off. A chunk is "the unit of work built in one frame", so it is cut by the number of
35
+ * vertices as well.
36
+ *
37
+ * 40,000 was taken from "about 0.2 seconds per chunk with the terrain off". A feature that
38
+ * exceeds it on its own cannot be split any further, so it becomes a chunk of that one feature.
39
+ *
40
+ * @internal
41
+ */
42
+ export const CHUNK_TARGET_VERTICES = 40000;
43
+ /**
44
+ * Target number of features per chunk for a large dataset
45
+ *
46
+ * @internal
47
+ */
48
+ export const LARGE_CHUNK_TARGET_SIZE = 4096;
49
+ /**
50
+ * The count at which the target number is raised
51
+ *
52
+ * @internal
53
+ */
54
+ export const LARGE_DATASET_THRESHOLD = 50000;
55
+ /**
56
+ * Returns the target number of features per chunk for the total count of a dataset
57
+ *
58
+ * A chunk is also the unit of drawing, so as their number grows, "switching the program and
59
+ * setting the uniforms" happens that many times per frame. Cutting 260,000 features in steps of
60
+ * 512 gives several hundred visible chunks, and that procedure costs more than the drawing
61
+ * itself.
62
+ *
63
+ * The culling gets coarser, but the bbox intersection of a chunk is cheap per frame and, coarse
64
+ * or not, the total number of vertices the GPU processes does not change (the vertices outside
65
+ * the screen are dropped at the clipping stage). The target number is therefore raised for a
66
+ * large dataset.
67
+ *
68
+ * @internal
69
+ */
70
+ export function chunkTargetSizeFor(count) {
71
+ return count > LARGE_DATASET_THRESHOLD ? LARGE_CHUNK_TARGET_SIZE : CHUNK_TARGET_SIZE;
72
+ }
73
+ /**
74
+ * Splits the rows into spatial chunks
75
+ *
76
+ * A row whose bbox is NaN (a row without a geometry) is left out.
77
+ *
78
+ * It used to be "cut the whole bbox into a grid and assign a feature to the cell its bbox center
79
+ * falls into". That form breaks as soon as a single extremely wide feature (the outline of a
80
+ * whole country, a feature crossing the date line) is mixed in. The whole bbox grows to the size
81
+ * of the world because of that one feature, and so do the cells of the grid, so everything else
82
+ * falls into a single cell. Cutting at the median evens out the counts regardless of the
83
+ * distribution. An outlier goes into its own side as a single row and does not distort the rest
84
+ * of the splitting.
85
+ *
86
+ * @param bounds The bboxes, `[minX, minY, maxX, maxY]` per row
87
+ * @param vertexCounts The number of vertices per row (the estimate of the work)
88
+ * @param targetSize The target number of rows per chunk (decided from the number of rows with a
89
+ * geometry when omitted)
90
+ *
91
+ * @internal
92
+ */
93
+ export function partitionRows(bounds, vertexCounts, targetSize) {
94
+ const rowCount = bounds.length >> 2;
95
+ const order = new Int32Array(rowCount);
96
+ let count = 0;
97
+ for (let row = 0; row < rowCount; row++) {
98
+ if (!Number.isNaN(bounds[row * 4]))
99
+ order[count++] = row;
100
+ }
101
+ if (count === 0) {
102
+ return { rows: new Int32Array(0), offsets: new Int32Array(1), bounds: new Float64Array(0) };
103
+ }
104
+ const target = targetSize ?? chunkTargetSizeFor(count);
105
+ const centerX = new Float64Array(rowCount);
106
+ const centerY = new Float64Array(rowCount);
107
+ for (let i = 0; i < count; i++) {
108
+ const at = order[i] * 4;
109
+ centerX[order[i]] = (bounds[at] + bounds[at + 2]) / 2;
110
+ centerY[order[i]] = (bounds[at + 1] + bounds[at + 3]) / 2;
111
+ }
112
+ /** The ranges of `order` that became chunks */
113
+ const ranges = [];
114
+ splitRange(0, count);
115
+ // Put the rows of each chunk back into the draw order, then order the chunks by their first row
116
+ for (const [from, to] of ranges)
117
+ order.subarray(from, to).sort();
118
+ ranges.sort((a, b) => order[a[0]] - order[b[0]]);
119
+ const rows = new Int32Array(count);
120
+ const offsets = new Int32Array(ranges.length + 1);
121
+ const chunkBounds = new Float64Array(ranges.length * 4);
122
+ let written = 0;
123
+ for (let c = 0; c < ranges.length; c++) {
124
+ const [from, to] = ranges[c];
125
+ offsets[c] = written;
126
+ let minX = Number.POSITIVE_INFINITY;
127
+ let minY = Number.POSITIVE_INFINITY;
128
+ let maxX = Number.NEGATIVE_INFINITY;
129
+ let maxY = Number.NEGATIVE_INFINITY;
130
+ for (let i = from; i < to; i++) {
131
+ const row = order[i];
132
+ rows[written++] = row;
133
+ const at = row * 4;
134
+ if (bounds[at] < minX)
135
+ minX = bounds[at];
136
+ if (bounds[at + 1] < minY)
137
+ minY = bounds[at + 1];
138
+ if (bounds[at + 2] > maxX)
139
+ maxX = bounds[at + 2];
140
+ if (bounds[at + 3] > maxY)
141
+ maxY = bounds[at + 3];
142
+ }
143
+ chunkBounds[c * 4] = minX;
144
+ chunkBounds[c * 4 + 1] = minY;
145
+ chunkBounds[c * 4 + 2] = maxX;
146
+ chunkBounds[c * 4 + 3] = maxY;
147
+ }
148
+ offsets[ranges.length] = written;
149
+ return { rows, offsets, bounds: chunkBounds };
150
+ /**
151
+ * Cuts the range [from, to) at the median down to the target count
152
+ */
153
+ function splitRange(from, to) {
154
+ const size = to - from;
155
+ if (size <= 1) {
156
+ ranges.push([from, to]);
157
+ return;
158
+ }
159
+ let vertices = 0;
160
+ for (let i = from; i < to; i++)
161
+ vertices += vertexCounts[order[i]];
162
+ if (size <= target && vertices <= CHUNK_TARGET_VERTICES) {
163
+ ranges.push([from, to]);
164
+ return;
165
+ }
166
+ // Cut along the axis with the larger extent
167
+ let minCX = Number.POSITIVE_INFINITY;
168
+ let maxCX = Number.NEGATIVE_INFINITY;
169
+ let minCY = Number.POSITIVE_INFINITY;
170
+ let maxCY = Number.NEGATIVE_INFINITY;
171
+ for (let i = from; i < to; i++) {
172
+ const row = order[i];
173
+ if (centerX[row] < minCX)
174
+ minCX = centerX[row];
175
+ if (centerX[row] > maxCX)
176
+ maxCX = centerX[row];
177
+ if (centerY[row] < minCY)
178
+ minCY = centerY[row];
179
+ if (centerY[row] > maxCY)
180
+ maxCY = centerY[row];
181
+ }
182
+ // If the centers are concentrated at a single point, cutting does not separate them (it only
183
+ // adds chunks with the same bbox), so it stops there
184
+ if (maxCX === minCX && maxCY === minCY) {
185
+ ranges.push([from, to]);
186
+ return;
187
+ }
188
+ const axis = maxCX - minCX >= maxCY - minCY ? centerX : centerY;
189
+ const mid = from + (size >> 1);
190
+ selectNth(axis, from, to, mid);
191
+ splitRange(from, mid);
192
+ splitRange(mid, to);
193
+ }
194
+ /**
195
+ * Rearranges the range so that the element at mid becomes the median (quickselect)
196
+ */
197
+ function selectNth(axis, from, to, nth) {
198
+ let lo = from;
199
+ let hi = to - 1;
200
+ while (lo < hi) {
201
+ // The middle value is used as the pivot (so that sorted input does not hit the worst case)
202
+ const pivot = axis[order[(lo + hi) >> 1]];
203
+ let i = lo;
204
+ let j = hi;
205
+ while (i <= j) {
206
+ while (axis[order[i]] < pivot)
207
+ i++;
208
+ while (axis[order[j]] > pivot)
209
+ j--;
210
+ if (i <= j) {
211
+ const swap = order[i];
212
+ order[i] = order[j];
213
+ order[j] = swap;
214
+ i++;
215
+ j--;
216
+ }
217
+ }
218
+ if (nth <= j)
219
+ hi = j;
220
+ else if (nth >= i)
221
+ lo = i;
222
+ else
223
+ return;
224
+ }
225
+ }
226
+ }
@@ -0,0 +1 @@
1
+ export {};