@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,162 @@
1
+ import type { AreaCoordinates, MultiPolygonCoordinates } from './types.js';
2
+ /**
3
+ * Converts Polygon or MultiPolygon coordinates into normalized MultiPolygon coordinates.
4
+ *
5
+ * Resolves self-intersections (a figure-eight becomes two parts), unifies the ring
6
+ * orientations (outer rings counter-clockwise, holes clockwise) and removes the rings that
7
+ * have no area. Rings with fewer than 3 positions or with a position that is not finite are
8
+ * dropped first, and a part whose outer ring is dropped is dropped with its holes.
9
+ *
10
+ * @param coordinates Polygon or MultiPolygon coordinates in degrees
11
+ * @returns The normalized MultiPolygon coordinates, each ring closed. An empty array means
12
+ * the input has no area
13
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
14
+ * retry on the 1e-9 degree grid
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { normalizeArea } from '@sakuzu/maplibre-gl-draw/geometry';
19
+ *
20
+ * // A self-intersecting bow tie becomes two triangles
21
+ * normalizeArea([[[0, 0], [1, 1], [1, 0], [0, 1], [0, 0]]]);
22
+ * // [[[[0, 0], [0.5, 0.5], [0, 1], [0, 0]]], [[[0.5, 0.5], [1, 0], [1, 1], [0.5, 0.5]]]]
23
+ * ```
24
+ */
25
+ export declare function normalizeArea(coordinates: AreaCoordinates): MultiPolygonCoordinates;
26
+ /**
27
+ * Returns the union of two polygons.
28
+ *
29
+ * The operation is topological and runs on the lng/lat plane as it is. Rings that cannot
30
+ * bound an area are dropped first (see {@link normalizeArea}), so an input with no area
31
+ * leaves the other input normalized.
32
+ *
33
+ * @param a Polygon or MultiPolygon coordinates in degrees
34
+ * @param b Polygon or MultiPolygon coordinates in degrees
35
+ * @returns The normalized MultiPolygon coordinates of the union. Disjoint inputs become
36
+ * several parts. An empty array when neither input has an area
37
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
38
+ * retry on the 1e-9 degree grid
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
43
+ * import { union } from '@sakuzu/maplibre-gl-draw/geometry';
44
+ *
45
+ * const a: PolygonCoordinates = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
46
+ * const b: PolygonCoordinates = [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]];
47
+ * union(a, b); // [[[[0, 0], [1.5, 0], [1.5, 1], [0, 1], [0, 0]]]]
48
+ * ```
49
+ */
50
+ export declare function union(a: AreaCoordinates, b: AreaCoordinates): MultiPolygonCoordinates;
51
+ /**
52
+ * Returns the part of one polygon that lies outside another.
53
+ *
54
+ * Removing a region inside `a` produces a hole (an inner ring).
55
+ *
56
+ * @param a The Polygon or MultiPolygon coordinates to subtract from, in degrees
57
+ * @param b The Polygon or MultiPolygon coordinates to subtract, in degrees
58
+ * @returns The normalized MultiPolygon coordinates of `a` with `b` removed. An empty array
59
+ * when `a` has no area or `b` covers it. `a` normalized when `b` has no area
60
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
61
+ * retry on the 1e-9 degree grid
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
66
+ * import { difference } from '@sakuzu/maplibre-gl-draw/geometry';
67
+ *
68
+ * const a: PolygonCoordinates = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
69
+ * const b: PolygonCoordinates = [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]];
70
+ * difference(a, b); // [[[[0, 0], [0.5, 0], [0.5, 1], [0, 1], [0, 0]]]]
71
+ * ```
72
+ */
73
+ export declare function difference(a: AreaCoordinates, b: AreaCoordinates): MultiPolygonCoordinates;
74
+ /**
75
+ * Returns the common part of two polygons.
76
+ *
77
+ * @param a Polygon or MultiPolygon coordinates in degrees
78
+ * @param b Polygon or MultiPolygon coordinates in degrees
79
+ * @returns The normalized MultiPolygon coordinates of the common part. An empty array when
80
+ * the inputs do not overlap, when only their boundaries touch, and when either has no
81
+ * area
82
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
83
+ * retry on the 1e-9 degree grid
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
88
+ * import { intersection } from '@sakuzu/maplibre-gl-draw/geometry';
89
+ *
90
+ * const a: PolygonCoordinates = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
91
+ * const b: PolygonCoordinates = [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]];
92
+ * intersection(a, b); // [[[[0.5, 0], [1, 0], [1, 1], [0.5, 1], [0.5, 0]]]]
93
+ * ```
94
+ */
95
+ export declare function intersection(a: AreaCoordinates, b: AreaCoordinates): MultiPolygonCoordinates;
96
+ /**
97
+ * Keeps only the part of a subject polygon that lies inside a clip region.
98
+ *
99
+ * Between polygons it is the same operation as {@link intersection}; it differs only in
100
+ * that the meaning of the arguments (the subject and the region) is fixed.
101
+ *
102
+ * @param subject The Polygon or MultiPolygon coordinates to clip, in degrees
103
+ * @param clipRegion The Polygon or MultiPolygon coordinates of the region, in degrees
104
+ * @returns The normalized MultiPolygon coordinates that remain inside the region. An empty
105
+ * array when nothing remains or either input has no area
106
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
107
+ * retry on the 1e-9 degree grid
108
+ */
109
+ export declare function clip(subject: AreaCoordinates, clipRegion: AreaCoordinates): MultiPolygonCoordinates;
110
+ /**
111
+ * Returns the union of every polygon in an array.
112
+ *
113
+ * Passing many inputs to the engine at once can make it fail to close the output ring, so
114
+ * they are folded in the shape of a binary tree (cascaded union). The union is associative
115
+ * and the order of the folding is fixed, so the result is deterministic. Elements with no
116
+ * area are skipped.
117
+ *
118
+ * @param geometries Polygon or MultiPolygon coordinates in degrees
119
+ * @returns The normalized MultiPolygon coordinates of the union. An empty array for an
120
+ * empty array and when no element has an area
121
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
122
+ * retry on the 1e-9 degree grid
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * import { unionAll } from '@sakuzu/maplibre-gl-draw/geometry';
127
+ *
128
+ * const merged = unionAll([
129
+ * [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]],
130
+ * [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]],
131
+ * [[[5, 5], [6, 5], [6, 6], [5, 5]]],
132
+ * ]);
133
+ * merged.length; // 2 (the overlapping squares fuse; the triangle stays apart)
134
+ * ```
135
+ */
136
+ export declare function unionAll(geometries: AreaCoordinates[]): MultiPolygonCoordinates;
137
+ /**
138
+ * Returns the part common to every polygon in an array.
139
+ *
140
+ * The intersection shrinks monotonically, so the elements are folded in order from the
141
+ * head and the fold stops as soon as it becomes empty.
142
+ *
143
+ * @param geometries Polygon or MultiPolygon coordinates in degrees
144
+ * @returns The normalized MultiPolygon coordinates common to all of them. An empty array for
145
+ * an empty array and when even one element has no area
146
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
147
+ * retry on the 1e-9 degree grid
148
+ */
149
+ export declare function intersectionAll(geometries: AreaCoordinates[]): MultiPolygonCoordinates;
150
+ /**
151
+ * Returns a subject polygon with every polygon in an array removed.
152
+ *
153
+ * @param subject The Polygon or MultiPolygon coordinates to subtract from, in degrees
154
+ * @param geometries The Polygon or MultiPolygon coordinates to subtract, in degrees.
155
+ * Elements with no area are skipped
156
+ * @returns The normalized MultiPolygon coordinates of the difference. An empty array when
157
+ * the subject has no area or is covered. The subject normalized when nothing is
158
+ * subtracted
159
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
160
+ * retry on the 1e-9 degree grid
161
+ */
162
+ export declare function differenceAll(subject: AreaCoordinates, geometries: AreaCoordinates[]): MultiPolygonCoordinates;
@@ -0,0 +1,331 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Boolean operations
5
+ *
6
+ * The body is polygon-clipping. The input accepts either Polygon coordinates or
7
+ * MultiPolygon coordinates, and the result is always returned as MultiPolygon
8
+ * coordinates. Because these are topological operations that use no metric of
9
+ * distance or area, they close correctly on the lng/lat plane as it is.
10
+ */
11
+ import polygonClipping from 'polygon-clipping';
12
+ import { usableAreaParts } from './coords.js';
13
+ import { toGeometryError } from './errors.js';
14
+ /**
15
+ * Shapes the input into a form that can be passed to polygon-clipping
16
+ *
17
+ * A ring that cannot bound an area (fewer than 3 points, or a coordinate that is not a
18
+ * finite number) is dropped, and a part whose outer ring is dropped is removed with its
19
+ * holes. polygon-clipping itself throws an internal error on NaN and silently drops
20
+ * Infinity, so this is the boundary that keeps such input from reaching it.
21
+ */
22
+ function sanitize(coordinates) {
23
+ return usableAreaParts(coordinates);
24
+ }
25
+ /**
26
+ * The step of the grid onto which the coordinates are placed on a retry (degrees)
27
+ *
28
+ * 1e-9 degrees is roughly 0.1mm at the equator, and the displacement caused by the
29
+ * rounding is half of that, so it does not show up in the measurements of a feature
30
+ * (the same step as NODE_QUANTUM in split.ts). On the other hand it is 5 digits larger
31
+ * than the smallest step of double precision (about 1.4e-14 degrees in the 140-degree
32
+ * longitude range), so a discrepancy arising from cancellation is absorbed for certain.
33
+ */
34
+ const SNAP_QUANTUM = 1e-9;
35
+ /**
36
+ * Returns a copy with the coordinates placed onto the grid
37
+ */
38
+ function snap(parts) {
39
+ return parts.map((polygon) => polygon.map((ring) => ring.map(([x, y]) => [
40
+ Math.round(x / SNAP_QUANTUM) * SNAP_QUANTUM,
41
+ Math.round(y / SNAP_QUANTUM) * SNAP_QUANTUM,
42
+ ])));
43
+ }
44
+ /** The operations of polygon-clipping, by name */
45
+ const OPERATIONS = {
46
+ union: polygonClipping.union,
47
+ difference: polygonClipping.difference,
48
+ intersection: polygonClipping.intersection,
49
+ };
50
+ /**
51
+ * Calls polygon-clipping and, only when it fails, rounds the coordinates and retries
52
+ * once
53
+ *
54
+ * Vertices that adjacent polygons hold on the same edge can differ by the smallest step
55
+ * of double precision when they are produced by separate operations. polygon-clipping
56
+ * regards this difference as identical in its comparisons while treating the points as
57
+ * distinct in value, so it fails to close the output ring and throws an exception.
58
+ * Placing the coordinates back onto the grid makes the shifted vertices take the same
59
+ * value, and the same operation then succeeds.
60
+ *
61
+ * The rounding is applied only to the input that failed. If every input were rounded in
62
+ * advance, there are inputs in which edges that were barely separated by the jitter
63
+ * would overlap completely and become unsolvable instead (the buffer of a nearly
64
+ * collinear line is a real example). The rule of the rounding is deterministic, so even
65
+ * when the retry is entered the result is determined by the input alone.
66
+ *
67
+ * When the retry fails too, the error leaves as a GeometryError with a reason code
68
+ * instead of the internal message of polygon-clipping.
69
+ */
70
+ function run(operation, parts) {
71
+ const clipper = OPERATIONS[operation];
72
+ const [first, ...rest] = parts;
73
+ try {
74
+ return clipper(first, ...rest);
75
+ }
76
+ catch {
77
+ const [snapped, ...snappedRest] = parts.map(snap);
78
+ try {
79
+ return clipper(snapped, ...snappedRest);
80
+ }
81
+ catch (error) {
82
+ throw toGeometryError(error, operation);
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * Resolves self-intersections and normalizes the orientations (the normalized form of
88
+ * polygon-clipping)
89
+ */
90
+ function normalize(coordinates) {
91
+ if (coordinates.length === 0) {
92
+ return [];
93
+ }
94
+ return run('union', [coordinates]);
95
+ }
96
+ /**
97
+ * Converts Polygon or MultiPolygon coordinates into normalized MultiPolygon coordinates.
98
+ *
99
+ * Resolves self-intersections (a figure-eight becomes two parts), unifies the ring
100
+ * orientations (outer rings counter-clockwise, holes clockwise) and removes the rings that
101
+ * have no area. Rings with fewer than 3 positions or with a position that is not finite are
102
+ * dropped first, and a part whose outer ring is dropped is dropped with its holes.
103
+ *
104
+ * @param coordinates Polygon or MultiPolygon coordinates in degrees
105
+ * @returns The normalized MultiPolygon coordinates, each ring closed. An empty array means
106
+ * the input has no area
107
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
108
+ * retry on the 1e-9 degree grid
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * import { normalizeArea } from '@sakuzu/maplibre-gl-draw/geometry';
113
+ *
114
+ * // A self-intersecting bow tie becomes two triangles
115
+ * normalizeArea([[[0, 0], [1, 1], [1, 0], [0, 1], [0, 0]]]);
116
+ * // [[[[0, 0], [0.5, 0.5], [0, 1], [0, 0]]], [[[0.5, 0.5], [1, 0], [1, 1], [0.5, 0.5]]]]
117
+ * ```
118
+ */
119
+ export function normalizeArea(coordinates) {
120
+ return normalize(sanitize(coordinates));
121
+ }
122
+ /**
123
+ * Returns the union of two polygons.
124
+ *
125
+ * The operation is topological and runs on the lng/lat plane as it is. Rings that cannot
126
+ * bound an area are dropped first (see {@link normalizeArea}), so an input with no area
127
+ * leaves the other input normalized.
128
+ *
129
+ * @param a Polygon or MultiPolygon coordinates in degrees
130
+ * @param b Polygon or MultiPolygon coordinates in degrees
131
+ * @returns The normalized MultiPolygon coordinates of the union. Disjoint inputs become
132
+ * several parts. An empty array when neither input has an area
133
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
134
+ * retry on the 1e-9 degree grid
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
139
+ * import { union } from '@sakuzu/maplibre-gl-draw/geometry';
140
+ *
141
+ * const a: PolygonCoordinates = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
142
+ * const b: PolygonCoordinates = [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]];
143
+ * union(a, b); // [[[[0, 0], [1.5, 0], [1.5, 1], [0, 1], [0, 0]]]]
144
+ * ```
145
+ */
146
+ export function union(a, b) {
147
+ const left = sanitize(a);
148
+ const right = sanitize(b);
149
+ if (left.length === 0) {
150
+ return normalize(right);
151
+ }
152
+ if (right.length === 0) {
153
+ return normalize(left);
154
+ }
155
+ return run('union', [left, right]);
156
+ }
157
+ /**
158
+ * Returns the part of one polygon that lies outside another.
159
+ *
160
+ * Removing a region inside `a` produces a hole (an inner ring).
161
+ *
162
+ * @param a The Polygon or MultiPolygon coordinates to subtract from, in degrees
163
+ * @param b The Polygon or MultiPolygon coordinates to subtract, in degrees
164
+ * @returns The normalized MultiPolygon coordinates of `a` with `b` removed. An empty array
165
+ * when `a` has no area or `b` covers it. `a` normalized when `b` has no area
166
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
167
+ * retry on the 1e-9 degree grid
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
172
+ * import { difference } from '@sakuzu/maplibre-gl-draw/geometry';
173
+ *
174
+ * const a: PolygonCoordinates = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
175
+ * const b: PolygonCoordinates = [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]];
176
+ * difference(a, b); // [[[[0, 0], [0.5, 0], [0.5, 1], [0, 1], [0, 0]]]]
177
+ * ```
178
+ */
179
+ export function difference(a, b) {
180
+ const left = sanitize(a);
181
+ const right = sanitize(b);
182
+ if (left.length === 0) {
183
+ return [];
184
+ }
185
+ if (right.length === 0) {
186
+ return normalize(left);
187
+ }
188
+ return run('difference', [left, right]);
189
+ }
190
+ /**
191
+ * Returns the common part of two polygons.
192
+ *
193
+ * @param a Polygon or MultiPolygon coordinates in degrees
194
+ * @param b Polygon or MultiPolygon coordinates in degrees
195
+ * @returns The normalized MultiPolygon coordinates of the common part. An empty array when
196
+ * the inputs do not overlap, when only their boundaries touch, and when either has no
197
+ * area
198
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
199
+ * retry on the 1e-9 degree grid
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * import type { PolygonCoordinates } from '@sakuzu/maplibre-gl-draw/geometry';
204
+ * import { intersection } from '@sakuzu/maplibre-gl-draw/geometry';
205
+ *
206
+ * const a: PolygonCoordinates = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
207
+ * const b: PolygonCoordinates = [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]];
208
+ * intersection(a, b); // [[[[0.5, 0], [1, 0], [1, 1], [0.5, 1], [0.5, 0]]]]
209
+ * ```
210
+ */
211
+ export function intersection(a, b) {
212
+ const left = sanitize(a);
213
+ const right = sanitize(b);
214
+ if (left.length === 0 || right.length === 0) {
215
+ return [];
216
+ }
217
+ return run('intersection', [left, right]);
218
+ }
219
+ /**
220
+ * Keeps only the part of a subject polygon that lies inside a clip region.
221
+ *
222
+ * Between polygons it is the same operation as {@link intersection}; it differs only in
223
+ * that the meaning of the arguments (the subject and the region) is fixed.
224
+ *
225
+ * @param subject The Polygon or MultiPolygon coordinates to clip, in degrees
226
+ * @param clipRegion The Polygon or MultiPolygon coordinates of the region, in degrees
227
+ * @returns The normalized MultiPolygon coordinates that remain inside the region. An empty
228
+ * array when nothing remains or either input has no area
229
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
230
+ * retry on the 1e-9 degree grid
231
+ */
232
+ export function clip(subject, clipRegion) {
233
+ return intersection(subject, clipRegion);
234
+ }
235
+ /**
236
+ * Returns the union of every polygon in an array.
237
+ *
238
+ * Passing many inputs to the engine at once can make it fail to close the output ring, so
239
+ * they are folded in the shape of a binary tree (cascaded union). The union is associative
240
+ * and the order of the folding is fixed, so the result is deterministic. Elements with no
241
+ * area are skipped.
242
+ *
243
+ * @param geometries Polygon or MultiPolygon coordinates in degrees
244
+ * @returns The normalized MultiPolygon coordinates of the union. An empty array for an
245
+ * empty array and when no element has an area
246
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
247
+ * retry on the 1e-9 degree grid
248
+ *
249
+ * @example
250
+ * ```ts
251
+ * import { unionAll } from '@sakuzu/maplibre-gl-draw/geometry';
252
+ *
253
+ * const merged = unionAll([
254
+ * [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]],
255
+ * [[[0.5, 0], [1.5, 0], [1.5, 1], [0.5, 1], [0.5, 0]]],
256
+ * [[[5, 5], [6, 5], [6, 6], [5, 5]]],
257
+ * ]);
258
+ * merged.length; // 2 (the overlapping squares fuse; the triangle stays apart)
259
+ * ```
260
+ */
261
+ export function unionAll(geometries) {
262
+ const parts = geometries.map(sanitize).filter((part) => part.length > 0);
263
+ if (parts.length === 0) {
264
+ return [];
265
+ }
266
+ if (parts.length === 1) {
267
+ return run('union', [parts[0]]);
268
+ }
269
+ let level = parts;
270
+ while (level.length > 1) {
271
+ const next = [];
272
+ for (let i = 0; i < level.length; i += 2) {
273
+ // The odd one out is carried up to the next level as it is
274
+ next.push(i + 1 < level.length ? run('union', [level[i], level[i + 1]]) : level[i]);
275
+ }
276
+ level = next;
277
+ }
278
+ return level[0];
279
+ }
280
+ /**
281
+ * Returns the part common to every polygon in an array.
282
+ *
283
+ * The intersection shrinks monotonically, so the elements are folded in order from the
284
+ * head and the fold stops as soon as it becomes empty.
285
+ *
286
+ * @param geometries Polygon or MultiPolygon coordinates in degrees
287
+ * @returns The normalized MultiPolygon coordinates common to all of them. An empty array for
288
+ * an empty array and when even one element has no area
289
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
290
+ * retry on the 1e-9 degree grid
291
+ */
292
+ export function intersectionAll(geometries) {
293
+ if (geometries.length === 0) {
294
+ return [];
295
+ }
296
+ const parts = geometries.map(sanitize);
297
+ if (parts.some((part) => part.length === 0)) {
298
+ return [];
299
+ }
300
+ let result = normalize(parts[0]);
301
+ for (let i = 1; i < parts.length; i++) {
302
+ if (result.length === 0) {
303
+ return [];
304
+ }
305
+ result = run('intersection', [result, parts[i]]);
306
+ }
307
+ return result;
308
+ }
309
+ /**
310
+ * Returns a subject polygon with every polygon in an array removed.
311
+ *
312
+ * @param subject The Polygon or MultiPolygon coordinates to subtract from, in degrees
313
+ * @param geometries The Polygon or MultiPolygon coordinates to subtract, in degrees.
314
+ * Elements with no area are skipped
315
+ * @returns The normalized MultiPolygon coordinates of the difference. An empty array when
316
+ * the subject has no area or is covered. The subject normalized when nothing is
317
+ * subtracted
318
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
319
+ * retry on the 1e-9 degree grid
320
+ */
321
+ export function differenceAll(subject, geometries) {
322
+ const left = sanitize(subject);
323
+ if (left.length === 0) {
324
+ return [];
325
+ }
326
+ const parts = geometries.map(sanitize).filter((part) => part.length > 0);
327
+ if (parts.length === 0) {
328
+ return normalize(left);
329
+ }
330
+ return run('difference', [left, ...parts]);
331
+ }
@@ -0,0 +1,72 @@
1
+ import type { GeometryInput, MultiPolygonCoordinates } from './types.js';
2
+ /** The default number of segments per circle of {@link buffer}: 64. */
3
+ export declare const DEFAULT_BUFFER_SEGMENTS = 64;
4
+ /**
5
+ * The options of {@link buffer}.
6
+ */
7
+ export interface BufferOptions {
8
+ /**
9
+ * The number of segments of the arc parts (64 by default). Rounded down and clamped to
10
+ * 3-1024; NaN gives the default
11
+ */
12
+ segments?: number;
13
+ }
14
+ /**
15
+ * Builds the area within a distance in meters of a geometry.
16
+ *
17
+ * The distances are laid out without a map projection, through {@link destinationPoint},
18
+ * the direct problem on the sphere. Every generated vertex lies at the buffer distance from
19
+ * its source vertex at any latitude, up to floating-point rounding; the edges between the
20
+ * generated vertices are straight in longitude and latitude. A point becomes a circle (the
21
+ * same as {@link generateCirclePolygon}); a line becomes the union of a circle at each
22
+ * vertex and a band along each edge, offset ±90 degrees from the great-circle bearing of
23
+ * the edge; a polygon becomes the union (positive distance) or the difference (negative
24
+ * distance) of the original polygon and the band along its rings.
25
+ *
26
+ * | Input | Positive | 0 | Negative |
27
+ * | --- | --- | --- | --- |
28
+ * | Point / MultiPoint | circle | `null` | `null` |
29
+ * | LineString / MultiLineString | band | `null` | `null` |
30
+ * | Polygon / MultiPolygon | expansion | normalized original | contraction |
31
+ *
32
+ * With a negative distance, parts narrower than `2 * |meters|` disappear, and an empty array
33
+ * is returned when the whole polygon disappears. `null` means the operation is not defined
34
+ * for the input: the table above, a distance that is not finite, a coordinate that is not
35
+ * finite, a vertex whose distance reaches a pole (`|lat|` plus the distance in degrees of
36
+ * latitude is 90 or more), and an edge that spans more than 180 degrees of longitude.
37
+ *
38
+ * @param geometry The geometry to buffer, coordinates in degrees
39
+ * @param meters The buffer distance in meters. A negative value shrinks a polygon
40
+ * @param options The number of segments per circle
41
+ * @returns The normalized MultiPolygon coordinates of the area. An empty array when a
42
+ * shrunk polygon vanishes. `null` when the operation is not defined for the input
43
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
44
+ * retry on the 1e-9 degree grid
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * import { buffer } from '@sakuzu/maplibre-gl-draw/geometry';
49
+ *
50
+ * // The area within 100 m of a line
51
+ * const corridor = buffer(
52
+ * { type: 'LineString', coordinates: [[139.76, 35.68], [139.77, 35.69]] },
53
+ * 100,
54
+ * { segments: 32 },
55
+ * );
56
+ *
57
+ * // Shrink a polygon by 50 m
58
+ * const shrunk = buffer(
59
+ * {
60
+ * type: 'Polygon',
61
+ * coordinates: [[[139.76, 35.68], [139.77, 35.68], [139.77, 35.69], [139.76, 35.68]]],
62
+ * },
63
+ * -50,
64
+ * );
65
+ * if (shrunk === null) {
66
+ * // Not defined for the input
67
+ * } else if (shrunk.length === 0) {
68
+ * // The whole area vanished
69
+ * }
70
+ * ```
71
+ */
72
+ export declare function buffer(geometry: GeometryInput, meters: number, options?: BufferOptions): MultiPolygonCoordinates | null;