@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,13 @@
1
+ import type { Feature } from '../shared/types/model.js';
2
+ import type { RetainedStyleResolver } from '../view/renderers/retained.js';
3
+ /**
4
+ * Whether the analytic drape draws the polygons and lines of this feature
5
+ *
6
+ * It is paired with `collectDataset` in `view/terrain/drape/pass.ts`. Changing only one of
7
+ * them would show the selection highlight twice or in neither of them.
8
+ *
9
+ * A dashed outline does not go onto the drape (solving the accumulated distance along the outline
10
+ * from the pixels is not implemented, so drawing it as a solid line would change the appearance).
11
+ * For what does not go onto it, the immediate-mode path draws the highlight as before.
12
+ */
13
+ export declare function isHandedToDrape(feature: Feature, styles: RetainedStyleResolver): boolean;
@@ -0,0 +1,226 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { SELECTION_HIGHLIGHT_COLOR, SELECTION_HIGHLIGHT_FILL_OPACITY, SELECTION_HIGHLIGHT_RING_EXTRA, SELECTION_HIGHLIGHT_STROKE_EXTRA, } from '../shared/config/selection-highlight.js';
4
+ import { getBoundingBox } from '../shared/utils/feature-bbox.js';
5
+ import { getStyleRuleChannel } from '../view/style-rule.js';
6
+ import { isDrapePaintedDataset } from '../view/terrain/state.js';
7
+ import { boundsIntersect } from './chunk.js';
8
+ import { pointMarkerRadiusPx, worldUnitsPerPixel } from './thinning.js';
9
+ /** Default line width (the same as lineString.stroke.width of feature-style) */
10
+ const DEFAULT_STROKE_WIDTH = 2;
11
+ /** Default radius of a point (half of point.point.size 12 of feature-style) */
12
+ const DEFAULT_POINT_RADIUS = 6;
13
+ /**
14
+ * Overpaints the selected features with the highlight
15
+ *
16
+ * Neither the retained batches nor the reused features are touched. It only overdraws on the
17
+ * same immediate-mode path as fallback, so switching the selection never rebuilds a GPU
18
+ * resource.
19
+ *
20
+ * A point is drawn as "a point of the key color slightly larger than the original → the
21
+ * original point", so that the difference shows as a ring. Lines and polygons are painted over
22
+ * in the key color.
23
+ *
24
+ * While the polygons and lines are handed to the analytic drape, however, their highlight is
25
+ * not drawn here (the drape draws it as ground pixels; `isHandedToDrape`). The immediate-mode
26
+ * path only subdivides along the terrain inside the region of the subdivision (the DEM atlas ∩
27
+ * the view), so drawing a surface the size of a prefecture here would leave everything outside
28
+ * that region as flat triangles and turn into "a red vertical wall" and "a wrong fan-shaped
29
+ * coverage". The test for the hand-over is paired with the drape side (collectDataset in
30
+ * `drape/pass.ts`), so in the band where the feature itself appears the highlight always
31
+ * appears too.
32
+ *
33
+ * @internal
34
+ */
35
+ export function drawSelectionHighlight(input) {
36
+ const { target, projectionData, zoom, bounds, styles } = input;
37
+ if (input.selected.length === 0)
38
+ return;
39
+ const visible = input.selected.filter((feature) => feature.visible && boundsIntersect(getBoundingBox(feature), bounds));
40
+ if (visible.length === 0)
41
+ return;
42
+ target.beginFrame(projectionData, zoom);
43
+ for (const feature of visible) {
44
+ const prepared = input.prepare(feature);
45
+ // The hand-over decision (drapedFills) switches a few frames late, so looking only at it
46
+ // would let the immediate path draw the highlight while the drape is already painting. The
47
+ // immediate path does not subdivide outside the region of the subdivision, so a surface as
48
+ // large as a prefecture or a city becomes a flat plate there, floats off the terrain and
49
+ // raises a vertical wall. Whether it is actually painting is looked at as well
50
+ const draped = input.drapedFills || isDrapePaintedDataset(input.terrain, input.datasetId);
51
+ if (draped && styles && isHandedToDrape(prepared, styles)) {
52
+ continue;
53
+ }
54
+ target.processFeature(highlightFeature(prepared), false);
55
+ // To make a point look like a ring, the original point is drawn again over the highlight.
56
+ // For a point drawn by an external renderer the overpaint is skipped and only the halo
57
+ // underneath is left (the picture of the external renderer is drawn above core, so the
58
+ // result is a selection halo behind that picture)
59
+ if (getStyleRuleChannel(prepared.type) === 'point' && !input.isExternalPoint(prepared)) {
60
+ target.processFeature(prepared, false);
61
+ }
62
+ }
63
+ target.endFrame();
64
+ }
65
+ /**
66
+ * Returns the frontmost hit (the feature as stored, without the styles applied, and its row)
67
+ *
68
+ * The candidates are narrowed with the spatial index and tested precisely from the back of the
69
+ * draw order (the front).
70
+ *
71
+ * A point is "grabbable anywhere inside the marker that is drawn". A marker is drawn at the
72
+ * size of the radius + the white outline multiplied by the zoom-dependent factor, and depending
73
+ * on what the host specifies and on the factor it gets far larger than the click tolerance.
74
+ * Deciding by the tolerance alone would miss even a click inside a clearly visible circle (the
75
+ * tolerance passed in is kept as a lower bound).
76
+ *
77
+ * @internal
78
+ */
79
+ export function hitTestDisplayFeatures(input) {
80
+ const { coordinate, toleranceLngLat, baseStyle, pointDefaults: defaults, scale } = input;
81
+ const degreesPerPixel = worldUnitsPerPixel(input.zoom) * 360;
82
+ // The narrowing of the index is widened to the range the largest marker reaches
83
+ const maxPointRadius = Math.max(pointMarkerRadiusPx(undefined, baseStyle, defaults, scale), input.maxStylePointRadius > 0
84
+ ? pointMarkerRadiusPx(input.maxStylePointRadius, baseStyle, defaults, scale)
85
+ : 0);
86
+ const reach = Math.max(toleranceLngLat, maxPointRadius * degreesPerPixel);
87
+ const bounds = {
88
+ minX: coordinate[0] - reach,
89
+ minY: coordinate[1] - reach,
90
+ maxX: coordinate[0] + reach,
91
+ maxY: coordinate[1] + reach,
92
+ };
93
+ const candidates = input.search(bounds);
94
+ for (let i = candidates.length - 1; i >= 0; i--) {
95
+ const row = candidates[i];
96
+ // What has been thinned away and is not visible cannot be grabbed
97
+ if (!input.isDrawn(row))
98
+ continue;
99
+ const feature = input.featureAt(row);
100
+ if (!feature.visible)
101
+ continue;
102
+ const tolerance = getStyleRuleChannel(feature.type) === 'point'
103
+ ? Math.max(toleranceLngLat, pointMarkerRadiusPx(feature.style?.pointRadius, baseStyle, defaults, scale) *
104
+ degreesPerPixel)
105
+ : toleranceLngLat;
106
+ if (input.test(feature, coordinate, tolerance))
107
+ return { feature, row };
108
+ }
109
+ return null;
110
+ }
111
+ /**
112
+ * Measures the largest point radius given by an individual style (0 when none is given)
113
+ *
114
+ * It is used to decide the range that narrows the hit test candidates. Only the points are
115
+ * walked.
116
+ *
117
+ * @internal
118
+ */
119
+ export function maxStylePointRadiusOf(features) {
120
+ let max = 0;
121
+ for (const feature of features) {
122
+ if (getStyleRuleChannel(feature.type) !== 'point')
123
+ continue;
124
+ const radius = feature.style?.pointRadius;
125
+ if (radius !== undefined && radius > max)
126
+ max = radius;
127
+ }
128
+ return max;
129
+ }
130
+ /**
131
+ * Checks whether two feature lists have the same set of ids
132
+ *
133
+ * It is used for the diff test of the selection. The order is determined by the draw order, so
134
+ * if the sets are the same the order is the same too.
135
+ *
136
+ * @internal
137
+ */
138
+ export function sameFeatureIds(a, b) {
139
+ if (a.length !== b.length)
140
+ return false;
141
+ for (let i = 0; i < a.length; i++) {
142
+ if (a[i].id !== b[i].id)
143
+ return false;
144
+ }
145
+ return true;
146
+ }
147
+ /**
148
+ * Whether the analytic drape draws the polygons and lines of this feature
149
+ *
150
+ * It is paired with `collectDataset` in `view/terrain/drape/pass.ts`. Changing only one of
151
+ * them would show the selection highlight twice or in neither of them.
152
+ *
153
+ * A dashed outline does not go onto the drape (solving the accumulated distance along the outline
154
+ * from the pixels is not implemented, so drawing it as a solid line would change the appearance).
155
+ * For what does not go onto it, the immediate-mode path draws the highlight as before.
156
+ */
157
+ export function isHandedToDrape(feature, styles) {
158
+ if (feature.type === 'Polygon' || feature.type === 'MultiPolygon') {
159
+ const { fillColor, strokeStyle } = styles.getPolygonStyles(feature);
160
+ const hasStroke = strokeStyle.opacity > 0 && strokeStyle.width > 0;
161
+ if (hasStroke && strokeStyle.lineStyle !== 'solid')
162
+ return false;
163
+ return hasStroke || fillColor[3] > 0;
164
+ }
165
+ if (feature.type === 'LineString' ||
166
+ feature.type === 'MultiLineString' ||
167
+ feature.type === 'Freehand') {
168
+ const strokeStyle = styles.getLineStringStrokeStyle(feature);
169
+ if (strokeStyle.lineStyle !== 'solid')
170
+ return false;
171
+ return strokeStyle.opacity > 0 && strokeStyle.width > 0;
172
+ }
173
+ return false;
174
+ }
175
+ /**
176
+ * Returns a feature whose style is overwritten for the selection highlight
177
+ *
178
+ * Neither the original feature nor the cache is rewritten; a copy with only the style replaced is
179
+ * made. The painting is split by the channel of the geometry type (the same vocabulary as the
180
+ * rule colors).
181
+ *
182
+ * - Point: a point of the key color with the original radius + 3px (the original point is drawn
183
+ * on top of it to make a ring)
184
+ * - Line: a line of the key color with the original width + 2px
185
+ * - Polygon: a translucent fill of the key color and a frame of the key color with the original
186
+ * width + 2px
187
+ *
188
+ * @internal
189
+ */
190
+ export function highlightFeature(feature) {
191
+ const style = feature.style;
192
+ const channel = getStyleRuleChannel(feature.type);
193
+ if (channel === 'point') {
194
+ return {
195
+ ...feature,
196
+ style: {
197
+ ...style,
198
+ pointColor: SELECTION_HIGHLIGHT_COLOR,
199
+ pointRadius: (style?.pointRadius ?? DEFAULT_POINT_RADIUS) + SELECTION_HIGHLIGHT_RING_EXTRA,
200
+ },
201
+ };
202
+ }
203
+ const strokeWidth = (style?.strokeWidth ?? DEFAULT_STROKE_WIDTH) + SELECTION_HIGHLIGHT_STROKE_EXTRA;
204
+ if (channel === 'stroke') {
205
+ return {
206
+ ...feature,
207
+ style: {
208
+ ...style,
209
+ strokeColor: SELECTION_HIGHLIGHT_COLOR,
210
+ strokeOpacity: 1,
211
+ strokeWidth,
212
+ },
213
+ };
214
+ }
215
+ return {
216
+ ...feature,
217
+ style: {
218
+ ...style,
219
+ fillColor: SELECTION_HIGHLIGHT_COLOR,
220
+ fillOpacity: SELECTION_HIGHLIGHT_FILL_OPACITY,
221
+ strokeColor: SELECTION_HIGHLIGHT_COLOR,
222
+ strokeOpacity: 1,
223
+ strokeWidth,
224
+ },
225
+ };
226
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,119 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { computeFeatureBounds, partitionIntoChunks } from './chunk.js';
4
+ import { chunkTargetSizeFor } from './partition.js';
5
+ import { collectFeatures } from './retained.js';
6
+ import { maxStylePointRadiusOf } from './selection.js';
7
+ import { DisplaySpatialIndex } from './spatial.js';
8
+ import { featureThinningRole } from './thinning.js';
9
+ /**
10
+ * The contents given as an array of features
11
+ *
12
+ * @internal
13
+ */
14
+ export class FeatureArraySource {
15
+ /**
16
+ * @param list The normalized features, in draw order
17
+ */
18
+ constructor(list) {
19
+ Object.defineProperty(this, "list", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: list
24
+ });
25
+ Object.defineProperty(this, "length", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ Object.defineProperty(this, "bounds", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: void 0
36
+ });
37
+ Object.defineProperty(this, "chunks", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: void 0
42
+ });
43
+ Object.defineProperty(this, "index", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: new DisplaySpatialIndex()
48
+ });
49
+ Object.defineProperty(this, "maxStylePointRadius", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: void 0
54
+ });
55
+ /** The row of each id, built on the first request */
56
+ Object.defineProperty(this, "rowById", {
57
+ enumerable: true,
58
+ configurable: true,
59
+ writable: true,
60
+ value: null
61
+ });
62
+ this.length = list.length;
63
+ // The bboxes are shared by the spatial index and the chunk splitting (not computed twice)
64
+ this.bounds = computeFeatureBounds(list);
65
+ this.index.load(this.bounds);
66
+ this.chunks = partitionIntoChunks(list, chunkTargetSizeFor(list.length), this.bounds);
67
+ this.maxStylePointRadius = maxStylePointRadiusOf(list);
68
+ }
69
+ hasGeometry(row) {
70
+ return !Number.isNaN(this.bounds[row * 4]);
71
+ }
72
+ featureAt(row) {
73
+ return this.list[row];
74
+ }
75
+ idOf(row) {
76
+ return this.list[row].id;
77
+ }
78
+ typeOf(row) {
79
+ return this.hasGeometry(row) ? this.list[row].type : null;
80
+ }
81
+ rowsOfIds(ids) {
82
+ const rows = [];
83
+ if (ids.size === 0)
84
+ return rows;
85
+ for (let row = 0; row < this.list.length; row++) {
86
+ if (ids.has(this.list[row].id))
87
+ rows.push(row);
88
+ }
89
+ return rows;
90
+ }
91
+ rowOfId(id) {
92
+ if (!this.rowById) {
93
+ const map = new Map();
94
+ for (let row = 0; row < this.list.length; row++)
95
+ map.set(this.list[row].id, row);
96
+ this.rowById = map;
97
+ }
98
+ return this.rowById.get(id) ?? -1;
99
+ }
100
+ features() {
101
+ return this.list;
102
+ }
103
+ thinningRole(row) {
104
+ return featureThinningRole(this.list[row]);
105
+ }
106
+ pointOf(row) {
107
+ return this.list[row].coordinates;
108
+ }
109
+ styleRadiusOf(row) {
110
+ return this.list[row].style?.pointRadius;
111
+ }
112
+ collector(rows, context) {
113
+ const list = this.list;
114
+ return collectFeatures(rows.length, (index) => {
115
+ const row = rows[index];
116
+ return context.isDrawn(row) ? context.styler.prepareIfStyled(list[row]) : null;
117
+ }, context);
118
+ }
119
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { buildPackedRTree, searchPackedRTree } from './packed-rtree.js';
4
+ /**
5
+ * Spatial index of a dataset
6
+ *
7
+ * @internal
8
+ */
9
+ export class DisplaySpatialIndex {
10
+ constructor() {
11
+ Object.defineProperty(this, "tree", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: null
16
+ });
17
+ }
18
+ /** Number of rows stored */
19
+ get size() {
20
+ return this.tree?.numItems ?? 0;
21
+ }
22
+ /**
23
+ * Builds the tree over the bboxes of the rows (the existing contents are discarded)
24
+ *
25
+ * @param bounds `[minX, minY, maxX, maxY]` per row (a NaN row is left out)
26
+ */
27
+ load(bounds) {
28
+ this.tree = buildPackedRTree(bounds);
29
+ }
30
+ /** Takes a tree built elsewhere (in a Worker, for example) */
31
+ adopt(tree) {
32
+ this.tree = tree;
33
+ }
34
+ /**
35
+ * Returns the rows whose bbox intersects the bounding box, in draw order
36
+ */
37
+ search(bounds) {
38
+ if (!this.tree)
39
+ return [];
40
+ const rows = searchPackedRTree(this.tree, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);
41
+ rows.sort((a, b) => a - b);
42
+ return rows;
43
+ }
44
+ /**
45
+ * Returns the rows whose bbox intersects the bounding box and that `keep` accepts, in draw order
46
+ *
47
+ * The rows are filtered before they are sorted, so a filter that drops most of what is in the
48
+ * range keeps the sort as small as what is kept.
49
+ */
50
+ searchWhere(bounds, keep) {
51
+ if (!this.tree)
52
+ return new Int32Array(0);
53
+ const hits = searchPackedRTree(this.tree, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);
54
+ const rows = new Int32Array(hits.length);
55
+ let count = 0;
56
+ for (let i = 0; i < hits.length; i++) {
57
+ const row = hits[i];
58
+ if (keep(row))
59
+ rows[count++] = row;
60
+ }
61
+ const kept = count === rows.length ? rows : rows.slice(0, count);
62
+ // A typed array sorts its numbers by value
63
+ return kept.sort();
64
+ }
65
+ /**
66
+ * Empties the index
67
+ */
68
+ clear() {
69
+ this.tree = null;
70
+ }
71
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,126 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { StyleRuleCache } from '../view/cache/style-rule.js';
4
+ import { applyRuleColor, getStyleRuleChannel } from '../view/style-rule.js';
5
+ /**
6
+ * The rule and the base style of a dataset, and the features carrying them
7
+ *
8
+ * The features carrying the rule colors are reused per id (so that they are not copied every
9
+ * frame). Whoever changes what they depend on (the rule, the base style, the contents) calls
10
+ * `clear()`.
11
+ *
12
+ * @internal
13
+ */
14
+ export class DisplayFeatureStyler {
15
+ constructor(styleRule, baseStyle) {
16
+ Object.defineProperty(this, "styleRule", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: void 0
21
+ });
22
+ /** Base style per dataset (per channel) */
23
+ Object.defineProperty(this, "baseStyle", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ Object.defineProperty(this, "styleCache", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: new StyleRuleCache()
34
+ });
35
+ /** Reuse of the features carrying the rule colors (to avoid copying them every frame) */
36
+ Object.defineProperty(this, "preparedCache", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: new Map()
41
+ });
42
+ this.styleRule = styleRule;
43
+ this.baseStyle = baseStyle;
44
+ }
45
+ /** The base style (undefined when not set) */
46
+ get base() {
47
+ return this.baseStyle;
48
+ }
49
+ /** The style rule (undefined when not set) */
50
+ get rule() {
51
+ return this.styleRule;
52
+ }
53
+ /** Whether a rule or a base style is set (without either, a feature is returned as it is) */
54
+ get isStyled() {
55
+ return Boolean(this.styleRule) || Boolean(this.baseStyle);
56
+ }
57
+ /** Replaces the rule and discards the caches */
58
+ setRule(rule) {
59
+ this.styleRule = rule;
60
+ this.clear();
61
+ }
62
+ /**
63
+ * Replaces the base style and discards the caches
64
+ *
65
+ * The cache of the rule colors does not depend on the base style, but it is discarded together
66
+ * with it, to keep the handling in step with setRule.
67
+ */
68
+ setBase(style) {
69
+ this.baseStyle = style;
70
+ this.clear();
71
+ }
72
+ /** Discards the evaluation results and the reused features */
73
+ clear() {
74
+ this.styleCache.clear();
75
+ this.preparedCache.clear();
76
+ }
77
+ /**
78
+ * Returns the feature carrying the rule color and the base style
79
+ *
80
+ * When the individual style has a color for that channel, the rule has no effect
81
+ * (applyRuleColor returns the same reference). The base style goes underneath the rule color
82
+ * and the individual style, so it is spread first and overwritten afterwards. Only when neither
83
+ * the rule nor the base style had any effect is the original feature returned as it is.
84
+ */
85
+ prepare(feature) {
86
+ const cached = this.preparedCache.get(feature.id);
87
+ if (cached)
88
+ return cached;
89
+ const channel = getStyleRuleChannel(feature.type);
90
+ const ruleColor = this.styleCache.resolve(feature, this.styleRule);
91
+ const style = this.effectiveStyle(feature.style, ruleColor, channel);
92
+ const prepared = style === feature.style ? feature : { ...feature, style };
93
+ this.preparedCache.set(feature.id, prepared);
94
+ return prepared;
95
+ }
96
+ /**
97
+ * The style that `prepare` gives a feature: the individual style over the rule color over the
98
+ * base style of the channel
99
+ *
100
+ * @param style The individual style (undefined for none)
101
+ * @param ruleColor The rule color (null without a rule)
102
+ */
103
+ effectiveStyle(style, ruleColor, channel) {
104
+ const styled = applyRuleColor(style, ruleColor, channel);
105
+ const base = this.baseStyle?.[channel];
106
+ return base ? { ...base, ...styled } : styled;
107
+ }
108
+ /** Like `prepare`, but returns the feature as it is when nothing is set */
109
+ prepareIfStyled(feature) {
110
+ return this.isStyled ? this.prepare(feature) : feature;
111
+ }
112
+ /**
113
+ * Returns the array of features carrying the rule colors and the base style
114
+ *
115
+ * The original array is returned as it is when neither the rule nor the base style is set.
116
+ */
117
+ prepareAll(features) {
118
+ if (!this.isStyled)
119
+ return features;
120
+ const result = new Array(features.length);
121
+ for (let i = 0; i < features.length; i++) {
122
+ result[i] = this.prepare(features[i]);
123
+ }
124
+ return result;
125
+ }
126
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The collision thinning of the point markers of a dataset, as the host
3
+ * passes it.
4
+ *
5
+ * Everything can be omitted, and an omitted item takes its default value. While it is
6
+ * enabled, `Point` markers that overlap on screen are not drawn and cannot be hit; lines,
7
+ * polygons and MultiPoint are always drawn. The overlap is tested with the size actually drawn
8
+ * (the radius + the outline + `marginPx`), and the winners are picked greedily from the front
9
+ * of the draw order for each integer zoom band, so panning does not swap them.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const places = draw.addDataset({
14
+ * id: 'places',
15
+ * features,
16
+ * collisionThinning: { enabled: true, fullDisplayZoom: 17, marginPx: 2 },
17
+ * });
18
+ * const { total, visible } = places.getThinningStats(); // "showing 1,200 of 50,000"
19
+ * ```
20
+ */
21
+ export interface DatasetCollisionThinning {
22
+ /** Whether the thinning is enabled (false by default = everything is drawn as before) */
23
+ enabled?: boolean;
24
+ /**
25
+ * The zoom at which the thinning stops (17 by default)
26
+ *
27
+ * At or above this zoom the set of winners becomes every feature. It is an escape hatch that
28
+ * avoids "something in the source data can never be seen no matter what", and it can be
29
+ * changed at runtime because it is decided by looking at the real thing.
30
+ */
31
+ fullDisplayZoom?: number;
32
+ /**
33
+ * Margin added around each marker's footprint, in screen px (2 by default; NaN or a negative
34
+ * value gives 2)
35
+ */
36
+ marginPx?: number;
37
+ }
38
+ /**
39
+ * The collision thinning in effect, with every default filled in, as
40
+ * {@link Dataset.getCollisionThinning} returns it.
41
+ */
42
+ export interface ResolvedCollisionThinning {
43
+ /** Whether the thinning is enabled */
44
+ enabled: boolean;
45
+ /** The zoom at or above which every feature is drawn */
46
+ fullDisplayZoom: number;
47
+ /** The margin added around each marker's footprint, in screen px */
48
+ marginPx: number;
49
+ }
50
+ /**
51
+ * The current result of the collision thinning, as {@link Dataset.getThinningStats}
52
+ * returns it; for a message such as "showing n of N".
53
+ */
54
+ export interface DatasetThinningStats {
55
+ /** Whether it is enabled as a setting */
56
+ enabled: boolean;
57
+ /** Whether it is actually thinning (the band is below fullDisplayZoom and winners exist) */
58
+ active: boolean;
59
+ /** The number of all the features held */
60
+ total: number;
61
+ /** The number of features drawn (the same as total when nothing is thinned) */
62
+ visible: number;
63
+ /** The zoom band the winners were picked for (null when not computed or disabled) */
64
+ band: number | null;
65
+ }