@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,79 @@
1
+ /**
2
+ * Geodesic distance and bearing
3
+ *
4
+ * The haversine family under a spherical approximation. This is the body of the
5
+ * geodesic computation shared by circle rendering, buffer generation and measurement.
6
+ */
7
+ import type { Coordinate } from './types.js';
8
+ /**
9
+ * Returns the great-circle distance between two positions in meters.
10
+ *
11
+ * The haversine formula on a sphere of radius {@link EARTH_RADIUS_METERS}; the error
12
+ * against the ellipsoid is up to about 0.5%. Crossing the ±180 degree meridian is taken
13
+ * the short way round. Non-finite coordinates give NaN.
14
+ *
15
+ * @param coord1 A position `[lng, lat]` in degrees
16
+ * @param coord2 A position `[lng, lat]` in degrees
17
+ * @returns The distance in meters. 0 for identical positions
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { haversineDistanceMeters } from '@sakuzu/maplibre-gl-draw/geometry';
22
+ *
23
+ * // Tokyo Station to Osaka Station
24
+ * haversineDistanceMeters([139.767, 35.681], [135.495, 34.702]); // about 403,139 m
25
+ * ```
26
+ */
27
+ export declare function haversineDistanceMeters(coord1: Coordinate, coord2: Coordinate): number;
28
+ /**
29
+ * Returns the initial bearing of the great circle from one position to another.
30
+ *
31
+ * The same spherical approximation as {@link haversineDistanceMeters}. The bearing along a
32
+ * great circle changes on the way, so this is the direction at the start only.
33
+ *
34
+ * @param from The start `[lng, lat]` in degrees
35
+ * @param to The end `[lng, lat]` in degrees
36
+ * @returns The bearing in degrees, clockwise with north as 0, in the range [0, 360). 0 when
37
+ * the two positions are identical
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import { initialBearingDegrees } from '@sakuzu/maplibre-gl-draw/geometry';
42
+ *
43
+ * initialBearingDegrees([0, 0], [1, 0]); // 90 (due east)
44
+ * initialBearingDegrees([0, 0], [0, 1]); // 0 (due north)
45
+ * ```
46
+ */
47
+ export declare function initialBearingDegrees(from: Coordinate, to: Coordinate): number;
48
+ /**
49
+ * Returns the position reached from an origin along a great circle, given a distance and
50
+ * an initial bearing (the direct problem on the sphere).
51
+ *
52
+ * The inverse of {@link haversineDistanceMeters} and {@link initialBearingDegrees} under the
53
+ * same spherical approximation: the haversine distance from the origin to the result is
54
+ * `distanceMeters` and the initial bearing is `bearingDegrees`, up to floating-point
55
+ * rounding, at any latitude and distance.
56
+ *
57
+ * The longitude of the result continues from the origin (origin longitude + a change within
58
+ * ±180 degrees) and is not wrapped into [-180, 180], so a circle drawn near the antimeridian
59
+ * stays one continuous ring. A great circle through a pole comes back on the far meridian
60
+ * (origin longitude ± 180 degrees).
61
+ *
62
+ * Circles ({@link generateCirclePolygon}) and buffers ({@link buffer}) place their vertices
63
+ * with it. No input is rejected; non-finite arguments give non-finite coordinates.
64
+ *
65
+ * @param origin The start `[lng, lat]` in degrees
66
+ * @param distanceMeters The distance along the great circle in meters. A negative value
67
+ * goes the opposite way
68
+ * @param bearingDegrees The initial bearing in degrees, clockwise with north as 0
69
+ * @returns The position reached, `[lng, lat]` in degrees
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * import { destinationPoint } from '@sakuzu/maplibre-gl-draw/geometry';
74
+ *
75
+ * // 1 km due east of Tokyo Station
76
+ * destinationPoint([139.767, 35.681], 1000, 90); // [139.77807..., 35.68099...]
77
+ * ```
78
+ */
79
+ export declare function destinationPoint(origin: Coordinate, distanceMeters: number, bearingDegrees: number): Coordinate;
@@ -0,0 +1,111 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
4
+ /**
5
+ * Returns the great-circle distance between two positions in meters.
6
+ *
7
+ * The haversine formula on a sphere of radius {@link EARTH_RADIUS_METERS}; the error
8
+ * against the ellipsoid is up to about 0.5%. Crossing the ±180 degree meridian is taken
9
+ * the short way round. Non-finite coordinates give NaN.
10
+ *
11
+ * @param coord1 A position `[lng, lat]` in degrees
12
+ * @param coord2 A position `[lng, lat]` in degrees
13
+ * @returns The distance in meters. 0 for identical positions
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { haversineDistanceMeters } from '@sakuzu/maplibre-gl-draw/geometry';
18
+ *
19
+ * // Tokyo Station to Osaka Station
20
+ * haversineDistanceMeters([139.767, 35.681], [135.495, 34.702]); // about 403,139 m
21
+ * ```
22
+ */
23
+ export function haversineDistanceMeters(coord1, coord2) {
24
+ const R = EARTH_RADIUS_METERS;
25
+ const [lng1, lat1] = coord1;
26
+ const [lng2, lat2] = coord2;
27
+ const dLat = toRadians(lat2 - lat1);
28
+ const dLng = toRadians(lng2 - lng1);
29
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
30
+ Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) * Math.sin(dLng / 2) * Math.sin(dLng / 2);
31
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
32
+ return R * c;
33
+ }
34
+ /**
35
+ * Returns the initial bearing of the great circle from one position to another.
36
+ *
37
+ * The same spherical approximation as {@link haversineDistanceMeters}. The bearing along a
38
+ * great circle changes on the way, so this is the direction at the start only.
39
+ *
40
+ * @param from The start `[lng, lat]` in degrees
41
+ * @param to The end `[lng, lat]` in degrees
42
+ * @returns The bearing in degrees, clockwise with north as 0, in the range [0, 360). 0 when
43
+ * the two positions are identical
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { initialBearingDegrees } from '@sakuzu/maplibre-gl-draw/geometry';
48
+ *
49
+ * initialBearingDegrees([0, 0], [1, 0]); // 90 (due east)
50
+ * initialBearingDegrees([0, 0], [0, 1]); // 0 (due north)
51
+ * ```
52
+ */
53
+ export function initialBearingDegrees(from, to) {
54
+ const [lng1, lat1] = from;
55
+ const [lng2, lat2] = to;
56
+ const phi1 = toRadians(lat1);
57
+ const phi2 = toRadians(lat2);
58
+ const dLambda = toRadians(lng2 - lng1);
59
+ const y = Math.sin(dLambda) * Math.cos(phi2);
60
+ const x = Math.cos(phi1) * Math.sin(phi2) - Math.sin(phi1) * Math.cos(phi2) * Math.cos(dLambda);
61
+ if (y === 0 && x === 0) {
62
+ return 0;
63
+ }
64
+ const bearing = toDegrees(Math.atan2(y, x));
65
+ return (bearing + 360) % 360;
66
+ }
67
+ /**
68
+ * Returns the position reached from an origin along a great circle, given a distance and
69
+ * an initial bearing (the direct problem on the sphere).
70
+ *
71
+ * The inverse of {@link haversineDistanceMeters} and {@link initialBearingDegrees} under the
72
+ * same spherical approximation: the haversine distance from the origin to the result is
73
+ * `distanceMeters` and the initial bearing is `bearingDegrees`, up to floating-point
74
+ * rounding, at any latitude and distance.
75
+ *
76
+ * The longitude of the result continues from the origin (origin longitude + a change within
77
+ * ±180 degrees) and is not wrapped into [-180, 180], so a circle drawn near the antimeridian
78
+ * stays one continuous ring. A great circle through a pole comes back on the far meridian
79
+ * (origin longitude ± 180 degrees).
80
+ *
81
+ * Circles ({@link generateCirclePolygon}) and buffers ({@link buffer}) place their vertices
82
+ * with it. No input is rejected; non-finite arguments give non-finite coordinates.
83
+ *
84
+ * @param origin The start `[lng, lat]` in degrees
85
+ * @param distanceMeters The distance along the great circle in meters. A negative value
86
+ * goes the opposite way
87
+ * @param bearingDegrees The initial bearing in degrees, clockwise with north as 0
88
+ * @returns The position reached, `[lng, lat]` in degrees
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { destinationPoint } from '@sakuzu/maplibre-gl-draw/geometry';
93
+ *
94
+ * // 1 km due east of Tokyo Station
95
+ * destinationPoint([139.767, 35.681], 1000, 90); // [139.77807..., 35.68099...]
96
+ * ```
97
+ */
98
+ export function destinationPoint(origin, distanceMeters, bearingDegrees) {
99
+ const [lng, lat] = origin;
100
+ const delta = distanceMeters / EARTH_RADIUS_METERS;
101
+ const theta = toRadians(bearingDegrees);
102
+ const phi1 = toRadians(lat);
103
+ const sinPhi1 = Math.sin(phi1);
104
+ const cosPhi1 = Math.cos(phi1);
105
+ const sinDelta = Math.sin(delta);
106
+ const cosDelta = Math.cos(delta);
107
+ const sinPhi2 = Math.min(1, Math.max(-1, sinPhi1 * cosDelta + cosPhi1 * sinDelta * Math.cos(theta)));
108
+ const phi2 = Math.asin(sinPhi2);
109
+ const dLambda = Math.atan2(Math.sin(theta) * sinDelta * cosPhi1, cosDelta - sinPhi1 * sinPhi2);
110
+ return [lng + toDegrees(dLambda), toDegrees(phi2)];
111
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The error of the geometry module
3
+ *
4
+ * The boolean operations run on polygon-clipping, which reports a failure by throwing an
5
+ * Error whose message is its own internal wording (a sweep-line event, a segment id). Such
6
+ * a failure leaves the module as a GeometryError instead: the reason is a stable code the
7
+ * caller can branch on, and the original error is kept as `cause` for diagnosis.
8
+ */
9
+ /**
10
+ * Why a geometry operation failed
11
+ *
12
+ * - `invalid-input`: the input is not a polygon the operation can take (a degenerate
13
+ * segment, a malformed ring)
14
+ * - `unclosed-ring`: the output ring could not be closed, typically because edges nearly
15
+ * coincide within floating-point precision (still failing after the retry on the grid)
16
+ * - `too-complex`: the operation gave up on an input too large or tangled for it
17
+ * - `internal`: any other failure inside the boolean operation engine
18
+ */
19
+ export type GeometryErrorCode = 'invalid-input' | 'unclosed-ring' | 'too-complex' | 'internal';
20
+ /**
21
+ * The boolean operation that failed.
22
+ *
23
+ * It can differ from the function called: {@link normalizeArea} and {@link unionAll} run
24
+ * `union`, and {@link buffer} runs `union` and `difference`.
25
+ */
26
+ export type GeometryOperation = 'union' | 'difference' | 'intersection';
27
+ /**
28
+ * The error a geometry operation throws when the boolean operation engine cannot compute a
29
+ * result.
30
+ *
31
+ * Every function that runs a boolean operation can throw it: the boolean operations,
32
+ * {@link splitArea}, {@link buffer}, the polygon predicates and {@link sphericalArea}. A
33
+ * failure is first retried once with the coordinates rounded to a 1e-9 degree grid (about
34
+ * 0.1 mm); this error is thrown only when the retry fails too. Branch on `code`, which is
35
+ * stable across versions of the engine; the message is `<operation>: <reason>` in English
36
+ * and is meant for logs.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
41
+ * import { GeometryError, union } from '@sakuzu/maplibre-gl-draw/geometry';
42
+ *
43
+ * function tryMerge(a: PolygonCoordinates, b: PolygonCoordinates) {
44
+ * try {
45
+ * return union(a, b);
46
+ * } catch (error) {
47
+ * if (error instanceof GeometryError && error.code === 'unclosed-ring') {
48
+ * // Keep the inputs as they are and tell the user the merge failed
49
+ * return null;
50
+ * }
51
+ * throw error;
52
+ * }
53
+ * }
54
+ * ```
55
+ */
56
+ export declare class GeometryError extends Error {
57
+ /** Why the operation failed */
58
+ readonly code: GeometryErrorCode;
59
+ /** The boolean operation that failed */
60
+ readonly operation: GeometryOperation;
61
+ /** The error thrown by the boolean operation engine, kept for diagnosis */
62
+ readonly cause: unknown;
63
+ /**
64
+ * Creates the error. The library creates it; a caller only needs to catch it.
65
+ *
66
+ * @param code Why the operation failed
67
+ * @param operation The boolean operation that failed
68
+ * @param message The message, `<operation>: <reason>`
69
+ * @param options The original error as `cause`
70
+ */
71
+ constructor(code: GeometryErrorCode, operation: GeometryOperation, message: string, options?: {
72
+ cause?: unknown;
73
+ });
74
+ }
@@ -0,0 +1,104 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The error a geometry operation throws when the boolean operation engine cannot compute a
5
+ * result.
6
+ *
7
+ * Every function that runs a boolean operation can throw it: the boolean operations,
8
+ * {@link splitArea}, {@link buffer}, the polygon predicates and {@link sphericalArea}. A
9
+ * failure is first retried once with the coordinates rounded to a 1e-9 degree grid (about
10
+ * 0.1 mm); this error is thrown only when the retry fails too. Branch on `code`, which is
11
+ * stable across versions of the engine; the message is `<operation>: <reason>` in English
12
+ * and is meant for logs.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
17
+ * import { GeometryError, union } from '@sakuzu/maplibre-gl-draw/geometry';
18
+ *
19
+ * function tryMerge(a: PolygonCoordinates, b: PolygonCoordinates) {
20
+ * try {
21
+ * return union(a, b);
22
+ * } catch (error) {
23
+ * if (error instanceof GeometryError && error.code === 'unclosed-ring') {
24
+ * // Keep the inputs as they are and tell the user the merge failed
25
+ * return null;
26
+ * }
27
+ * throw error;
28
+ * }
29
+ * }
30
+ * ```
31
+ */
32
+ export class GeometryError extends Error {
33
+ /**
34
+ * Creates the error. The library creates it; a caller only needs to catch it.
35
+ *
36
+ * @param code Why the operation failed
37
+ * @param operation The boolean operation that failed
38
+ * @param message The message, `<operation>: <reason>`
39
+ * @param options The original error as `cause`
40
+ */
41
+ constructor(code, operation, message, options) {
42
+ super(message);
43
+ /** Why the operation failed */
44
+ Object.defineProperty(this, "code", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: void 0
49
+ });
50
+ /** The boolean operation that failed */
51
+ Object.defineProperty(this, "operation", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: void 0
56
+ });
57
+ /** The error thrown by the boolean operation engine, kept for diagnosis */
58
+ Object.defineProperty(this, "cause", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: void 0
63
+ });
64
+ this.name = 'GeometryError';
65
+ this.code = code;
66
+ this.operation = operation;
67
+ this.cause = options?.cause;
68
+ }
69
+ }
70
+ /**
71
+ * Classifies an error thrown by polygon-clipping by its message
72
+ *
73
+ * The messages are those of polygon-clipping 0.15; one that is not recognized is `internal`.
74
+ */
75
+ function classify(error) {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ if (message.startsWith('Input geometry is not a valid') ||
78
+ message.startsWith('Tried to create degenerate segment')) {
79
+ return 'invalid-input';
80
+ }
81
+ if (message.startsWith('Unable to complete output ring')) {
82
+ return 'unclosed-ring';
83
+ }
84
+ if (message.startsWith('Infinite loop')) {
85
+ return 'too-complex';
86
+ }
87
+ return 'internal';
88
+ }
89
+ /** The message of each reason */
90
+ const MESSAGES = {
91
+ 'invalid-input': 'the input is not a valid polygon',
92
+ 'unclosed-ring': 'the output ring could not be closed',
93
+ 'too-complex': 'the input is too complex',
94
+ internal: 'the boolean operation failed',
95
+ };
96
+ /**
97
+ * Wraps an error thrown by polygon-clipping into a GeometryError
98
+ *
99
+ * @internal
100
+ */
101
+ export function toGeometryError(error, operation) {
102
+ const code = classify(error);
103
+ return new GeometryError(code, operation, `${operation}: ${MESSAGES[code]}`, { cause: error });
104
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Geometry module
3
+ *
4
+ * A collection of pure functions independent of the rendering and editing machinery.
5
+ * It does not depend on maplibre, the DOM, wasm, the Store or events, and its only
6
+ * runtime dependency is polygon-clipping. The same input produces the same output
7
+ * regardless of the environment, and determinism is guaranteed by the version of the
8
+ * package.
9
+ *
10
+ * As a limitation, crossing the ±180 degree meridian and the vicinity of the poles are
11
+ * out of scope.
12
+ */
13
+ export { getPointAtAngle } from './angle.js';
14
+ export { bboxContains, bboxIntersects, boundingBox, coordinatesBBox } from './bbox.js';
15
+ export { clip, difference, differenceAll, intersection, intersectionAll, normalizeArea, union, unionAll, } from './boolean.js';
16
+ export type { BufferOptions } from './buffer.js';
17
+ export { buffer, DEFAULT_BUFFER_SEGMENTS } from './buffer.js';
18
+ export { generateCirclePolygon } from './circle.js';
19
+ export { closeRing, flattenAreaCoordinates, isMultiPolygonCoordinates, isRingClosed, toMultiPolygonCoordinates, } from './coords.js';
20
+ export { destinationPoint, haversineDistanceMeters, initialBearingDegrees } from './distance.js';
21
+ export type { GeometryErrorCode, GeometryOperation } from './errors.js';
22
+ export { GeometryError } from './errors.js';
23
+ export { centroid, geodesicLength, pointOnSurface, sphericalArea } from './measure.js';
24
+ export { contains, intersects, pointInPolygon, within } from './predicates.js';
25
+ export { isRingClockwise, normalizeMultiPolygonOrientation, normalizePolygonOrientation, normalizeRingOrientation, signedRingArea, simplify, } from './simplify.js';
26
+ export { segmentIntersection, splitArea } from './split.js';
27
+ export type { AreaCoordinates, BBox, Coordinate, GeometryInput, LineStringGeometry, MultiLineStringGeometry, MultiPointGeometry, MultiPolygonCoordinates, MultiPolygonGeometry, PointGeometry, PolygonCoordinates, PolygonGeometry, Ring, } from './types.js';
28
+ export { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
@@ -0,0 +1,38 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Geometry module
5
+ *
6
+ * A collection of pure functions independent of the rendering and editing machinery.
7
+ * It does not depend on maplibre, the DOM, wasm, the Store or events, and its only
8
+ * runtime dependency is polygon-clipping. The same input produces the same output
9
+ * regardless of the environment, and determinism is guaranteed by the version of the
10
+ * package.
11
+ *
12
+ * As a limitation, crossing the ±180 degree meridian and the vicinity of the poles are
13
+ * out of scope.
14
+ */
15
+ // Coordinate generation from a bearing
16
+ export { getPointAtAngle } from './angle.js';
17
+ // Bounding box
18
+ export { bboxContains, bboxIntersects, boundingBox, coordinatesBBox } from './bbox.js';
19
+ // Boolean operations
20
+ export { clip, difference, differenceAll, intersection, intersectionAll, normalizeArea, union, unionAll, } from './boolean.js';
21
+ export { buffer, DEFAULT_BUFFER_SEGMENTS } from './buffer.js';
22
+ // Geodesic circle
23
+ export { generateCirclePolygon } from './circle.js';
24
+ // Discrimination and normalization of coordinate shapes
25
+ export { closeRing, flattenAreaCoordinates, isMultiPolygonCoordinates, isRingClosed, toMultiPolygonCoordinates, } from './coords.js';
26
+ // Geodesic distance and bearing
27
+ export { destinationPoint, haversineDistanceMeters, initialBearingDegrees } from './distance.js';
28
+ export { GeometryError } from './errors.js';
29
+ // Measurement
30
+ export { centroid, geodesicLength, pointOnSurface, sphericalArea } from './measure.js';
31
+ // Predicates
32
+ export { contains, intersects, pointInPolygon, within } from './predicates.js';
33
+ // Shaping
34
+ export { isRingClockwise, normalizeMultiPolygonOrientation, normalizePolygonOrientation, normalizeRingOrientation, signedRingArea, simplify, } from './simplify.js';
35
+ // Splitting by a line
36
+ export { segmentIntersection, splitArea } from './split.js';
37
+ // Unit conversion and geodetic constants
38
+ export { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
@@ -0,0 +1,81 @@
1
+ import type { AreaCoordinates, Coordinate } from './types.js';
2
+ /**
3
+ * Returns the geodesic length of a path in meters.
4
+ *
5
+ * The sum of the {@link haversineDistanceMeters} of each section. For the perimeter of a
6
+ * polygon pass its closed ring.
7
+ *
8
+ * @param path The vertices `[lng, lat]` in degrees
9
+ * @returns The length in meters. 0 for fewer than 2 positions. NaN when a position is not
10
+ * finite
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { geodesicLength } from '@sakuzu/maplibre-gl-draw/geometry';
15
+ *
16
+ * geodesicLength([[0, 0], [1, 0], [1, 1]]); // about 222,390 m
17
+ * ```
18
+ */
19
+ export declare function geodesicLength(path: Coordinate[]): number;
20
+ /**
21
+ * Returns the area of a polygon on the sphere in square meters.
22
+ *
23
+ * The input is normalized with {@link normalizeArea} first, so self-intersections are
24
+ * resolved, a hole outside its outer ring is dropped, a hole larger than its outer ring
25
+ * empties the part, and rings that cannot bound an area are dropped. The holes of the
26
+ * normalized form lie inside their outer ring, so subtracting them never makes the result
27
+ * negative. For a MultiPolygon the sum of each part is returned. Ring orientation does not
28
+ * matter. The area is based on the spherical excess on a sphere of radius
29
+ * {@link EARTH_RADIUS_METERS}.
30
+ *
31
+ * @param polygon Polygon or MultiPolygon coordinates in degrees
32
+ * @returns The area in square meters. 0 when nothing with an area remains
33
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
34
+ * retry on the 1e-9 degree grid
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { sphericalArea } from '@sakuzu/maplibre-gl-draw/geometry';
39
+ *
40
+ * // A 1 x 1 degree square on the equator
41
+ * sphericalArea([[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]); // about 1.236e10 m²
42
+ * ```
43
+ */
44
+ export declare function sphericalArea(polygon: AreaCoordinates): number;
45
+ /**
46
+ * Returns the area-weighted centroid of a polygon.
47
+ *
48
+ * The area of the holes is subtracted, and the parts of a MultiPolygon are combined with
49
+ * their areas as the weights. The computation is on the lng/lat plane, an approximation
50
+ * meant for shapes of the scale of an edit. The centroid of a concave shape can fall
51
+ * outside it; use {@link pointOnSurface} for a point that is always inside.
52
+ *
53
+ * @param polygon Polygon or MultiPolygon coordinates in degrees
54
+ * @returns The centroid `[lng, lat]` in degrees. The mean of all the vertices when the area
55
+ * is 0. `null` when there is not a single position
56
+ */
57
+ export declare function centroid(polygon: AreaCoordinates): Coordinate | null;
58
+ /**
59
+ * Returns a representative point that lies inside a polygon, such as a label anchor.
60
+ *
61
+ * If the {@link centroid} is inside the polygon, it is returned. If it is outside (a
62
+ * concave shape, or a centroid in a hole), a horizontal scanline is drawn at the latitude of
63
+ * the centroid and the midpoint of the longest interior section is returned. For a
64
+ * degenerate shape the scanline does not cross, the center of the bounding box is returned.
65
+ *
66
+ * @param polygon Polygon or MultiPolygon coordinates in degrees
67
+ * @returns The point `[lng, lat]` in degrees. `null` when there is not a single position
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * import { centroid, pointOnSurface } from '@sakuzu/maplibre-gl-draw/geometry';
72
+ *
73
+ * // A U shape: the centroid falls in the gap between the arms
74
+ * const u: [number, number][][] = [
75
+ * [[0, 0], [3, 0], [3, 3], [2, 3], [2, 1], [1, 1], [1, 3], [0, 3], [0, 0]],
76
+ * ];
77
+ * centroid(u); // [1.5, 1.357...] (outside)
78
+ * pointOnSurface(u); // [0.5, 1.357...] (inside the left arm)
79
+ * ```
80
+ */
81
+ export declare function pointOnSurface(polygon: AreaCoordinates): Coordinate | null;