@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,186 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getMetersPerPixel, toDegrees, toRadians } from './distance.js';
4
+ /**
5
+ * WGS84 ellipsoid parameters
6
+ */
7
+ const WGS84_SEMI_MAJOR_AXIS = 6378137.0; // Equatorial radius (meters)
8
+ const WGS84_ECCENTRICITY_SQUARED = 6.69437999014e-3; // Square of the first eccentricity
9
+ /**
10
+ * Converts a WGS84 coordinate into an ECEF coordinate (accounting for the ellipsoid)
11
+ *
12
+ * @param coord WGS84 coordinate [lng, lat]
13
+ * @returns ECEF coordinate {x, y, z} (in meters)
14
+ */
15
+ export function wgs84ToECEF(coord) {
16
+ const lat = toRadians(coord[1]);
17
+ const lng = toRadians(coord[0]);
18
+ // Prime vertical radius of curvature
19
+ const N = WGS84_SEMI_MAJOR_AXIS / Math.sqrt(1 - WGS84_ECCENTRICITY_SQUARED * Math.sin(lat) ** 2);
20
+ return {
21
+ x: N * Math.cos(lat) * Math.cos(lng),
22
+ y: N * Math.cos(lat) * Math.sin(lng),
23
+ z: N * (1 - WGS84_ECCENTRICITY_SQUARED) * Math.sin(lat),
24
+ };
25
+ }
26
+ /**
27
+ * Converts an ECEF coordinate into a WGS84 coordinate (iterative computation by Bowring's
28
+ * method)
29
+ *
30
+ * @param x ECEF X coordinate (meters)
31
+ * @param y ECEF Y coordinate (meters)
32
+ * @param z ECEF Z coordinate (meters)
33
+ * @returns WGS84 coordinate [lng, lat]
34
+ */
35
+ export function ecefToWGS84(x, y, z) {
36
+ // The longitude can be computed directly
37
+ const lng = Math.atan2(y, x);
38
+ // Iterative computation of the latitude (Bowring's method)
39
+ const p = Math.sqrt(x * x + y * y);
40
+ const e2 = WGS84_ECCENTRICITY_SQUARED;
41
+ const a = WGS84_SEMI_MAJOR_AXIS;
42
+ // Initial value
43
+ let lat = Math.atan2(z, p * (1 - e2));
44
+ // Iterative computation (usually converges in 2-3 rounds)
45
+ for (let i = 0; i < 5; i++) {
46
+ const sinLat = Math.sin(lat);
47
+ const N = a / Math.sqrt(1 - e2 * sinLat * sinLat);
48
+ const newLat = Math.atan2(z + e2 * N * sinLat, p);
49
+ if (Math.abs(newLat - lat) < 1e-12) {
50
+ break;
51
+ }
52
+ lat = newLat;
53
+ }
54
+ return [toDegrees(lng), toDegrees(lat)];
55
+ }
56
+ /**
57
+ * Rotates a single coordinate about the center point as the axis (ECEF coordinate system,
58
+ * Rodrigues' formula)
59
+ *
60
+ * @param coord The coordinate to rotate [lng, lat]
61
+ * @param center Center point of the rotation [lng, lat]
62
+ * @param angleDegrees Rotation angle (degrees, counter-clockwise)
63
+ * @returns The coordinate after rotation [lng, lat]
64
+ */
65
+ export function rotateCoordinateOnSphere(coord, center, angleDegrees) {
66
+ const angleRad = toRadians(angleDegrees);
67
+ // Rotation axis: the normal vector from the center point to the center of the Earth
68
+ // (ECEF coordinate system)
69
+ const centerLatRad = toRadians(center[1]);
70
+ const centerLngRad = toRadians(center[0]);
71
+ const axisX = Math.cos(centerLatRad) * Math.cos(centerLngRad);
72
+ const axisY = Math.cos(centerLatRad) * Math.sin(centerLngRad);
73
+ const axisZ = Math.sin(centerLatRad);
74
+ // Convert the WGS84 coordinate into ECEF (3D Cartesian coordinates)
75
+ const latRad = toRadians(coord[1]);
76
+ const lngRad = toRadians(coord[0]);
77
+ const vx = Math.cos(latRad) * Math.cos(lngRad);
78
+ const vy = Math.cos(latRad) * Math.sin(lngRad);
79
+ const vz = Math.sin(latRad);
80
+ // Rodrigues' rotation formula
81
+ // v_rotated = v*cos(θ) + (k×v)*sin(θ) + k*(k·v)*(1-cos(θ))
82
+ // Cross product k×v
83
+ const crossX = axisY * vz - axisZ * vy;
84
+ const crossY = axisZ * vx - axisX * vz;
85
+ const crossZ = axisX * vy - axisY * vx;
86
+ // Dot product k·v
87
+ const dotProduct = axisX * vx + axisY * vy + axisZ * vz;
88
+ // Apply the rotation
89
+ const cosAngle = Math.cos(angleRad);
90
+ const sinAngle = Math.sin(angleRad);
91
+ const oneMinusCos = 1 - cosAngle;
92
+ const rotatedX = vx * cosAngle + crossX * sinAngle + axisX * dotProduct * oneMinusCos;
93
+ const rotatedY = vy * cosAngle + crossY * sinAngle + axisY * dotProduct * oneMinusCos;
94
+ const rotatedZ = vz * cosAngle + crossZ * sinAngle + axisZ * dotProduct * oneMinusCos;
95
+ // Inverse conversion from ECEF into a WGS84 coordinate (unit sphere approximation)
96
+ const newLat = toDegrees(Math.asin(rotatedZ));
97
+ const newLng = toDegrees(Math.atan2(rotatedY, rotatedX));
98
+ return [newLng, newLat];
99
+ }
100
+ /**
101
+ * Rotates multiple coordinates about the center point as the axis (ECEF coordinate system,
102
+ * Rodrigues' formula)
103
+ *
104
+ * @param coords Array of coordinates to rotate
105
+ * @param center Center point of the rotation [lng, lat]
106
+ * @param angleDegrees Rotation angle (degrees, counter-clockwise)
107
+ * @returns Array of coordinates after rotation
108
+ */
109
+ export function rotateCoordinatesOnSphere(coords, center, angleDegrees) {
110
+ return coords.map((coord) => rotateCoordinateOnSphere(coord, center, angleDegrees));
111
+ }
112
+ /**
113
+ * Kilometers per degree of latitude
114
+ */
115
+ const KILOMETERS_PER_DEGREE_LATITUDE = 111.32;
116
+ /**
117
+ * Converts kilometers into degrees (with a latitude correction)
118
+ *
119
+ * @param km Distance (kilometers)
120
+ * @param latitude Reference latitude
121
+ * @returns Degrees
122
+ */
123
+ export function kmToDegrees(km, latitude) {
124
+ // Distance of 1 degree of latitude
125
+ const latDegrees = km / KILOMETERS_PER_DEGREE_LATITUDE;
126
+ // The distance of 1 degree of longitude varies with the latitude
127
+ const lngDegrees = km / (KILOMETERS_PER_DEGREE_LATITUDE * Math.cos(toRadians(latitude)));
128
+ // Use the larger one to be safe
129
+ return Math.max(latDegrees, lngDegrees);
130
+ }
131
+ /**
132
+ * Converts pixels into degrees (with a latitude correction)
133
+ *
134
+ * @param pixels Number of pixels
135
+ * @param latitude Reference latitude
136
+ * @param zoom Zoom level
137
+ * @param tileSize Tile size (default 512)
138
+ * @returns Degrees
139
+ */
140
+ export function pixelsToDegrees(pixels, latitude, zoom, tileSize = 512) {
141
+ // Meters per pixel
142
+ const metersPerPixel = getMetersPerPixel(latitude, zoom, tileSize);
143
+ // Convert meters into kilometers
144
+ const km = (pixels * metersPerPixel) / 1000;
145
+ // Convert kilometers into degrees (it differs between longitude and latitude)
146
+ const latDegrees = km / KILOMETERS_PER_DEGREE_LATITUDE;
147
+ const lngDegrees = km / (KILOMETERS_PER_DEGREE_LATITUDE * Math.cos(toRadians(latitude)));
148
+ return { lngDegrees, latDegrees };
149
+ }
150
+ /**
151
+ * Computes the vertices of a quad with a rotation applied (uses spherical rotation)
152
+ *
153
+ * @param centerLng Center longitude
154
+ * @param centerLat Center latitude
155
+ * @param halfWidthDeg Half width (degrees) - in the longitude direction
156
+ * @param halfHeightDeg Half height (degrees) - in the latitude direction
157
+ * @param rotationDeg Rotation angle (degrees, counter-clockwise)
158
+ * @returns The 4 vertices of the quad [topLeft, topRight, bottomLeft, bottomRight]
159
+ */
160
+ export function computeRotatedQuadCorners(centerLng, centerLat, halfWidthDeg, halfHeightDeg, rotationDeg) {
161
+ const center = [centerLng, centerLat];
162
+ // Local coordinates before rotation (positions relative to the center, in degrees)
163
+ // Geographic coordinate system: north is positive (up), south is negative (down)
164
+ const corners = [
165
+ [centerLng - halfWidthDeg, centerLat + halfHeightDeg], // top-left (northwest)
166
+ [centerLng + halfWidthDeg, centerLat + halfHeightDeg], // top-right (northeast)
167
+ [centerLng - halfWidthDeg, centerLat - halfHeightDeg], // bottom-left (southwest)
168
+ [centerLng + halfWidthDeg, centerLat - halfHeightDeg], // bottom-right (southeast)
169
+ ];
170
+ if (rotationDeg === 0) {
171
+ return {
172
+ topLeft: corners[0],
173
+ topRight: corners[1],
174
+ bottomLeft: corners[2],
175
+ bottomRight: corners[3],
176
+ };
177
+ }
178
+ // Apply the spherical rotation
179
+ const rotatedCorners = rotateCoordinatesOnSphere(corners, center, rotationDeg);
180
+ return {
181
+ topLeft: rotatedCorners[0],
182
+ topRight: rotatedCorners[1],
183
+ bottomLeft: rotatedCorners[2],
184
+ bottomRight: rotatedCorners[3],
185
+ };
186
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Segment grid index
3
+ *
4
+ * A static uniform grid index over a coordinate array (one polyline, or one ring).
5
+ * On geometries with a hundred thousand vertices it reduces hit testing, which would
6
+ * otherwise scan every segment (O(N)), to computing only the candidate segments in the
7
+ * cells that overlap the tolerance box.
8
+ *
9
+ * This module is for internal use within the package and is not exposed in the public API.
10
+ * Hit testing (dispatcher/hit-test/segment-grid.ts measures distances through it) and the
11
+ * bbox-limited enumeration of the snapping providers and the tracing both use it, so it sits
12
+ * in shared/.
13
+ *
14
+ * Assumption: coordinate arrays are never rewritten in place (updating coordinates in the
15
+ * Store follows the immutable update convention of replacing the array with a new one,
16
+ * both in the memory implementation of core and in external store implementations).
17
+ * Therefore the index stays valid as long as the array reference is the same, and when the
18
+ * coordinates change the key of the WeakMap changes, so the index is naturally rebuilt and
19
+ * the old index is reclaimed by the GC.
20
+ * For that reason there is no invalidation logic.
21
+ */
22
+ import type { BoundingBox, Coordinate } from '../types/model.js';
23
+ /**
24
+ * Vertex count threshold above which the index is built
25
+ *
26
+ * Below it a full scan is faster (the cost of building the index outweighs the gain).
27
+ */
28
+ export declare const SEGMENT_INDEX_THRESHOLD = 1024;
29
+ /**
30
+ * Segment grid index
31
+ */
32
+ export interface SegmentGrid {
33
+ /** The bbox covered by the index */
34
+ readonly minX: number;
35
+ readonly minY: number;
36
+ readonly maxX: number;
37
+ readonly maxY: number;
38
+ /** Column count and row count */
39
+ readonly cols: number;
40
+ readonly rows: number;
41
+ /** Cell width and height (at least CELL_EPS) */
42
+ readonly cellW: number;
43
+ readonly cellH: number;
44
+ /** The segment start indices of each cell. An empty cell is undefined */
45
+ readonly cells: (number[] | undefined)[];
46
+ /** Segment count (= coords.length - 1, never negative) */
47
+ readonly segmentCount: number;
48
+ /** Visit stamps (they avoid computing the same segment twice within one query) */
49
+ readonly visited: Uint32Array;
50
+ /** Generation counter of the visit stamps */
51
+ generation: number;
52
+ }
53
+ /**
54
+ * Builds the segment grid index
55
+ */
56
+ export declare function buildSegmentGrid(coords: Coordinate[]): SegmentGrid;
57
+ /**
58
+ * Gets the index for a coordinate array (building and caching it when there is none)
59
+ */
60
+ export declare function getSegmentGrid(coords: Coordinate[]): SegmentGrid;
61
+ /**
62
+ * Enumerates, through the index, the indices of the segments that touch a bbox
63
+ *
64
+ * Nothing is missed (every segment whose segment bbox overlaps the query bbox is always
65
+ * included). Since the cells are held as boxes it may return more than necessary, so the
66
+ * strict test is left to the caller. The return value is sorted in ascending order to make
67
+ * the enumeration order deterministic.
68
+ */
69
+ export declare function querySegmentIndicesInBBox(grid: SegmentGrid, bbox: BoundingBox): number[];
@@ -0,0 +1,159 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Vertex count threshold above which the index is built
5
+ *
6
+ * Below it a full scan is faster (the cost of building the index outweighs the gain).
7
+ */
8
+ export const SEGMENT_INDEX_THRESHOLD = 1024;
9
+ /** Lower bound of the cell width and height (guards against division by zero when the
10
+ * bbox is degenerate) */
11
+ const CELL_EPS = 1e-12;
12
+ /** Module-level index cache (the key is the reference of the coordinate array) */
13
+ const gridCache = new WeakMap();
14
+ /**
15
+ * Builds the segment grid index
16
+ */
17
+ export function buildSegmentGrid(coords) {
18
+ const segmentCount = Math.max(coords.length - 1, 0);
19
+ let minX = Number.POSITIVE_INFINITY;
20
+ let minY = Number.POSITIVE_INFINITY;
21
+ let maxX = Number.NEGATIVE_INFINITY;
22
+ let maxY = Number.NEGATIVE_INFINITY;
23
+ // Put only the vertices that make up a segment into the bbox (a trailing isolated point
24
+ // is ignored)
25
+ const vertexCount = segmentCount === 0 ? 0 : segmentCount + 1;
26
+ for (let i = 0; i < vertexCount; i++) {
27
+ const [x, y] = coords[i];
28
+ if (x < minX)
29
+ minX = x;
30
+ if (y < minY)
31
+ minY = y;
32
+ if (x > maxX)
33
+ maxX = x;
34
+ if (y > maxY)
35
+ maxY = y;
36
+ }
37
+ const cols = segmentCount === 0 ? 1 : Math.ceil(Math.sqrt(segmentCount));
38
+ const rows = cols;
39
+ const cellW = Math.max((maxX - minX) / cols, CELL_EPS);
40
+ const cellH = Math.max((maxY - minY) / rows, CELL_EPS);
41
+ const grid = {
42
+ minX,
43
+ minY,
44
+ maxX,
45
+ maxY,
46
+ cols,
47
+ rows,
48
+ cellW,
49
+ cellH,
50
+ cells: new Array(cols * rows),
51
+ segmentCount,
52
+ visited: new Uint32Array(segmentCount),
53
+ generation: 0,
54
+ };
55
+ // Register each segment in every cell its bbox overlaps
56
+ for (let i = 0; i < segmentCount; i++) {
57
+ const [ax, ay] = coords[i];
58
+ const [bx, by] = coords[i + 1];
59
+ const col0 = cellIndex(Math.min(ax, bx) - grid.minX, grid.cellW, cols);
60
+ const col1 = cellIndex(Math.max(ax, bx) - grid.minX, grid.cellW, cols);
61
+ const row0 = cellIndex(Math.min(ay, by) - grid.minY, grid.cellH, rows);
62
+ const row1 = cellIndex(Math.max(ay, by) - grid.minY, grid.cellH, rows);
63
+ for (let row = row0; row <= row1; row++) {
64
+ const rowOffset = row * cols;
65
+ for (let col = col0; col <= col1; col++) {
66
+ const cell = grid.cells[rowOffset + col];
67
+ if (cell) {
68
+ cell.push(i);
69
+ }
70
+ else {
71
+ grid.cells[rowOffset + col] = [i];
72
+ }
73
+ }
74
+ }
75
+ }
76
+ return grid;
77
+ }
78
+ /**
79
+ * Gets the index for a coordinate array (building and caching it when there is none)
80
+ */
81
+ export function getSegmentGrid(coords) {
82
+ const cached = gridCache.get(coords);
83
+ if (cached)
84
+ return cached;
85
+ const grid = buildSegmentGrid(coords);
86
+ gridCache.set(coords, grid);
87
+ return grid;
88
+ }
89
+ /**
90
+ * Enumerates, through the index, the indices of the segments that touch a bbox
91
+ *
92
+ * Nothing is missed (every segment whose segment bbox overlaps the query bbox is always
93
+ * included). Since the cells are held as boxes it may return more than necessary, so the
94
+ * strict test is left to the caller. The return value is sorted in ascending order to make
95
+ * the enumeration order deterministic.
96
+ */
97
+ export function querySegmentIndicesInBBox(grid, bbox) {
98
+ if (grid.segmentCount === 0)
99
+ return [];
100
+ // If the query box does not intersect the bbox of the index, there is no candidate
101
+ if (bbox.maxX < grid.minX ||
102
+ bbox.minX > grid.maxX ||
103
+ bbox.maxY < grid.minY ||
104
+ bbox.minY > grid.maxY) {
105
+ return [];
106
+ }
107
+ const col0 = cellIndex(bbox.minX - grid.minX, grid.cellW, grid.cols);
108
+ const col1 = cellIndex(bbox.maxX - grid.minX, grid.cellW, grid.cols);
109
+ const row0 = cellIndex(bbox.minY - grid.minY, grid.cellH, grid.rows);
110
+ const row1 = cellIndex(bbox.maxY - grid.minY, grid.cellH, grid.rows);
111
+ const stamp = nextGeneration(grid);
112
+ const indices = [];
113
+ for (let row = row0; row <= row1; row++) {
114
+ const rowOffset = row * grid.cols;
115
+ for (let col = col0; col <= col1; col++) {
116
+ const cell = grid.cells[rowOffset + col];
117
+ if (!cell)
118
+ continue;
119
+ for (const i of cell) {
120
+ // A segment is registered in several cells, so pick it up only once per query
121
+ if (grid.visited[i] === stamp)
122
+ continue;
123
+ grid.visited[i] = stamp;
124
+ indices.push(i);
125
+ }
126
+ }
127
+ }
128
+ indices.sort((a, b) => a - b);
129
+ return indices;
130
+ }
131
+ /**
132
+ * Finds the cell index from a coordinate offset (clamping it into range)
133
+ *
134
+ * @internal
135
+ */
136
+ export function cellIndex(offset, cellSize, count) {
137
+ const index = Math.floor(offset / cellSize);
138
+ if (index < 0)
139
+ return 0;
140
+ if (index >= count)
141
+ return count - 1;
142
+ return index;
143
+ }
144
+ /**
145
+ * Advances the generation of the visit stamps
146
+ *
147
+ * When the upper limit of the Uint32Array is reached, the stamps are cleared all at once
148
+ * and the counter wraps back around.
149
+ *
150
+ * @internal
151
+ */
152
+ export function nextGeneration(grid) {
153
+ if (grid.generation >= 0xffffffff) {
154
+ grid.visited.fill(0);
155
+ grid.generation = 0;
156
+ }
157
+ grid.generation += 1;
158
+ return grid.generation;
159
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Coordinate transformation utilities
3
+ *
4
+ * Converts between geographic coordinates and screen coordinates in both directions.
5
+ */
6
+ import type { Map as MapLibreMap } from 'maplibre-gl';
7
+ import type { Coordinate } from '../types/model.js';
8
+ /**
9
+ * Clamps a latitude into the valid range
10
+ *
11
+ * MapLibre's project() throws an error when the latitude is outside the range -90 to 90, and
12
+ * the latitude can fall outside that range, for example when a large image is placed at a low
13
+ * zoom level.
14
+ *
15
+ * @param latitude - The latitude to clamp (degrees)
16
+ * @returns The latitude clamped into the range -89.9 to 89.9
17
+ */
18
+ export declare function clampLatitude(latitude: number): number;
19
+ /**
20
+ * Clamps the latitude of a coordinate into the valid range
21
+ *
22
+ * @param coord - The coordinate to clamp [lng, lat]
23
+ * @returns The coordinate with its latitude clamped
24
+ */
25
+ export declare function clampCoordinate(coord: Coordinate): Coordinate;
26
+ /**
27
+ * Mercator coordinate (in the range 0-1)
28
+ */
29
+ export type MercatorCoord = [number, number];
30
+ /**
31
+ * Converts a longitude/latitude into a Mercator coordinate (in the range 0-1)
32
+ *
33
+ * @param coord Longitude/latitude coordinate [lng, lat]
34
+ * @returns Mercator coordinate [x, y] (in the range 0-1)
35
+ */
36
+ export declare function lngLatToMercator(coord: Coordinate): MercatorCoord;
37
+ /**
38
+ * A point on the screen in CSS pixels, from the top-left corner of the map
39
+ */
40
+ export interface ScreenPoint {
41
+ /** The distance from the left edge */
42
+ x: number;
43
+ /** The distance from the top edge */
44
+ y: number;
45
+ }
46
+ /**
47
+ * A geographic position as an object, in degrees
48
+ */
49
+ export interface LngLat {
50
+ /** The longitude */
51
+ lng: number;
52
+ /** The latitude */
53
+ lat: number;
54
+ }
55
+ /**
56
+ * Coordinate transformation interface
57
+ *
58
+ * Wraps MapLibre's map.project() / map.unproject() and supports both the Mercator projection
59
+ * and the globe projection.
60
+ */
61
+ export interface CoordinateTransform {
62
+ /** Converts a geographic coordinate into a screen coordinate */
63
+ project(lngLat: Coordinate): ScreenPoint;
64
+ /** Converts a screen coordinate into a geographic coordinate */
65
+ unproject(point: ScreenPoint): LngLat;
66
+ }
67
+ /**
68
+ * Injection point for the terrain-aware anchor projection
69
+ *
70
+ * When terrain is enabled, this is the only path that maps a UI anchor (longitude/latitude +
71
+ * ground elevation) into screen coordinates. So that the rendering side (the vertex shader)
72
+ * and the hit-testing side (this transformation) are structurally guaranteed to go through the
73
+ * same elevation, the same matrices and the same branches, the implementation is owned by the
74
+ * view layer (`view/terrain/anchor.ts`) and injected here. shared cannot depend on view, so
75
+ * the direction is reversed into "shared opens a socket and view plugs into it".
76
+ *
77
+ * When project returns null (terrain is disabled, or the frame state is not yet established),
78
+ * it falls back to MapLibre's project. The path taken when there is no terrain is exactly the
79
+ * same as before the injection existed (which guarantees zero regression).
80
+ */
81
+ export interface AnchorProjector {
82
+ /**
83
+ * Maps longitude/latitude + ground elevation into a screen coordinate (CSS pixels). null
84
+ * when it cannot be used.
85
+ */
86
+ project(lng: number, lat: number): ScreenPoint | null;
87
+ }
88
+ /**
89
+ * Injects an anchor projection (the view layer calls this per map; null removes it)
90
+ */
91
+ export declare function setAnchorProjector(map: MapLibreMap, projector: AnchorProjector | null): void;
92
+ /**
93
+ * Gets the anchor projection that is currently injected
94
+ */
95
+ export declare function getAnchorProjector(map: MapLibreMap): AnchorProjector | null;
96
+ /**
97
+ * Creates a CoordinateTransform from a MapLibre map
98
+ *
99
+ * When terrain is enabled, project goes through the anchor projection (elevation included, one
100
+ * matrix pass). With terrain enabled, MapLibre's map.project internally raycasts against the
101
+ * terrain mesh, which measured at roughly 307μs per point (roughly 1μs without terrain). Hit
102
+ * testing calls project for every vertex, so editing would not hold up as is.
103
+ *
104
+ * unproject is called for only a single screen point (roughly 43μs), so MapLibre's is used as
105
+ * is. That is also because it has to solve the intersection with the terrain mesh by
106
+ * raycasting, which cannot be obtained from matrices alone.
107
+ *
108
+ * @param map MapLibre map instance
109
+ * @returns A CoordinateTransform instance
110
+ */
111
+ export declare function createCoordinateTransform(map: MapLibreMap): CoordinateTransform;
112
+ /**
113
+ * Applies a margin in pixels to a bounding box
114
+ *
115
+ * When zoom is passed, the expansion is done on the map plane. When it is not passed, the
116
+ * expansion round-trips through screen coordinates. It must not round-trip when there is
117
+ * terrain: with terrain enabled, project projects a point at the height of the ground surface
118
+ * and unproject casts a ray from the screen onto the ground surface and comes back, so the
119
+ * round trip is no longer the identity mapping. With a tilted view, the returned values drift
120
+ * by kilometers, and the box appears far away from the feature, with a different shape too.
121
+ *
122
+ * @param coords Coordinates of the 4 corners of the bounding box
123
+ * [topLeft, topRight, bottomRight, bottomLeft]
124
+ * @param margin Margin size (pixels)
125
+ * @param transform Coordinate transformation interface
126
+ * @param zoom Current zoom (when passed, the expansion is done on the map plane; required when
127
+ * there is terrain)
128
+ * @returns Coordinates of the 4 corners after the margin is applied
129
+ */
130
+ export declare function applyMarginToBoundingBox(coords: {
131
+ topLeft: Coordinate;
132
+ topRight: Coordinate;
133
+ bottomRight: Coordinate;
134
+ bottomLeft: Coordinate;
135
+ }, margin: number, transform: CoordinateTransform, zoom?: number): {
136
+ topLeft: Coordinate;
137
+ topRight: Coordinate;
138
+ bottomRight: Coordinate;
139
+ bottomLeft: Coordinate;
140
+ };