@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,115 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * ImageHitTestStrategy
5
+ *
6
+ * Hit testing strategy for image features.
7
+ * It tests using an OBB (Oriented Bounding Box).
8
+ */
9
+ import { createOBB, DEFAULT_TILE_SIZE, distanceToOBB, getMetersPerPixel, metersToDegreesLat, metersToDegreesLng, } from '../../../shared/math/index.js';
10
+ import { getImageProperties } from '../../../shared/utils/property.js';
11
+ /**
12
+ * Default image style
13
+ * width/height: 0 = use the original size (the same as ImageRenderer)
14
+ */
15
+ const DEFAULT_IMAGE_STYLE = {
16
+ width: 0,
17
+ height: 0,
18
+ rotation: 0,
19
+ opacity: 1.0,
20
+ imageOpacity: 1,
21
+ };
22
+ /**
23
+ * ImageHitTestStrategy
24
+ */
25
+ export class ImageHitTestStrategy {
26
+ constructor(tileSize = DEFAULT_TILE_SIZE) {
27
+ Object.defineProperty(this, "geometryType", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: 'Image'
32
+ });
33
+ Object.defineProperty(this, "tileSize", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: void 0
38
+ });
39
+ this.tileSize = tileSize;
40
+ }
41
+ /**
42
+ * Updates the tile size
43
+ */
44
+ setTileSize(tileSize) {
45
+ this.tileSize = tileSize;
46
+ }
47
+ test(feature, coordinate, toleranceLngLat) {
48
+ if (feature.type !== 'Image')
49
+ return false;
50
+ const dims = this.computeDims(feature);
51
+ if (!dims)
52
+ return false;
53
+ // The rendered image (computeQuadVertices) is rotated in latitude-normalized space.
54
+ // Unless the hit test also rotates and tests in latitude-normalized space, rotating in
55
+ // raw degree space shears the shape because of the real distance difference along the
56
+ // longitude axis, and part of a rotated image becomes impossible to click.
57
+ const { center, widthDeg, heightDeg, rotation } = dims;
58
+ const latCos = Math.cos((center[1] * Math.PI) / 180);
59
+ const dxNorm = (coordinate[0] - center[0]) * latCos;
60
+ const dyNorm = coordinate[1] - center[1];
61
+ const r = (-rotation * Math.PI) / 180;
62
+ const cos = Math.cos(r);
63
+ const sin = Math.sin(r);
64
+ const localX = dxNorm * cos - dyNorm * sin;
65
+ const localY = dxNorm * sin + dyNorm * cos;
66
+ const hwNorm = (widthDeg / 2) * latCos;
67
+ const hhNorm = heightDeg / 2;
68
+ const tolNorm = toleranceLngLat * latCos;
69
+ return Math.abs(localX) <= hwNorm + tolNorm && Math.abs(localY) <= hhNorm + tolNorm;
70
+ }
71
+ distance(feature, coordinate) {
72
+ if (feature.type !== 'Image')
73
+ return Infinity;
74
+ const dims = this.computeDims(feature);
75
+ if (!dims)
76
+ return Infinity;
77
+ // The distance is only used to decide which hit is in front (ordering). An OBB
78
+ // approximation is enough.
79
+ const obb = createOBB(dims.center[0], dims.center[1], dims.widthDeg, dims.heightDeg, dims.rotation);
80
+ return distanceToOBB(obb, coordinate);
81
+ }
82
+ /**
83
+ * Computes the dimensions (in degrees) and the rotation of an image feature
84
+ *
85
+ * It uses the same size computation logic as ImageRenderer
86
+ */
87
+ computeDims(feature) {
88
+ const properties = getImageProperties(feature);
89
+ if (!properties.imageFileId)
90
+ return null;
91
+ const coord = feature.coordinates;
92
+ const latitude = coord[1];
93
+ const style = { ...DEFAULT_IMAGE_STYLE, ...feature.style };
94
+ // Get the image size (the same logic as ImageRenderer)
95
+ // The size stored in ImageProperties takes precedence
96
+ // 100 is used as the fallback (for when the image has not been loaded)
97
+ const imageWidth = properties.imageWidth || 100;
98
+ const imageHeight = properties.imageHeight || 100;
99
+ // Use the size specified by the style, or the original size
100
+ const displayWidth = style.width || imageWidth;
101
+ const displayHeight = style.height || imageHeight;
102
+ // Compute the size based on the display at createdZoom
103
+ const createdZoom = properties.createdZoom || 14;
104
+ const scale = properties.scale || 1;
105
+ // Pixel to meter conversion at createdZoom
106
+ const widthMeters = getMetersPerPixel(latitude, createdZoom, this.tileSize) * displayWidth * scale;
107
+ const heightMeters = getMetersPerPixel(latitude, createdZoom, this.tileSize) * displayHeight * scale;
108
+ // Convert meters to degrees
109
+ const widthDeg = metersToDegreesLng(widthMeters, latitude);
110
+ const heightDeg = metersToDegreesLat(heightMeters);
111
+ // Rotation angle (the sum of both the style and the properties)
112
+ const rotation = (style.rotation || 0) + (properties.rotation || 0);
113
+ return { center: coord, widthDeg, heightDeg, rotation };
114
+ }
115
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hit Test Strategies
3
+ */
4
+ export type { HitTestOptions, HitTestResult, HitTestStrategy, VertexHit } from './base.js';
5
+ export { DEFAULT_HIT_TEST_OPTIONS, HitTestStrategyRegistry } from './base.js';
6
+ export { CircleHitTestStrategy } from './circle.js';
7
+ export { ImageHitTestStrategy } from './image.js';
8
+ export { LineHitTestStrategy } from './line.js';
9
+ export { MultiLineStringHitTestStrategy, MultiPointHitTestStrategy, MultiPolygonHitTestStrategy, } from './multi.js';
10
+ export { PointHitTestStrategy } from './point.js';
11
+ export { PolygonHitTestStrategy } from './polygon.js';
@@ -0,0 +1,10 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export { DEFAULT_HIT_TEST_OPTIONS, HitTestStrategyRegistry } from './base.js';
4
+ // Strategies per geometry type
5
+ export { CircleHitTestStrategy } from './circle.js';
6
+ export { ImageHitTestStrategy } from './image.js';
7
+ export { LineHitTestStrategy } from './line.js';
8
+ export { MultiLineStringHitTestStrategy, MultiPointHitTestStrategy, MultiPolygonHitTestStrategy, } from './multi.js';
9
+ export { PointHitTestStrategy } from './point.js';
10
+ export { PolygonHitTestStrategy } from './polygon.js';
@@ -0,0 +1,17 @@
1
+ /**
2
+ * LineHitTestStrategy
3
+ *
4
+ * Hit testing strategy for LineString features.
5
+ * Distances are measured in the local frame of hit testing (local-frame.ts).
6
+ */
7
+ import type { Coordinate, Feature, FeatureType } from '../../../store/types.js';
8
+ import type { HitTestStrategy } from './base.js';
9
+ /**
10
+ * Hit testing strategy for the LineString type
11
+ */
12
+ export declare class LineHitTestStrategy implements HitTestStrategy {
13
+ readonly geometryType: FeatureType;
14
+ test(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): boolean;
15
+ distance(feature: Feature, coordinate: Coordinate): number;
16
+ testDistance(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): number | null;
17
+ }
@@ -0,0 +1,30 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { latitudeScale, localPointToPolylineDistance } from '../local-frame.js';
4
+ import { polylineDistanceWithin } from '../segment-grid.js';
5
+ /**
6
+ * Hit testing strategy for the LineString type
7
+ */
8
+ export class LineHitTestStrategy {
9
+ constructor() {
10
+ Object.defineProperty(this, "geometryType", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: 'LineString'
15
+ });
16
+ }
17
+ test(feature, coordinate, toleranceLngLat) {
18
+ return this.testDistance(feature, coordinate, toleranceLngLat) !== null;
19
+ }
20
+ distance(feature, coordinate) {
21
+ const lineCoords = feature.coordinates;
22
+ // The nearest distance without a tolerance cannot be answered by the index, so this
23
+ // stays a full scan
24
+ return localPointToPolylineDistance(coordinate, lineCoords, latitudeScale(coordinate[1]));
25
+ }
26
+ testDistance(feature, coordinate, toleranceLngLat) {
27
+ const lineCoords = feature.coordinates;
28
+ return polylineDistanceWithin(lineCoords, coordinate, toleranceLngLat, latitudeScale(coordinate[1]));
29
+ }
30
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Hit testing strategies for the Multi geometries
3
+ *
4
+ * MultiPoint / MultiLineString / MultiPolygon are tested as "a hit if any part is hit"
5
+ * and "the distance is the minimum over the parts". The test logic itself reuses the
6
+ * strategy of the single geometry for each part. Distances are measured in the local frame
7
+ * of hit testing (local-frame.ts).
8
+ */
9
+ import type { Coordinate, Feature, FeatureType } from '../../../store/types.js';
10
+ import type { HitTestStrategy } from './base.js';
11
+ /**
12
+ * Hit testing strategy for the MultiPoint type
13
+ *
14
+ * The coordinates are `Coordinate[]` (one part = one point).
15
+ */
16
+ export declare class MultiPointHitTestStrategy implements HitTestStrategy {
17
+ readonly geometryType: FeatureType;
18
+ test(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): boolean;
19
+ distance(feature: Feature, coordinate: Coordinate): number;
20
+ }
21
+ /**
22
+ * Hit testing strategy for the MultiLineString type
23
+ *
24
+ * The coordinates are `Coordinate[][]` (one part = one polyline).
25
+ */
26
+ export declare class MultiLineStringHitTestStrategy implements HitTestStrategy {
27
+ readonly geometryType: FeatureType;
28
+ test(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): boolean;
29
+ distance(feature: Feature, coordinate: Coordinate): number;
30
+ testDistance(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): number | null;
31
+ }
32
+ /**
33
+ * Hit testing strategy for the MultiPolygon type
34
+ *
35
+ * The coordinates are `Coordinate[][][]` (one part = an array of rings, where rings[0] is
36
+ * the outer ring and the rest are inner rings).
37
+ */
38
+ export declare class MultiPolygonHitTestStrategy implements HitTestStrategy {
39
+ readonly geometryType: FeatureType;
40
+ private readonly polygonStrategy;
41
+ test(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): boolean;
42
+ distance(feature: Feature, coordinate: Coordinate): number;
43
+ testDistance(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): number | null;
44
+ }
@@ -0,0 +1,141 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { latitudeScale, localDistance, localPointToPolylineDistance } from '../local-frame.js';
4
+ import { polylineDistanceWithin } from '../segment-grid.js';
5
+ import { PolygonHitTestStrategy } from './polygon.js';
6
+ /**
7
+ * Hit testing strategy for the MultiPoint type
8
+ *
9
+ * The coordinates are `Coordinate[]` (one part = one point).
10
+ */
11
+ export class MultiPointHitTestStrategy {
12
+ constructor() {
13
+ Object.defineProperty(this, "geometryType", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: 'MultiPoint'
18
+ });
19
+ }
20
+ test(feature, coordinate, toleranceLngLat) {
21
+ const parts = feature.coordinates;
22
+ const latScale = latitudeScale(coordinate[1]);
23
+ for (const part of parts) {
24
+ if (localDistance(coordinate, part, latScale) <= toleranceLngLat) {
25
+ return true;
26
+ }
27
+ }
28
+ return false;
29
+ }
30
+ distance(feature, coordinate) {
31
+ const parts = feature.coordinates;
32
+ const latScale = latitudeScale(coordinate[1]);
33
+ let min = Number.POSITIVE_INFINITY;
34
+ for (const part of parts) {
35
+ min = Math.min(min, localDistance(coordinate, part, latScale));
36
+ }
37
+ return min;
38
+ }
39
+ }
40
+ /**
41
+ * Hit testing strategy for the MultiLineString type
42
+ *
43
+ * The coordinates are `Coordinate[][]` (one part = one polyline).
44
+ */
45
+ export class MultiLineStringHitTestStrategy {
46
+ constructor() {
47
+ Object.defineProperty(this, "geometryType", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: 'MultiLineString'
52
+ });
53
+ }
54
+ test(feature, coordinate, toleranceLngLat) {
55
+ const parts = feature.coordinates;
56
+ const latScale = latitudeScale(coordinate[1]);
57
+ for (const part of parts) {
58
+ if (part.length === 0)
59
+ continue;
60
+ if (localPointToPolylineDistance(coordinate, part, latScale) <= toleranceLngLat) {
61
+ return true;
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ distance(feature, coordinate) {
67
+ const parts = feature.coordinates;
68
+ const latScale = latitudeScale(coordinate[1]);
69
+ let min = Number.POSITIVE_INFINITY;
70
+ for (const part of parts) {
71
+ if (part.length === 0)
72
+ continue;
73
+ min = Math.min(min, localPointToPolylineDistance(coordinate, part, latScale));
74
+ }
75
+ return min;
76
+ }
77
+ testDistance(feature, coordinate, toleranceLngLat) {
78
+ const parts = feature.coordinates;
79
+ const latScale = latitudeScale(coordinate[1]);
80
+ let min = Number.POSITIVE_INFINITY;
81
+ for (const part of parts) {
82
+ if (part.length === 0)
83
+ continue;
84
+ const distance = polylineDistanceWithin(part, coordinate, toleranceLngLat, latScale);
85
+ if (distance !== null && distance < min) {
86
+ min = distance;
87
+ }
88
+ }
89
+ return min <= toleranceLngLat ? min : null;
90
+ }
91
+ }
92
+ /**
93
+ * Hit testing strategy for the MultiPolygon type
94
+ *
95
+ * The coordinates are `Coordinate[][][]` (one part = an array of rings, where rings[0] is
96
+ * the outer ring and the rest are inner rings).
97
+ */
98
+ export class MultiPolygonHitTestStrategy {
99
+ constructor() {
100
+ Object.defineProperty(this, "geometryType", {
101
+ enumerable: true,
102
+ configurable: true,
103
+ writable: true,
104
+ value: 'MultiPolygon'
105
+ });
106
+ Object.defineProperty(this, "polygonStrategy", {
107
+ enumerable: true,
108
+ configurable: true,
109
+ writable: true,
110
+ value: new PolygonHitTestStrategy()
111
+ });
112
+ }
113
+ test(feature, coordinate, toleranceLngLat) {
114
+ const parts = feature.coordinates;
115
+ for (const rings of parts) {
116
+ if (this.polygonStrategy.testRings(rings, coordinate, toleranceLngLat)) {
117
+ return true;
118
+ }
119
+ }
120
+ return false;
121
+ }
122
+ distance(feature, coordinate) {
123
+ const parts = feature.coordinates;
124
+ let min = Number.POSITIVE_INFINITY;
125
+ for (const rings of parts) {
126
+ min = Math.min(min, this.polygonStrategy.distanceToRings(rings, coordinate));
127
+ }
128
+ return min;
129
+ }
130
+ testDistance(feature, coordinate, toleranceLngLat) {
131
+ const parts = feature.coordinates;
132
+ let min = Number.POSITIVE_INFINITY;
133
+ for (const rings of parts) {
134
+ const distance = this.polygonStrategy.testDistanceRings(rings, coordinate, toleranceLngLat);
135
+ if (distance !== null && distance < min) {
136
+ min = distance;
137
+ }
138
+ }
139
+ return min <= toleranceLngLat ? min : null;
140
+ }
141
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * PointHitTestStrategy
3
+ *
4
+ * Hit testing strategy for Point features.
5
+ * Distances are measured in the local frame of hit testing (local-frame.ts).
6
+ */
7
+ import type { Coordinate, Feature, FeatureType } from '../../../store/types.js';
8
+ import type { HitTestStrategy } from './base.js';
9
+ /**
10
+ * The built-in hit test of `Point` features: hit within the tolerance of the position.
11
+ *
12
+ * The distance is measured in the local frame of the click (see {@link HitTestStrategy}).
13
+ * A custom type drawn as a point can reuse it, or extend it to widen the hit area.
14
+ */
15
+ export declare class PointHitTestStrategy implements HitTestStrategy {
16
+ /** The feature type, `'Point'` */
17
+ readonly geometryType: FeatureType;
18
+ test(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): boolean;
19
+ distance(feature: Feature, coordinate: Coordinate): number;
20
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { latitudeScale, localDistance } from '../local-frame.js';
4
+ /**
5
+ * The built-in hit test of `Point` features: hit within the tolerance of the position.
6
+ *
7
+ * The distance is measured in the local frame of the click (see {@link HitTestStrategy}).
8
+ * A custom type drawn as a point can reuse it, or extend it to widen the hit area.
9
+ */
10
+ export class PointHitTestStrategy {
11
+ constructor() {
12
+ /** The feature type, `'Point'` */
13
+ Object.defineProperty(this, "geometryType", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: 'Point'
18
+ });
19
+ }
20
+ test(feature, coordinate, toleranceLngLat) {
21
+ const pointCoord = feature.coordinates;
22
+ const dist = localDistance(coordinate, pointCoord, latitudeScale(coordinate[1]));
23
+ return dist <= toleranceLngLat;
24
+ }
25
+ distance(feature, coordinate) {
26
+ const pointCoord = feature.coordinates;
27
+ return localDistance(coordinate, pointCoord, latitudeScale(coordinate[1]));
28
+ }
29
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * PolygonHitTestStrategy
3
+ *
4
+ * Hit testing strategy for Polygon features.
5
+ * Distances to the edges are measured in the local frame of hit testing (local-frame.ts).
6
+ * The inside test is unaffected by that frame (it only scales the latitude axis).
7
+ */
8
+ import type { Coordinate, Feature, FeatureType } from '../../../store/types.js';
9
+ import type { HitTestStrategy } from './base.js';
10
+ /**
11
+ * Hit testing strategy for the Polygon type
12
+ */
13
+ export declare class PolygonHitTestStrategy implements HitTestStrategy {
14
+ readonly geometryType: FeatureType;
15
+ test(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): boolean;
16
+ distance(feature: Feature, coordinate: Coordinate): number;
17
+ testDistance(feature: Feature, coordinate: Coordinate, toleranceLngLat: number): number | null;
18
+ /**
19
+ * Hit test and distance computation for one part, an array of rings (a single scan)
20
+ *
21
+ * Returns 0 when inside, the distance to the edge when outside and that distance is
22
+ * within the tolerance, and null otherwise. Reused from the part iteration of
23
+ * MultiPolygon.
24
+ */
25
+ testDistanceRings(rings: Coordinate[][], coordinate: Coordinate, toleranceLngLat: number): number | null;
26
+ /**
27
+ * Hit test for one part, an array of rings
28
+ *
29
+ * Reused from the part iteration of MultiPolygon.
30
+ */
31
+ testRings(rings: Coordinate[][], coordinate: Coordinate, toleranceLngLat: number): boolean;
32
+ /**
33
+ * Distance to one part, an array of rings
34
+ *
35
+ * Reused from the part iteration of MultiPolygon.
36
+ */
37
+ distanceToRings(rings: Coordinate[][], coordinate: Coordinate): number;
38
+ /**
39
+ * Point in polygon test
40
+ *
41
+ * true when it is contained in the outer ring and not contained in a hole
42
+ */
43
+ private pointInPolygon;
44
+ /**
45
+ * Test for being inside a ring, using the ray casting algorithm
46
+ */
47
+ private pointInRing;
48
+ /**
49
+ * Computes the shortest distance from a point to the edges of the polygon
50
+ */
51
+ private pointToPolygonEdgeDistance;
52
+ }
@@ -0,0 +1,138 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { latitudeScale, localPointToSegmentDistance } from '../local-frame.js';
4
+ import { polylineDistanceWithin } from '../segment-grid.js';
5
+ /**
6
+ * Hit testing strategy for the Polygon type
7
+ */
8
+ export class PolygonHitTestStrategy {
9
+ constructor() {
10
+ Object.defineProperty(this, "geometryType", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: 'Polygon'
15
+ });
16
+ }
17
+ test(feature, coordinate, toleranceLngLat) {
18
+ const rings = feature.coordinates;
19
+ return this.testRings(rings, coordinate, toleranceLngLat);
20
+ }
21
+ distance(feature, coordinate) {
22
+ const rings = feature.coordinates;
23
+ return this.distanceToRings(rings, coordinate);
24
+ }
25
+ testDistance(feature, coordinate, toleranceLngLat) {
26
+ const rings = feature.coordinates;
27
+ return this.testDistanceRings(rings, coordinate, toleranceLngLat);
28
+ }
29
+ /**
30
+ * Hit test and distance computation for one part, an array of rings (a single scan)
31
+ *
32
+ * Returns 0 when inside, the distance to the edge when outside and that distance is
33
+ * within the tolerance, and null otherwise. Reused from the part iteration of
34
+ * MultiPolygon.
35
+ */
36
+ testDistanceRings(rings, coordinate, toleranceLngLat) {
37
+ if (rings.length === 0)
38
+ return null;
39
+ // 1. Test for being inside the polygon (point in polygon)
40
+ // Ray casting stays a full scan of every ring, because the index can only answer
41
+ // "the shortest distance within the tolerance", while the inside/outside test needs
42
+ // the total number of crossings.
43
+ if (this.pointInPolygon(coordinate, rings)) {
44
+ return 0;
45
+ }
46
+ // 2. Test the distance to the edges (per ring, a threshold switches between the full
47
+ // scan and the index)
48
+ const latScale = latitudeScale(coordinate[1]);
49
+ let minDistance = Number.POSITIVE_INFINITY;
50
+ for (const ring of rings) {
51
+ const distance = polylineDistanceWithin(ring, coordinate, toleranceLngLat, latScale);
52
+ if (distance !== null && distance < minDistance) {
53
+ minDistance = distance;
54
+ }
55
+ }
56
+ return minDistance <= toleranceLngLat ? minDistance : null;
57
+ }
58
+ /**
59
+ * Hit test for one part, an array of rings
60
+ *
61
+ * Reused from the part iteration of MultiPolygon.
62
+ */
63
+ testRings(rings, coordinate, toleranceLngLat) {
64
+ if (rings.length === 0)
65
+ return false;
66
+ // 1. Test for being inside the polygon (point in polygon)
67
+ if (this.pointInPolygon(coordinate, rings)) {
68
+ return true;
69
+ }
70
+ // 2. Test the distance to the edges (a hit when within the tolerance)
71
+ return this.pointToPolygonEdgeDistance(coordinate, rings) <= toleranceLngLat;
72
+ }
73
+ /**
74
+ * Distance to one part, an array of rings
75
+ *
76
+ * Reused from the part iteration of MultiPolygon.
77
+ */
78
+ distanceToRings(rings, coordinate) {
79
+ if (rings.length === 0)
80
+ return Number.POSITIVE_INFINITY;
81
+ // If it is inside, the distance is 0
82
+ if (this.pointInPolygon(coordinate, rings)) {
83
+ return 0;
84
+ }
85
+ // Distance to the edges
86
+ return this.pointToPolygonEdgeDistance(coordinate, rings);
87
+ }
88
+ /**
89
+ * Point in polygon test
90
+ *
91
+ * true when it is contained in the outer ring and not contained in a hole
92
+ */
93
+ pointInPolygon(point, rings) {
94
+ const [lng, lat] = point;
95
+ // Test against the outer ring
96
+ if (!this.pointInRing(lng, lat, rings[0])) {
97
+ return false;
98
+ }
99
+ // Test against the hole rings (false if it is inside a hole)
100
+ for (let i = 1; i < rings.length; i++) {
101
+ if (this.pointInRing(lng, lat, rings[i])) {
102
+ return false;
103
+ }
104
+ }
105
+ return true;
106
+ }
107
+ /**
108
+ * Test for being inside a ring, using the ray casting algorithm
109
+ */
110
+ pointInRing(x, y, ring) {
111
+ let inside = false;
112
+ const n = ring.length;
113
+ for (let i = 0, j = n - 1; i < n; j = i++) {
114
+ const [xi, yi] = ring[i];
115
+ const [xj, yj] = ring[j];
116
+ const cond1 = yi > y !== yj > y;
117
+ const cond2 = x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;
118
+ if (cond1 && cond2) {
119
+ inside = !inside;
120
+ }
121
+ }
122
+ return inside;
123
+ }
124
+ /**
125
+ * Computes the shortest distance from a point to the edges of the polygon
126
+ */
127
+ pointToPolygonEdgeDistance(point, rings) {
128
+ const latScale = latitudeScale(point[1]);
129
+ let minDistance = Number.POSITIVE_INFINITY;
130
+ for (const ring of rings) {
131
+ for (let i = 0; i < ring.length - 1; i++) {
132
+ const distance = localPointToSegmentDistance(point, ring[i], ring[i + 1], latScale);
133
+ minDistance = Math.min(minDistance, distance);
134
+ }
135
+ }
136
+ return minDistance;
137
+ }
138
+ }
@@ -0,0 +1,48 @@
1
+ import type { Dataset } from '../../display/types.js';
2
+ import type { ScreenPoint } from '../../shared/math/index.js';
3
+ import type { Feature } from '../../store/types.js';
4
+ import type { FeatureCompanionHitResult } from '../../view/feature-companion.js';
5
+ /**
6
+ * What the frontmost hit at a screen position is: a feature of the Store, a
7
+ * dataset, or something that accompanies a feature.
8
+ *
9
+ * - store: a feature of the Store. It is a target of selection and editing as before
10
+ * - dataset: a dataset. When feature is null it means "it occludes, but
11
+ * it does not fire an event" (interactive: false)
12
+ * - companion: something that accompanies a feature (view/feature-companion). It was hit
13
+ * right after the test of the feature itself failed, and the click is received by the
14
+ * provider (the selection state does not change)
15
+ */
16
+ export type TopHit = {
17
+ kind: 'store';
18
+ feature: Feature;
19
+ } | {
20
+ kind: 'dataset';
21
+ dataset: Dataset;
22
+ feature: Feature | null;
23
+ /** The row of the feature in the dataset (null together with feature) */
24
+ row: number | null;
25
+ } | {
26
+ kind: 'companion';
27
+ companion: FeatureCompanionHitResult;
28
+ };
29
+ /**
30
+ * The options of a {@link HitTestTopmost} call.
31
+ */
32
+ export interface TopmostHitTestOptions {
33
+ /**
34
+ * The list of the features of the Store in display order
35
+ *
36
+ * When the caller already holds `getDisplayFeatures(store)`, passing it avoids fetching
37
+ * it again. When omitted, this function fetches it itself.
38
+ */
39
+ orderedFeatures?: Feature[];
40
+ }
41
+ /**
42
+ * Returns the single frontmost hit at a screen position, across the Store, the
43
+ * datasets and the feature companions, in the same order as they are drawn.
44
+ *
45
+ * The position is in CSS px relative to the map container. It returns `null` when nothing is
46
+ * hit.
47
+ */
48
+ export type HitTestTopmost = (point: ScreenPoint, options?: TopmostHitTestOptions) => TopHit | null;