@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -1,38 +1,50 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  /**
4
- * Geometry module
4
+ * Geometry calculations that need no map.
5
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.
6
+ * Measure lengths and areas, build circles and buffers, combine polygons, test whether a
7
+ * point lies in a polygon, and tidy shapes. They also work in code that does not use the
8
+ * drawing engine (workers, servers, tests).
11
9
  *
12
- * As a limitation, crossing the ±180 degree meridian and the vicinity of the poles are
13
- * out of scope.
10
+ * ```ts
11
+ * import { area, buffer, union } from '@sakuzu/maplibre-gl-draw/geometry';
12
+ *
13
+ * const a = draw.features.get('park');
14
+ * const b = draw.features.get('lake');
15
+ * const merged = union([a, b]); // Polygon | MultiPolygon | null
16
+ * const zone = buffer(merged, 300); // the area within 300 m
17
+ * console.log(area(zone) / 1e6, 'km²');
18
+ * ```
19
+ *
20
+ * The functions take GeoJSON geometries, or anything with a `geometry` field whose geometry
21
+ * they use (GeoJSON features and the features of the drawing), and return GeoJSON geometries. Lengths, distances, radii and tolerances are in meters, areas in
22
+ * square meters, and bearings and coordinates in degrees. An input whose shape a function
23
+ * cannot take throws a {@link GeometryError}; a computation whose result is empty returns null.
24
+ * Crossing the ±180 degree meridian and the vicinity of the poles are out of scope.
25
+ *
26
+ * Read next: the guide
27
+ * [snapping and geometry](https://sakuzu.github.io/maplibre-gl-draw/guides/snapping-geometry),
28
+ * which also shows the operations that change the drawing (`draw.features.union` and the
29
+ * rest). The functions used most are {@link area}, {@link length}, {@link buffer} and
30
+ * {@link union}.
31
+ *
32
+ * @module geometry
14
33
  */
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';
34
+ // biome-ignore-all assist/source/organizeImports: the exports are grouped by section
35
+ // Measure
36
+ export { along, area, bearing, centroid, destination, distance, length, midpoint, nearestPointOnLine, perimeter, pointOnSurface, } from './public-measure.js';
37
+ // Create
38
+ export { buffer, circle } from './public-create.js';
39
+ // Combine
40
+ export { difference, intersection, split, union } from './public-combine.js';
41
+ // Test
42
+ export { bboxContains, bboxIntersects } from './bbox.js';
43
+ export { contains, overlaps, pointInPolygon } from './public-predicates.js';
44
+ // Repair
45
+ export { makeValid, rewind, simplify } from './public-repair.js';
46
+ // Bounds and units
47
+ export { bbox } from './public-bounds.js';
48
+ export { metersToDegrees } from './units.js';
28
49
  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';
50
+ export { EARTH_RADIUS_METERS } from './units.js';
@@ -8,13 +8,6 @@ import type { AreaCoordinates, Coordinate } from './types.js';
8
8
  * @param path The vertices `[lng, lat]` in degrees
9
9
  * @returns The length in meters. 0 for fewer than 2 positions. NaN when a position is not
10
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
11
  */
19
12
  export declare function geodesicLength(path: Coordinate[]): number;
20
13
  /**
@@ -32,14 +25,6 @@ export declare function geodesicLength(path: Coordinate[]): number;
32
25
  * @returns The area in square meters. 0 when nothing with an area remains
33
26
  * @throws {@link GeometryError} when the boolean operation engine fails even after the
34
27
  * 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
28
  */
44
29
  export declare function sphericalArea(polygon: AreaCoordinates): number;
45
30
  /**
@@ -65,17 +50,5 @@ export declare function centroid(polygon: AreaCoordinates): Coordinate | null;
65
50
  *
66
51
  * @param polygon Polygon or MultiPolygon coordinates in degrees
67
52
  * @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
53
  */
81
54
  export declare function pointOnSurface(polygon: AreaCoordinates): Coordinate | null;
@@ -22,13 +22,6 @@ import { EARTH_RADIUS_METERS, toRadians } from './units.js';
22
22
  * @param path The vertices `[lng, lat]` in degrees
23
23
  * @returns The length in meters. 0 for fewer than 2 positions. NaN when a position is not
24
24
  * finite
25
- *
26
- * @example
27
- * ```ts
28
- * import { geodesicLength } from '@sakuzu/maplibre-gl-draw/geometry';
29
- *
30
- * geodesicLength([[0, 0], [1, 0], [1, 1]]); // about 222,390 m
31
- * ```
32
25
  */
33
26
  export function geodesicLength(path) {
34
27
  let total = 0;
@@ -69,14 +62,6 @@ function sphericalRingArea(ring) {
69
62
  * @returns The area in square meters. 0 when nothing with an area remains
70
63
  * @throws {@link GeometryError} when the boolean operation engine fails even after the
71
64
  * retry on the 1e-9 degree grid
72
- *
73
- * @example
74
- * ```ts
75
- * import { sphericalArea } from '@sakuzu/maplibre-gl-draw/geometry';
76
- *
77
- * // A 1 x 1 degree square on the equator
78
- * sphericalArea([[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]); // about 1.236e10 m²
79
- * ```
80
65
  */
81
66
  export function sphericalArea(polygon) {
82
67
  let total = 0;
@@ -192,18 +177,6 @@ function scanlineCrossings(polygon, lat) {
192
177
  *
193
178
  * @param polygon Polygon or MultiPolygon coordinates in degrees
194
179
  * @returns The point `[lng, lat]` in degrees. `null` when there is not a single position
195
- *
196
- * @example
197
- * ```ts
198
- * import { centroid, pointOnSurface } from '@sakuzu/maplibre-gl-draw/geometry';
199
- *
200
- * // A U shape: the centroid falls in the gap between the arms
201
- * const u: [number, number][][] = [
202
- * [[0, 0], [3, 0], [3, 3], [2, 3], [2, 1], [1, 1], [1, 3], [0, 3], [0, 0]],
203
- * ];
204
- * centroid(u); // [1.5, 1.357...] (outside)
205
- * pointOnSurface(u); // [0.5, 1.357...] (inside the left arm)
206
- * ```
207
180
  */
208
181
  export function pointOnSurface(polygon) {
209
182
  const center = centroid(polygon);
@@ -10,15 +10,6 @@ import type { AreaCoordinates, Coordinate } from './types.js';
10
10
  * @param polygon Polygon or MultiPolygon coordinates in degrees
11
11
  * @returns `true` when the point is inside an outer ring and inside none of its holes (in
12
12
  * any part of a MultiPolygon). `false` for empty coordinates
13
- *
14
- * @example
15
- * ```ts
16
- * import { pointInPolygon } from '@sakuzu/maplibre-gl-draw/geometry';
17
- *
18
- * const square: [number, number][][] = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
19
- * pointInPolygon([0.5, 0.5], square); // true
20
- * pointInPolygon([2, 0.5], square); // false
21
- * ```
22
13
  */
23
14
  export declare function pointInPolygon(point: Coordinate, polygon: AreaCoordinates): boolean;
24
15
  /**
@@ -43,15 +43,6 @@ function pointInRing(point, ring) {
43
43
  * @param polygon Polygon or MultiPolygon coordinates in degrees
44
44
  * @returns `true` when the point is inside an outer ring and inside none of its holes (in
45
45
  * any part of a MultiPolygon). `false` for empty coordinates
46
- *
47
- * @example
48
- * ```ts
49
- * import { pointInPolygon } from '@sakuzu/maplibre-gl-draw/geometry';
50
- *
51
- * const square: [number, number][][] = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
52
- * pointInPolygon([0.5, 0.5], square); // true
53
- * pointInPolygon([2, 0.5], square); // false
54
- * ```
55
46
  */
56
47
  export function pointInPolygon(point, polygon) {
57
48
  for (const part of toMultiPolygonCoordinates(polygon)) {
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Bounds: the public bounding box of a geometry
3
+ */
4
+ import type { Geometry } from 'geojson';
5
+ import type { BBox } from './types.js';
6
+ /**
7
+ * Returns the bounding box `[minLng, minLat, maxLng, maxLat]` in degrees of a geometry.
8
+ *
9
+ * @param geometry The geometry, or a feature whose geometry it is; coordinates in degrees.
10
+ * Every position counts, the holes and the members of a collection included; a position
11
+ * that is not finite is skipped. Crossing the ±180 degree meridian is not handled
12
+ * @returns The box in degrees
13
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a geometry or a feature
14
+ * with one, and when it has no finite position
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { bbox } from '@sakuzu/maplibre-gl-draw/geometry';
19
+ *
20
+ * bbox({ type: 'LineString', coordinates: [[139.7, 35.6], [139.8, 35.7]] });
21
+ * // [139.7, 35.6, 139.8, 35.7]
22
+ * ```
23
+ */
24
+ export declare function bbox(geometry: Geometry | {
25
+ readonly geometry: Geometry;
26
+ }): BBox;
@@ -0,0 +1,30 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { coordinatesBBox } from './bbox.js';
4
+ import { invalidInput } from './errors.js';
5
+ import { geometryOf, positionsOf } from './geojson.js';
6
+ /**
7
+ * Returns the bounding box `[minLng, minLat, maxLng, maxLat]` in degrees of a geometry.
8
+ *
9
+ * @param geometry The geometry, or a feature whose geometry it is; coordinates in degrees.
10
+ * Every position counts, the holes and the members of a collection included; a position
11
+ * that is not finite is skipped. Crossing the ±180 degree meridian is not handled
12
+ * @returns The box in degrees
13
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a geometry or a feature
14
+ * with one, and when it has no finite position
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { bbox } from '@sakuzu/maplibre-gl-draw/geometry';
19
+ *
20
+ * bbox({ type: 'LineString', coordinates: [[139.7, 35.6], [139.8, 35.7]] });
21
+ * // [139.7, 35.6, 139.8, 35.7]
22
+ * ```
23
+ */
24
+ export function bbox(geometry) {
25
+ const box = coordinatesBBox(positionsOf(geometryOf(geometry, 'bbox')));
26
+ if (box === null) {
27
+ throw invalidInput('bbox', 'the geometry has no finite position');
28
+ }
29
+ return box;
30
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Combine: the public boolean operations on polygons and the split by a line
3
+ */
4
+ import type { Geometry, LineString, MultiPolygon, Polygon } from 'geojson';
5
+ /**
6
+ * Returns the union of polygons.
7
+ *
8
+ * @param polygons The Polygons and MultiPolygons, or features whose geometry is one;
9
+ * coordinates in degrees. Rings with fewer than 3 positions or a position that is not finite
10
+ * are left out
11
+ * @returns A Polygon, or a MultiPolygon when the union falls apart, with self-intersections
12
+ * resolved and the rings oriented as RFC 7946 recommends. null when nothing has an area
13
+ * @throws {@link GeometryError} (`invalid-input`) when an element is not a Polygon or a
14
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { union } from '@sakuzu/maplibre-gl-draw/geometry';
19
+ *
20
+ * union([
21
+ * { type: 'Polygon', coordinates: [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]] },
22
+ * { type: 'Polygon', coordinates: [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]] },
23
+ * ]);
24
+ * // { type: 'Polygon', coordinates: [[[0, 0], [1.5, 0], [1.5, 1], [0, 1], [0, 0]]] }
25
+ * ```
26
+ */
27
+ export declare function union(polygons: readonly (Polygon | MultiPolygon | {
28
+ readonly geometry: Geometry;
29
+ })[]): Polygon | MultiPolygon | null;
30
+ /**
31
+ * Returns the part that polygons have in common.
32
+ *
33
+ * @param polygons The Polygons and MultiPolygons, or features whose geometry is one;
34
+ * coordinates in degrees
35
+ * @returns A Polygon or a MultiPolygon in the form {@link union} returns. null when the
36
+ * polygons share no area (touching boundaries included), when one has no area, and for an
37
+ * empty array
38
+ * @throws {@link GeometryError} (`invalid-input`) when an element is not a Polygon or a
39
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
40
+ */
41
+ export declare function intersection(polygons: readonly (Polygon | MultiPolygon | {
42
+ readonly geometry: Geometry;
43
+ })[]): Polygon | MultiPolygon | null;
44
+ /**
45
+ * Returns a polygon with other polygons removed from it.
46
+ *
47
+ * @param subject The Polygon or MultiPolygon to remove from, or a feature whose geometry is
48
+ * one; coordinates in degrees
49
+ * @param others The Polygons and MultiPolygons to remove, or features whose geometry is one;
50
+ * coordinates in degrees
51
+ * @returns A Polygon or a MultiPolygon in the form {@link union} returns; a removed area inside
52
+ * the subject becomes a hole. null when nothing remains
53
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not a Polygon or a
54
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
55
+ */
56
+ export declare function difference(subject: Polygon | MultiPolygon | {
57
+ readonly geometry: Geometry;
58
+ }, others: readonly (Polygon | MultiPolygon | {
59
+ readonly geometry: Geometry;
60
+ })[]): Polygon | MultiPolygon | null;
61
+ /**
62
+ * Cuts a polygon with a line and returns the pieces.
63
+ *
64
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
65
+ * in degrees
66
+ * @param line The cutting LineString, or a feature whose geometry is one; coordinates in
67
+ * degrees. A stretch that runs along the boundary does not cut, and positions closer than
68
+ * 1e-9 degrees count as one
69
+ * @returns One Polygon per piece, holes kept. When the line does not cut across, the polygon
70
+ * itself (one Polygon per part of a MultiPolygon). An empty array when it has no area
71
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected
72
+ * type, and (`engine-failure`) when the boolean operation fails
73
+ */
74
+ export declare function split(polygon: Polygon | MultiPolygon | {
75
+ readonly geometry: Geometry;
76
+ }, line: LineString | {
77
+ readonly geometry: Geometry;
78
+ }): Polygon[];
@@ -0,0 +1,82 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { differenceAll, intersectionAll, unionAll } from './boolean.js';
4
+ import { withOperation } from './errors.js';
5
+ import { areaOf, areasOf, lineOf, toAreaGeometry } from './geojson.js';
6
+ import { splitArea } from './split.js';
7
+ /**
8
+ * Returns the union of polygons.
9
+ *
10
+ * @param polygons The Polygons and MultiPolygons, or features whose geometry is one;
11
+ * coordinates in degrees. Rings with fewer than 3 positions or a position that is not finite
12
+ * are left out
13
+ * @returns A Polygon, or a MultiPolygon when the union falls apart, with self-intersections
14
+ * resolved and the rings oriented as RFC 7946 recommends. null when nothing has an area
15
+ * @throws {@link GeometryError} (`invalid-input`) when an element is not a Polygon or a
16
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { union } from '@sakuzu/maplibre-gl-draw/geometry';
21
+ *
22
+ * union([
23
+ * { type: 'Polygon', coordinates: [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]] },
24
+ * { type: 'Polygon', coordinates: [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]] },
25
+ * ]);
26
+ * // { type: 'Polygon', coordinates: [[[0, 0], [1.5, 0], [1.5, 1], [0, 1], [0, 0]]] }
27
+ * ```
28
+ */
29
+ export function union(polygons) {
30
+ const inputs = areasOf(polygons, 'union');
31
+ return withOperation('union', () => toAreaGeometry(unionAll(inputs)));
32
+ }
33
+ /**
34
+ * Returns the part that polygons have in common.
35
+ *
36
+ * @param polygons The Polygons and MultiPolygons, or features whose geometry is one;
37
+ * coordinates in degrees
38
+ * @returns A Polygon or a MultiPolygon in the form {@link union} returns. null when the
39
+ * polygons share no area (touching boundaries included), when one has no area, and for an
40
+ * empty array
41
+ * @throws {@link GeometryError} (`invalid-input`) when an element is not a Polygon or a
42
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
43
+ */
44
+ export function intersection(polygons) {
45
+ const inputs = areasOf(polygons, 'intersection');
46
+ return withOperation('intersection', () => toAreaGeometry(intersectionAll(inputs)));
47
+ }
48
+ /**
49
+ * Returns a polygon with other polygons removed from it.
50
+ *
51
+ * @param subject The Polygon or MultiPolygon to remove from, or a feature whose geometry is
52
+ * one; coordinates in degrees
53
+ * @param others The Polygons and MultiPolygons to remove, or features whose geometry is one;
54
+ * coordinates in degrees
55
+ * @returns A Polygon or a MultiPolygon in the form {@link union} returns; a removed area inside
56
+ * the subject becomes a hole. null when nothing remains
57
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not a Polygon or a
58
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
59
+ */
60
+ export function difference(subject, others) {
61
+ const left = areaOf(subject, 'difference');
62
+ const right = areasOf(others, 'difference');
63
+ return withOperation('difference', () => toAreaGeometry(differenceAll(left, right)));
64
+ }
65
+ /**
66
+ * Cuts a polygon with a line and returns the pieces.
67
+ *
68
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
69
+ * in degrees
70
+ * @param line The cutting LineString, or a feature whose geometry is one; coordinates in
71
+ * degrees. A stretch that runs along the boundary does not cut, and positions closer than
72
+ * 1e-9 degrees count as one
73
+ * @returns One Polygon per piece, holes kept. When the line does not cut across, the polygon
74
+ * itself (one Polygon per part of a MultiPolygon). An empty array when it has no area
75
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected
76
+ * type, and (`engine-failure`) when the boolean operation fails
77
+ */
78
+ export function split(polygon, line) {
79
+ const area = areaOf(polygon, 'split');
80
+ const path = lineOf(line, 'split');
81
+ return withOperation('split', () => splitArea(area, path).flatMap((piece) => piece.map((coordinates) => ({ type: 'Polygon', coordinates }))));
82
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Create: the public functions that build polygons from distances in meters
3
+ */
4
+ import type { Geometry, MultiPolygon, Point, Polygon, Position } from 'geojson';
5
+ /**
6
+ * Returns a polygon that approximates the geodesic circle of a radius in meters around a
7
+ * center.
8
+ *
9
+ * @param center The center, a position `[lng, lat]` in degrees or a Point
10
+ * @param radiusMeters The radius in meters, 0 or more. Every vertex lies at this great-circle
11
+ * distance from the center
12
+ * @param options `segments`, the number of vertices (64 by default, rounded down and clamped
13
+ * to 3-1024)
14
+ * @returns The Polygon, its ring starting due north of the center and running
15
+ * counter-clockwise, with the first position repeated at the end
16
+ * @throws {@link GeometryError} (`invalid-input`) when the center is not a position or a
17
+ * Point or is not finite, and when the radius is negative or not finite
18
+ */
19
+ export declare function circle(center: Position | Point, radiusMeters: number, options?: {
20
+ segments?: number;
21
+ }): Polygon;
22
+ /**
23
+ * Returns the area within a distance in meters of a geometry, or a polygon shrunk by it when
24
+ * the distance is negative.
25
+ *
26
+ * @param geometry The geometry, or a feature whose geometry it is; coordinates in degrees. The
27
+ * members of a GeometryCollection are buffered one by one and the results merged
28
+ * @param distanceMeters The distance in meters. A negative distance shrinks a polygon and
29
+ * leaves nothing of a point or a line
30
+ * @param options `segments`, the number of segments of each circle (64 by default, rounded
31
+ * down and clamped to 3-1024)
32
+ * @returns A Polygon, or a MultiPolygon when the area falls apart. null when nothing remains,
33
+ * and when a vertex is so close to a pole or an edge so long in longitude (over 180 degrees)
34
+ * that the area cannot be drawn in longitude and latitude
35
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a geometry or a
36
+ * feature with one and when the distance is not a finite number, and (`engine-failure`)
37
+ * when merging the parts fails
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import { buffer } from '@sakuzu/maplibre-gl-draw/geometry';
42
+ *
43
+ * // The area within 100 m of a road
44
+ * const corridor = buffer(
45
+ * { type: 'LineString', coordinates: [[139.76, 35.68], [139.77, 35.69]] },
46
+ * 100,
47
+ * );
48
+ * ```
49
+ */
50
+ export declare function buffer(geometry: Geometry | {
51
+ readonly geometry: Geometry;
52
+ }, distanceMeters: number, options?: {
53
+ segments?: number;
54
+ }): Polygon | MultiPolygon | null;
@@ -0,0 +1,70 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { unionAll } from './boolean.js';
4
+ import { buffer as bufferCoordinates } from './buffer.js';
5
+ import { generateCirclePolygon } from './circle.js';
6
+ import { invalidInput, withOperation } from './errors.js';
7
+ import { geometryOf, positionOf, toAreaGeometry, toPosition } from './geojson.js';
8
+ /**
9
+ * Returns a polygon that approximates the geodesic circle of a radius in meters around a
10
+ * center.
11
+ *
12
+ * @param center The center, a position `[lng, lat]` in degrees or a Point
13
+ * @param radiusMeters The radius in meters, 0 or more. Every vertex lies at this great-circle
14
+ * distance from the center
15
+ * @param options `segments`, the number of vertices (64 by default, rounded down and clamped
16
+ * to 3-1024)
17
+ * @returns The Polygon, its ring starting due north of the center and running
18
+ * counter-clockwise, with the first position repeated at the end
19
+ * @throws {@link GeometryError} (`invalid-input`) when the center is not a position or a
20
+ * Point or is not finite, and when the radius is negative or not finite
21
+ */
22
+ export function circle(center, radiusMeters, options) {
23
+ const ring = generateCirclePolygon(positionOf(center, 'circle'), radiusMeters, options?.segments);
24
+ if (ring.length === 0) {
25
+ throw invalidInput('circle', 'the center or the radius is not a finite number');
26
+ }
27
+ return { type: 'Polygon', coordinates: [ring.map(toPosition).reverse()] };
28
+ }
29
+ /** The buffer of a geometry as MultiPolygon coordinates, each member of a collection alone */
30
+ function bufferOf(geometry, distanceMeters, segments) {
31
+ if (geometry.type === 'GeometryCollection') {
32
+ return unionAll(geometry.geometries.map((member) => bufferOf(geometryOf(member, 'buffer'), distanceMeters, segments)));
33
+ }
34
+ return bufferCoordinates(geometry, distanceMeters, { segments }) ?? [];
35
+ }
36
+ /**
37
+ * Returns the area within a distance in meters of a geometry, or a polygon shrunk by it when
38
+ * the distance is negative.
39
+ *
40
+ * @param geometry The geometry, or a feature whose geometry it is; coordinates in degrees. The
41
+ * members of a GeometryCollection are buffered one by one and the results merged
42
+ * @param distanceMeters The distance in meters. A negative distance shrinks a polygon and
43
+ * leaves nothing of a point or a line
44
+ * @param options `segments`, the number of segments of each circle (64 by default, rounded
45
+ * down and clamped to 3-1024)
46
+ * @returns A Polygon, or a MultiPolygon when the area falls apart. null when nothing remains,
47
+ * and when a vertex is so close to a pole or an edge so long in longitude (over 180 degrees)
48
+ * that the area cannot be drawn in longitude and latitude
49
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a geometry or a
50
+ * feature with one and when the distance is not a finite number, and (`engine-failure`)
51
+ * when merging the parts fails
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { buffer } from '@sakuzu/maplibre-gl-draw/geometry';
56
+ *
57
+ * // The area within 100 m of a road
58
+ * const corridor = buffer(
59
+ * { type: 'LineString', coordinates: [[139.76, 35.68], [139.77, 35.69]] },
60
+ * 100,
61
+ * );
62
+ * ```
63
+ */
64
+ export function buffer(geometry, distanceMeters, options) {
65
+ const input = geometryOf(geometry, 'buffer');
66
+ if (!Number.isFinite(distanceMeters)) {
67
+ throw invalidInput('buffer', 'the distance is not a finite number');
68
+ }
69
+ return withOperation('buffer', () => toAreaGeometry(bufferOf(input, distanceMeters, options?.segments)));
70
+ }