@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,68 @@
1
+ import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates } from './types.js';
2
+ /**
3
+ * Returns the intersection point of two segments on the lng/lat plane.
4
+ *
5
+ * Returns null when they do not cross. Parallel segments and collinear segments are
6
+ * null as well. An interval that overlaps collinearly cannot be expressed by a single
7
+ * point, so it is not treated as an intersection (the endpoints of the overlap are not
8
+ * returned either). A touch between endpoints, and a T-shaped touch where an endpoint
9
+ * lies in the interior of the other, are returned as intersections. A segment of length
10
+ * 0 has no direction, so it is always null.
11
+ *
12
+ * The test is whether the parameter is between 0 and 1 inclusive, with both ends
13
+ * loosened by the rounding error.
14
+ *
15
+ * @param a1 The start of segment A, `[lng, lat]` in degrees
16
+ * @param a2 The end of segment A, `[lng, lat]` in degrees
17
+ * @param b1 The start of segment B, `[lng, lat]` in degrees
18
+ * @param b2 The end of segment B, `[lng, lat]` in degrees
19
+ * @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
20
+ * cross, are parallel or collinear, or either has length 0
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import { segmentIntersection } from '@sakuzu/maplibre-gl-draw/geometry';
25
+ *
26
+ * segmentIntersection([0, 0], [2, 2], [0, 2], [2, 0]); // [1, 1]
27
+ * segmentIntersection([0, 0], [1, 0], [0, 1], [1, 1]); // null (parallel)
28
+ * ```
29
+ */
30
+ export declare function segmentIntersection(a1: Coordinate, a2: Coordinate, b1: Coordinate, b2: Coordinate): Coordinate | null;
31
+ /**
32
+ * Cuts a polygon with a polyline and returns each resulting part.
33
+ *
34
+ * When the line does not pass through the polygon (it does not cross, it stops inside the
35
+ * polygon, it only touches an edge or a vertex, or it runs only inside a hole), the
36
+ * original polygon is returned as a single part without splitting. When the line crosses several times, the result is
37
+ * divided into one part per spatially connected mass. When only a portion of a
38
+ * MultiPolygon is cut, the parts that were not cut are returned as separate parts as
39
+ * well.
40
+ *
41
+ * Each part is MultiPolygon coordinates with the orientations and the degeneracies
42
+ * tidied up (a part with a hole comes with its inner ring). An empty array is returned
43
+ * for an input that has no area.
44
+ *
45
+ * A stretch where the line runs collinear with the outline is not treated as a crossing,
46
+ * and positions closer than 1e-9 degrees (about 0.1 mm) count as the same position.
47
+ *
48
+ * @param area The Polygon or MultiPolygon coordinates to cut, in degrees
49
+ * @param line The cutting polyline `[lng, lat][]` in degrees. Fewer than 2 positions cut
50
+ * nothing
51
+ * @returns The normalized MultiPolygon coordinates of each part. A single element (the
52
+ * input normalized) when it is not split. An empty array when the input has no area
53
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
54
+ * retry on the 1e-9 degree grid
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * import { splitArea } from '@sakuzu/maplibre-gl-draw/geometry';
59
+ *
60
+ * const square: [number, number][][] = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
61
+ * const parts = splitArea(square, [[0.5, -1], [0.5, 2]]);
62
+ * parts.length; // 2: the halves west and east of longitude 0.5
63
+ * if (parts.length === 1) {
64
+ * // Not split: the line does not cross the polygon
65
+ * }
66
+ * ```
67
+ */
68
+ export declare function splitArea(area: AreaCoordinates, line: Coordinate[]): MultiPolygonCoordinates[];
@@ -0,0 +1,430 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Splitting by a line
5
+ *
6
+ * Cuts a polygon with a polyline and divides it into several parts. The body is a
7
+ * planar arrangement.
8
+ *
9
+ * 1. Find every intersection of the outline of the polygon and the cutting line, and
10
+ * chop the segments at the intersections (noding)
11
+ * 2. Assemble the chopped segments as a planar graph and drop the dead ends (dangles)
12
+ * 3. Extract the minimal cycles (faces) of the graph
13
+ * 4. Take the intersection of each cycle and the original polygon, and make it a part
14
+ *
15
+ * Because the intersection with the original polygon is taken in step 4, the holes (the
16
+ * inner rings) are restored automatically. A cycle itself is a simple ring with no
17
+ * holes, and a cycle that lies inside a hole has an empty intersection and is dropped.
18
+ *
19
+ * The measure of dropping the dead ends is what realizes "a line that does not pass
20
+ * through does not split". A line that breaks off inside the polygon always has an end
21
+ * of degree 1, so it disappears without contributing to a cycle.
22
+ *
23
+ * The limitations are the same as those of the whole geometry module (crossing the ±180
24
+ * degree meridian and the vicinity of the poles are out of scope). In addition, when
25
+ * the cutting line has an interval that overlaps the outline of the polygon collinearly,
26
+ * that overlap is not treated as an intersection (because a collinear overlap cannot be
27
+ * expressed by a single point).
28
+ */
29
+ import { intersection, normalizeArea } from './boolean.js';
30
+ import { signedRingArea } from './simplify.js';
31
+ /**
32
+ * The error allowed in the parameter of a segment
33
+ *
34
+ * In a T-shaped touch where an endpoint lies on the other segment, the parameter can
35
+ * fall slightly outside 0 / 1 because of the rounding error. That much is allowed.
36
+ */
37
+ const PARAMETER_EPSILON = 1e-12;
38
+ /**
39
+ * The step of the quantization that identifies a node (degrees)
40
+ *
41
+ * 1e-9 degrees is roughly 0.1mm at the equator. An intersection uses the same value on
42
+ * the outline side and on the line side, so the two match exactly, but in a T-shaped
43
+ * touch that passes over a vertex the computed intersection differs from the original
44
+ * vertex by the least significant digit alone. A key rounded by this step makes them
45
+ * count as the same node.
46
+ */
47
+ const NODE_QUANTUM = 1e-9;
48
+ /**
49
+ * Returns the intersection point of two segments on the lng/lat plane.
50
+ *
51
+ * Returns null when they do not cross. Parallel segments and collinear segments are
52
+ * null as well. An interval that overlaps collinearly cannot be expressed by a single
53
+ * point, so it is not treated as an intersection (the endpoints of the overlap are not
54
+ * returned either). A touch between endpoints, and a T-shaped touch where an endpoint
55
+ * lies in the interior of the other, are returned as intersections. A segment of length
56
+ * 0 has no direction, so it is always null.
57
+ *
58
+ * The test is whether the parameter is between 0 and 1 inclusive, with both ends
59
+ * loosened by the rounding error.
60
+ *
61
+ * @param a1 The start of segment A, `[lng, lat]` in degrees
62
+ * @param a2 The end of segment A, `[lng, lat]` in degrees
63
+ * @param b1 The start of segment B, `[lng, lat]` in degrees
64
+ * @param b2 The end of segment B, `[lng, lat]` in degrees
65
+ * @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
66
+ * cross, are parallel or collinear, or either has length 0
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * import { segmentIntersection } from '@sakuzu/maplibre-gl-draw/geometry';
71
+ *
72
+ * segmentIntersection([0, 0], [2, 2], [0, 2], [2, 0]); // [1, 1]
73
+ * segmentIntersection([0, 0], [1, 0], [0, 1], [1, 1]); // null (parallel)
74
+ * ```
75
+ */
76
+ export function segmentIntersection(a1, a2, b1, b2) {
77
+ const ax = a2[0] - a1[0];
78
+ const ay = a2[1] - a1[1];
79
+ const bx = b2[0] - b1[0];
80
+ const by = b2[1] - b1[1];
81
+ // When the cross product is 0, the two segments are parallel (collinear included) or
82
+ // one of them is degenerate
83
+ const denominator = ax * by - ay * bx;
84
+ if (denominator === 0)
85
+ return null;
86
+ const dx = b1[0] - a1[0];
87
+ const dy = b1[1] - a1[1];
88
+ const t = (dx * by - dy * bx) / denominator;
89
+ const u = (dx * ay - dy * ax) / denominator;
90
+ if (t < -PARAMETER_EPSILON || t > 1 + PARAMETER_EPSILON)
91
+ return null;
92
+ if (u < -PARAMETER_EPSILON || u > 1 + PARAMETER_EPSILON)
93
+ return null;
94
+ // Pull what fell outside because of the error back onto the segment
95
+ const clamped = Math.min(1, Math.max(0, t));
96
+ return [a1[0] + clamped * ax, a1[1] + clamped * ay];
97
+ }
98
+ /**
99
+ * Cuts a polygon with a polyline and returns each resulting part.
100
+ *
101
+ * When the line does not pass through the polygon (it does not cross, it stops inside the
102
+ * polygon, it only touches an edge or a vertex, or it runs only inside a hole), the
103
+ * original polygon is returned as a single part without splitting. When the line crosses several times, the result is
104
+ * divided into one part per spatially connected mass. When only a portion of a
105
+ * MultiPolygon is cut, the parts that were not cut are returned as separate parts as
106
+ * well.
107
+ *
108
+ * Each part is MultiPolygon coordinates with the orientations and the degeneracies
109
+ * tidied up (a part with a hole comes with its inner ring). An empty array is returned
110
+ * for an input that has no area.
111
+ *
112
+ * A stretch where the line runs collinear with the outline is not treated as a crossing,
113
+ * and positions closer than 1e-9 degrees (about 0.1 mm) count as the same position.
114
+ *
115
+ * @param area The Polygon or MultiPolygon coordinates to cut, in degrees
116
+ * @param line The cutting polyline `[lng, lat][]` in degrees. Fewer than 2 positions cut
117
+ * nothing
118
+ * @returns The normalized MultiPolygon coordinates of each part. A single element (the
119
+ * input normalized) when it is not split. An empty array when the input has no area
120
+ * @throws {@link GeometryError} when the boolean operation engine fails even after the
121
+ * retry on the 1e-9 degree grid
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * import { splitArea } from '@sakuzu/maplibre-gl-draw/geometry';
126
+ *
127
+ * const square: [number, number][][] = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
128
+ * const parts = splitArea(square, [[0.5, -1], [0.5, 2]]);
129
+ * parts.length; // 2: the halves west and east of longitude 0.5
130
+ * if (parts.length === 1) {
131
+ * // Not split: the line does not cross the polygon
132
+ * }
133
+ * ```
134
+ */
135
+ export function splitArea(area, line) {
136
+ const normalized = normalizeArea(area);
137
+ if (normalized.length === 0)
138
+ return [];
139
+ if (line.length < 2)
140
+ return [normalized];
141
+ const arrangement = buildArrangement(normalized, line);
142
+ if (arrangement === null)
143
+ return [normalized];
144
+ const parts = [];
145
+ for (const face of extractFaces(arrangement)) {
146
+ // A cycle is a simple ring with no holes. The intersection with the original
147
+ // polygon drops the holes and the outside
148
+ const part = intersection([face], normalized);
149
+ if (part.length > 0)
150
+ parts.push(part);
151
+ }
152
+ // If only one mass comes out, the line has not divided the polygon
153
+ return parts.length > 1 ? parts : [normalized];
154
+ }
155
+ /** The key that identifies a node */
156
+ function nodeKey(coordinate) {
157
+ return `${Math.round(coordinate[0] / NODE_QUANTUM)},${Math.round(coordinate[1] / NODE_QUANTUM)}`;
158
+ }
159
+ /** Pushes only the segments whose length is not 0 */
160
+ function pushSegment(segments, a, b) {
161
+ if (a[0] === b[0] && a[1] === b[1])
162
+ return;
163
+ segments.push({ a, b });
164
+ }
165
+ /**
166
+ * Expands every ring of the polygon into segments
167
+ *
168
+ * A ring that is not closed is treated as closed as well.
169
+ */
170
+ function ringSegments(area) {
171
+ const segments = [];
172
+ for (const polygon of area) {
173
+ for (const ring of polygon) {
174
+ if (ring.length < 3)
175
+ continue;
176
+ for (let i = 0; i + 1 < ring.length; i++) {
177
+ pushSegment(segments, ring[i], ring[i + 1]);
178
+ }
179
+ pushSegment(segments, ring[ring.length - 1], ring[0]);
180
+ }
181
+ }
182
+ return segments;
183
+ }
184
+ /** Expands a polyline into segments */
185
+ function lineSegments(line) {
186
+ const segments = [];
187
+ for (let i = 0; i + 1 < line.length; i++) {
188
+ pushSegment(segments, line[i], line[i + 1]);
189
+ }
190
+ return segments;
191
+ }
192
+ /**
193
+ * Divides a segment at the points that chop it, making a coordinate sequence from end
194
+ * to end
195
+ *
196
+ * The points are ordered by the distance from the start point, and both ends as well as
197
+ * duplicates at the same position are dropped.
198
+ */
199
+ function chainOf(segment, cuts) {
200
+ if (cuts.length === 0)
201
+ return [segment.a, segment.b];
202
+ const startKey = nodeKey(segment.a);
203
+ const endKey = nodeKey(segment.b);
204
+ const seen = new Set([startKey, endKey]);
205
+ const inner = [];
206
+ for (const cut of cuts) {
207
+ const key = nodeKey(cut);
208
+ if (seen.has(key))
209
+ continue;
210
+ seen.add(key);
211
+ const dx = cut[0] - segment.a[0];
212
+ const dy = cut[1] - segment.a[1];
213
+ inner.push({ coordinate: cut, distance: dx * dx + dy * dy });
214
+ }
215
+ inner.sort((left, right) => left.distance - right.distance);
216
+ return [segment.a, ...inner.map((entry) => entry.coordinate), segment.b];
217
+ }
218
+ /**
219
+ * Assembles the noded planar graph and drops the dangles
220
+ *
221
+ * The outlines of the polygon do not cross one another (normalizeArea guarantees this),
222
+ * so only "line x outline" and "line x line" are examined for intersections.
223
+ *
224
+ * @returns The graph when an edge of the cutting line remains. null when none remains
225
+ * (no passing through)
226
+ */
227
+ function buildArrangement(area, line) {
228
+ const ringSegs = ringSegments(area);
229
+ const lineSegs = lineSegments(line);
230
+ if (ringSegs.length === 0 || lineSegs.length === 0)
231
+ return null;
232
+ const ringCuts = ringSegs.map(() => []);
233
+ const lineCuts = lineSegs.map(() => []);
234
+ for (let i = 0; i < lineSegs.length; i++) {
235
+ for (let j = 0; j < ringSegs.length; j++) {
236
+ const point = segmentIntersection(lineSegs[i].a, lineSegs[i].b, ringSegs[j].a, ringSegs[j].b);
237
+ if (point === null)
238
+ continue;
239
+ lineCuts[i].push(point);
240
+ ringCuts[j].push(point);
241
+ }
242
+ // A self-intersection of the line can also form a cycle, so make it a node
243
+ for (let k = i + 1; k < lineSegs.length; k++) {
244
+ const point = segmentIntersection(lineSegs[i].a, lineSegs[i].b, lineSegs[k].a, lineSegs[k].b);
245
+ if (point === null)
246
+ continue;
247
+ lineCuts[i].push(point);
248
+ lineCuts[k].push(point);
249
+ }
250
+ }
251
+ const nodes = [];
252
+ const nodeIds = new Map();
253
+ const edges = [];
254
+ const edgeIds = new Map();
255
+ const adjacency = [];
256
+ const idOf = (coordinate) => {
257
+ const key = nodeKey(coordinate);
258
+ const existing = nodeIds.get(key);
259
+ if (existing !== undefined)
260
+ return existing;
261
+ const id = nodes.length;
262
+ nodes.push(coordinate);
263
+ nodeIds.set(key, id);
264
+ adjacency.push([]);
265
+ return id;
266
+ };
267
+ const addEdge = (a, b, fromLine) => {
268
+ var _a, _b;
269
+ // An edge whose ends fell onto the same node by the quantization has no length
270
+ if (a === b)
271
+ return;
272
+ const key = a < b ? `${a}-${b}` : `${b}-${a}`;
273
+ const existing = edgeIds.get(key);
274
+ if (existing !== undefined) {
275
+ // A line that overlaps the outline is not a "cutting edge"
276
+ (_a = edges[existing]).fromLine || (_a.fromLine = fromLine);
277
+ (_b = edges[existing]).fromRing || (_b.fromRing = !fromLine);
278
+ return;
279
+ }
280
+ const id = edges.length;
281
+ edges.push({ a, b, fromLine, fromRing: !fromLine, removed: false });
282
+ edgeIds.set(key, id);
283
+ adjacency[a].push(id);
284
+ adjacency[b].push(id);
285
+ };
286
+ const addChain = (segments, cuts, fromLine) => {
287
+ for (let i = 0; i < segments.length; i++) {
288
+ const chain = chainOf(segments[i], cuts[i]);
289
+ let previous = idOf(chain[0]);
290
+ for (let j = 1; j < chain.length; j++) {
291
+ const current = idOf(chain[j]);
292
+ addEdge(previous, current, fromLine);
293
+ previous = current;
294
+ }
295
+ }
296
+ };
297
+ // Insert the outlines first so that the representative coordinate of a node is
298
+ // aligned with the original vertex
299
+ addChain(ringSegs, ringCuts, false);
300
+ addChain(lineSegs, lineCuts, true);
301
+ const arrangement = { nodes, edges, adjacency };
302
+ removeDangles(arrangement);
303
+ const hasCut = edges.some((edge) => !edge.removed && edge.fromLine && !edge.fromRing);
304
+ return hasCut ? arrangement : null;
305
+ }
306
+ /**
307
+ * Drops the dead-end edges
308
+ *
309
+ * Erasing the nodes of degree 1 and their edges is repeated until nothing more is
310
+ * erased. A line that sticks out beyond the polygon and a line that breaks off inside
311
+ * the polygon stop contributing to a cycle this way.
312
+ */
313
+ function removeDangles(arrangement) {
314
+ const { edges, adjacency } = arrangement;
315
+ const degree = adjacency.map((edgeIds) => edgeIds.length);
316
+ const queue = [];
317
+ for (let node = 0; node < degree.length; node++) {
318
+ if (degree[node] <= 1)
319
+ queue.push(node);
320
+ }
321
+ while (queue.length > 0) {
322
+ const node = queue.pop();
323
+ if (degree[node] > 1)
324
+ continue;
325
+ for (const edgeId of adjacency[node]) {
326
+ const edge = edges[edgeId];
327
+ if (edge.removed)
328
+ continue;
329
+ edge.removed = true;
330
+ degree[node]--;
331
+ const other = edge.a === node ? edge.b : edge.a;
332
+ degree[other]--;
333
+ if (degree[other] <= 1)
334
+ queue.push(other);
335
+ }
336
+ }
337
+ }
338
+ /** The key of a directed edge (the edge ID and the direction) */
339
+ function directedKey(edgeId, forward) {
340
+ return forward ? `${edgeId}+` : `${edgeId}-`;
341
+ }
342
+ /**
343
+ * Extracts the minimal cycles (faces)
344
+ *
345
+ * Traversing every directed edge once each yields, per connected component, the "inner
346
+ * faces (counter-clockwise)" and the "outer boundary (clockwise)". Only the cycles
347
+ * whose area is positive are returned.
348
+ */
349
+ function extractFaces(arrangement) {
350
+ const { edges } = arrangement;
351
+ const visited = new Set();
352
+ const faces = [];
353
+ for (let edgeId = 0; edgeId < edges.length; edgeId++) {
354
+ if (edges[edgeId].removed)
355
+ continue;
356
+ for (const forward of [true, false]) {
357
+ if (visited.has(directedKey(edgeId, forward)))
358
+ continue;
359
+ const ring = traceFace(arrangement, edgeId, forward, visited);
360
+ if (ring !== null && signedRingArea(ring) > 0)
361
+ faces.push(ring);
362
+ }
363
+ }
364
+ return faces;
365
+ }
366
+ /**
367
+ * Traces one minimal cycle from a directed edge
368
+ *
369
+ * At each node, it proceeds to "the edge nearest in the clockwise direction from the
370
+ * direction it came in". Under this rule the inner faces close counter-clockwise.
371
+ */
372
+ function traceFace(arrangement, startEdge, startForward, visited) {
373
+ const { nodes, edges } = arrangement;
374
+ const ring = [];
375
+ let edgeId = startEdge;
376
+ let forward = startForward;
377
+ // A directed edge is used only once each, so it closes within this count for certain
378
+ for (let step = 0; step <= edges.length * 2; step++) {
379
+ const key = directedKey(edgeId, forward);
380
+ if (visited.has(key))
381
+ break;
382
+ visited.add(key);
383
+ const edge = edges[edgeId];
384
+ const from = forward ? edge.a : edge.b;
385
+ const to = forward ? edge.b : edge.a;
386
+ ring.push(nodes[from]);
387
+ const next = nextDirectedEdge(arrangement, to, from);
388
+ if (next === null)
389
+ return null;
390
+ edgeId = next.edgeId;
391
+ forward = next.forward;
392
+ }
393
+ if (ring.length < 3)
394
+ return null;
395
+ ring.push(ring[0]);
396
+ return ring;
397
+ }
398
+ /**
399
+ * Chooses the next directed edge
400
+ *
401
+ * Taking the reverse of the edge it came in on (the direction looking from at toward
402
+ * previous) as the base, it chooses the edge nearest in the clockwise direction. After
403
+ * the dangle removal the degree is 2 or more, so a candidate other than going back
404
+ * always exists.
405
+ */
406
+ function nextDirectedEdge(arrangement, at, previous) {
407
+ const { nodes, edges, adjacency } = arrangement;
408
+ const base = Math.atan2(nodes[previous][1] - nodes[at][1], nodes[previous][0] - nodes[at][0]);
409
+ let bestEdge = -1;
410
+ let bestForward = true;
411
+ let bestDifference = Number.POSITIVE_INFINITY;
412
+ for (const edgeId of adjacency[at]) {
413
+ const edge = edges[edgeId];
414
+ if (edge.removed)
415
+ continue;
416
+ const other = edge.a === at ? edge.b : edge.a;
417
+ const angle = Math.atan2(nodes[other][1] - nodes[at][1], nodes[other][0] - nodes[at][0]);
418
+ // The clockwise angle difference from the base (0 means going back, so make it the
419
+ // last candidate)
420
+ let difference = base - angle;
421
+ while (difference <= 0)
422
+ difference += Math.PI * 2;
423
+ if (difference < bestDifference) {
424
+ bestDifference = difference;
425
+ bestEdge = edgeId;
426
+ bestForward = edge.a === at;
427
+ }
428
+ }
429
+ return bestEdge < 0 ? null : { edgeId: bestEdge, forward: bestForward };
430
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Type definitions of the geometry module
3
+ *
4
+ * GeoJSON-compatible array representations. They match the shape of the coordinates of
5
+ * a core Feature structurally, so they can be passed through as they are with no
6
+ * conversion. The geometry module does not depend on external type definitions; the
7
+ * coordinate types are self-contained in this file alone.
8
+ */
9
+ /**
10
+ * A position as `[longitude, latitude]` in degrees (WGS84, the GeoJSON order).
11
+ *
12
+ * Longitude comes first. No altitude is carried; the functions of this module read only the
13
+ * first two elements.
14
+ */
15
+ export type Coordinate = [number, number];
16
+ /**
17
+ * The outline of a polygon: a closed coordinate sequence whose first and last positions are
18
+ * equal.
19
+ *
20
+ * The functions of this module accept a ring in either orientation. A ring with fewer than
21
+ * 3 positions, or with a position that is not finite, cannot bound an area and is dropped
22
+ * by every function that takes polygons.
23
+ */
24
+ export type Ring = Coordinate[];
25
+ /**
26
+ * The coordinates of a Polygon: index 0 is the outer ring and the rest are holes (inner
27
+ * rings).
28
+ */
29
+ export type PolygonCoordinates = Ring[];
30
+ /** The coordinates of a MultiPolygon: an array of Polygon coordinates, one per part. */
31
+ export type MultiPolygonCoordinates = PolygonCoordinates[];
32
+ /**
33
+ * Either Polygon coordinates or MultiPolygon coordinates.
34
+ *
35
+ * The functions that take polygons accept both shapes (Ring[] and Ring[][]) and tell them
36
+ * apart with {@link isMultiPolygonCoordinates}, so the caller does not need to normalize
37
+ * them. The functions that return polygons always return MultiPolygon coordinates.
38
+ */
39
+ export type AreaCoordinates = PolygonCoordinates | MultiPolygonCoordinates;
40
+ /**
41
+ * A bounding box as `[minLng, minLat, maxLng, maxLat]` in degrees.
42
+ *
43
+ * A box never crosses the ±180 degree meridian: `minLng <= maxLng` always holds.
44
+ */
45
+ export type BBox = [number, number, number, number];
46
+ /** A GeoJSON Point geometry without `bbox`. */
47
+ export interface PointGeometry {
48
+ /** The geometry type */
49
+ type: 'Point';
50
+ /** The position `[lng, lat]` */
51
+ coordinates: Coordinate;
52
+ }
53
+ /** A GeoJSON MultiPoint geometry without `bbox`. */
54
+ export interface MultiPointGeometry {
55
+ /** The geometry type */
56
+ type: 'MultiPoint';
57
+ /** The positions `[lng, lat]` */
58
+ coordinates: Coordinate[];
59
+ }
60
+ /** A GeoJSON LineString geometry without `bbox`. */
61
+ export interface LineStringGeometry {
62
+ /** The geometry type */
63
+ type: 'LineString';
64
+ /** The vertices `[lng, lat]` in drawing order */
65
+ coordinates: Coordinate[];
66
+ }
67
+ /** A GeoJSON MultiLineString geometry without `bbox`. */
68
+ export interface MultiLineStringGeometry {
69
+ /** The geometry type */
70
+ type: 'MultiLineString';
71
+ /** The lines, each a vertex sequence `[lng, lat][]` */
72
+ coordinates: Coordinate[][];
73
+ }
74
+ /** A GeoJSON Polygon geometry without `bbox`. */
75
+ export interface PolygonGeometry {
76
+ /** The geometry type */
77
+ type: 'Polygon';
78
+ /** The outer ring followed by the holes */
79
+ coordinates: PolygonCoordinates;
80
+ }
81
+ /** A GeoJSON MultiPolygon geometry without `bbox`. */
82
+ export interface MultiPolygonGeometry {
83
+ /** The geometry type */
84
+ type: 'MultiPolygon';
85
+ /** The parts, each an outer ring followed by its holes */
86
+ coordinates: MultiPolygonCoordinates;
87
+ }
88
+ /**
89
+ * A whole geometry, as taken by {@link buffer}.
90
+ *
91
+ * The GeoJSON Geometry types without `bbox` and without GeometryCollection. The
92
+ * coordinates of a Point, LineString or Polygon feature have the same shape, so they can
93
+ * be passed with no conversion.
94
+ */
95
+ export type GeometryInput = PointGeometry | MultiPointGeometry | LineStringGeometry | MultiLineStringGeometry | PolygonGeometry | MultiPolygonGeometry;
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Unit conversion and geodetic constants
3
+ *
4
+ * The spherical-approximation constants and the angle conversions shared across the
5
+ * whole geometry module.
6
+ */
7
+ /**
8
+ * The radius of the sphere every geodesic function of this module uses, in meters.
9
+ *
10
+ * The value is the mean Earth radius, 6,371,000 m. Distances, bearings, areas, circles and
11
+ * buffers all assume this sphere rather than an ellipsoid, so a result differs from an
12
+ * ellipsoidal computation by up to about 0.5%.
13
+ */
14
+ export declare const EARTH_RADIUS_METERS = 6371000;
15
+ /**
16
+ * Converts an angle in degrees to radians.
17
+ *
18
+ * @param degrees The angle in degrees
19
+ * @returns The angle in radians. NaN and infinities pass through unchanged
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { toRadians } from '@sakuzu/maplibre-gl-draw/geometry';
24
+ *
25
+ * toRadians(180); // Math.PI
26
+ * ```
27
+ */
28
+ export declare function toRadians(degrees: number): number;
29
+ /**
30
+ * Converts an angle in radians to degrees.
31
+ *
32
+ * @param radians The angle in radians
33
+ * @returns The angle in degrees. NaN and infinities pass through unchanged
34
+ */
35
+ export declare function toDegrees(radians: number): number;
@@ -0,0 +1,41 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Unit conversion and geodetic constants
5
+ *
6
+ * The spherical-approximation constants and the angle conversions shared across the
7
+ * whole geometry module.
8
+ */
9
+ /**
10
+ * The radius of the sphere every geodesic function of this module uses, in meters.
11
+ *
12
+ * The value is the mean Earth radius, 6,371,000 m. Distances, bearings, areas, circles and
13
+ * buffers all assume this sphere rather than an ellipsoid, so a result differs from an
14
+ * ellipsoidal computation by up to about 0.5%.
15
+ */
16
+ export const EARTH_RADIUS_METERS = 6371000;
17
+ /**
18
+ * Converts an angle in degrees to radians.
19
+ *
20
+ * @param degrees The angle in degrees
21
+ * @returns The angle in radians. NaN and infinities pass through unchanged
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { toRadians } from '@sakuzu/maplibre-gl-draw/geometry';
26
+ *
27
+ * toRadians(180); // Math.PI
28
+ * ```
29
+ */
30
+ export function toRadians(degrees) {
31
+ return (degrees * Math.PI) / 180;
32
+ }
33
+ /**
34
+ * Converts an angle in radians to degrees.
35
+ *
36
+ * @param radians The angle in radians
37
+ * @returns The angle in degrees. NaN and infinities pass through unchanged
38
+ */
39
+ export function toDegrees(radians) {
40
+ return (radians * 180) / Math.PI;
41
+ }