@sakuzu/maplibre-gl-draw 1.0.0 → 2.1.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 (541) hide show
  1. package/CHANGELOG.md +1109 -2
  2. package/README.ja.md +83 -50
  3. package/README.md +89 -53
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/dist/api/datasets.d.ts +263 -0
  6. package/dist/api/document.d.ts +66 -0
  7. package/dist/api/draw.d.ts +137 -0
  8. package/dist/api/draw.js +20 -0
  9. package/dist/api/drawing.d.ts +87 -0
  10. package/dist/api/errors.d.ts +35 -0
  11. package/dist/api/errors.js +35 -0
  12. package/dist/api/events.d.ts +316 -0
  13. package/dist/api/extension/context.d.ts +247 -0
  14. package/dist/api/extension/feature-type.d.ts +129 -0
  15. package/dist/api/extension/mode.d.ts +123 -0
  16. package/dist/api/extension/plugin.d.ts +51 -0
  17. package/dist/api/extension/plugin.js +3 -0
  18. package/dist/api/extension/provider.d.ts +119 -0
  19. package/dist/api/extension/provider.js +3 -0
  20. package/dist/api/extension/render.d.ts +176 -0
  21. package/dist/api/extension/render.js +3 -0
  22. package/dist/api/extension/store.d.ts +190 -0
  23. package/dist/api/extension/store.js +3 -0
  24. package/dist/api/extensions.d.ts +306 -0
  25. package/dist/api/extensions.js +3 -0
  26. package/dist/api/features.d.ts +188 -0
  27. package/dist/api/features.js +3 -0
  28. package/dist/api/groups.d.ts +111 -0
  29. package/dist/api/groups.js +3 -0
  30. package/dist/api/hidden.d.ts +45 -0
  31. package/dist/api/hidden.js +3 -0
  32. package/dist/api/impl/adapters.js +463 -0
  33. package/dist/api/impl/contexts.js +466 -0
  34. package/dist/api/impl/create-draw.js +124 -0
  35. package/dist/api/impl/datasets.js +405 -0
  36. package/dist/api/impl/destroy-guard.js +74 -0
  37. package/dist/api/impl/document.js +280 -0
  38. package/dist/api/impl/drawing.js +180 -0
  39. package/dist/api/impl/engine-context.d.ts +7 -0
  40. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  41. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  42. package/dist/api/impl/events.js +423 -0
  43. package/dist/api/impl/extension-host.js +364 -0
  44. package/dist/api/impl/extensions.js +229 -0
  45. package/dist/api/impl/features.js +445 -0
  46. package/dist/api/impl/geometry/apply.d.ts +32 -0
  47. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  48. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  49. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  50. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  51. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  52. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  53. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  54. package/dist/api/impl/geometry/types.js +3 -0
  55. package/dist/api/impl/groups.d.ts +3 -0
  56. package/dist/api/impl/groups.js +268 -0
  57. package/dist/api/impl/hidden.js +60 -0
  58. package/dist/api/impl/import-export/constants.d.ts +22 -0
  59. package/dist/api/impl/import-export/constants.js +24 -0
  60. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  61. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  62. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  63. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  64. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  66. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  68. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  69. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  70. package/dist/api/impl/import-export/image-import.js +73 -0
  71. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  72. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  73. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  74. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  75. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  76. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  77. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  78. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  79. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  80. package/dist/api/impl/import-export/style-validation.js +86 -0
  81. package/dist/api/impl/import-export/types.d.ts +52 -0
  82. package/dist/api/impl/import-export/types.js +3 -0
  83. package/dist/api/impl/input.js +180 -0
  84. package/dist/api/impl/layers.js +307 -0
  85. package/dist/api/impl/metadata.d.ts +1 -0
  86. package/dist/api/impl/metadata.js +22 -0
  87. package/dist/api/impl/options.d.ts +1 -0
  88. package/dist/api/impl/options.js +851 -0
  89. package/dist/api/impl/placement.d.ts +1 -0
  90. package/dist/api/impl/placement.js +138 -0
  91. package/dist/api/impl/render-context.d.ts +13 -0
  92. package/dist/api/impl/render-context.js +272 -0
  93. package/dist/api/impl/rows.d.ts +1 -0
  94. package/dist/api/impl/rows.js +46 -0
  95. package/dist/api/impl/selection.d.ts +1 -0
  96. package/dist/api/impl/selection.js +186 -0
  97. package/dist/api/impl/shared.d.ts +64 -0
  98. package/dist/api/impl/shared.js +178 -0
  99. package/dist/api/impl/validate-extension.d.ts +1 -0
  100. package/dist/api/impl/validate-extension.js +159 -0
  101. package/dist/api/layers.d.ts +130 -0
  102. package/dist/api/layers.js +3 -0
  103. package/dist/api/metadata.d.ts +18 -0
  104. package/dist/api/metadata.js +3 -0
  105. package/dist/api/model.d.ts +487 -0
  106. package/dist/api/model.js +47 -0
  107. package/dist/api/options.d.ts +466 -0
  108. package/dist/api/options.js +3 -0
  109. package/dist/api/selection.d.ts +94 -0
  110. package/dist/api/selection.js +3 -0
  111. package/dist/api/state.d.ts +155 -0
  112. package/dist/api/state.js +12 -0
  113. package/dist/{display → dataset}/chunk.d.ts +1 -1
  114. package/dist/{display → dataset}/chunk.js +4 -3
  115. package/dist/{display → dataset}/dataset.js +21 -21
  116. package/dist/dataset/interaction.d.ts +1 -0
  117. package/dist/{display → dataset}/interaction.js +18 -6
  118. package/dist/dataset/manager.d.ts +1 -0
  119. package/dist/dataset/provider.d.ts +1 -0
  120. package/dist/{display → dataset}/retained.d.ts +1 -1
  121. package/dist/{display → dataset}/retained.js +8 -7
  122. package/dist/dataset/source.d.ts +1 -0
  123. package/dist/{display → dataset}/source.js +17 -4
  124. package/dist/dataset/spatial.d.ts +1 -0
  125. package/dist/{display → dataset}/spatial.js +1 -1
  126. package/dist/dataset/style.d.ts +1 -0
  127. package/dist/{display → dataset}/style.js +1 -1
  128. package/dist/dataset/table-source.d.ts +1 -0
  129. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  130. package/dist/{display → dataset}/thinning.d.ts +0 -10
  131. package/dist/{display → dataset}/thinning.js +3 -2
  132. package/dist/dataset/triangulation.d.ts +1 -0
  133. package/dist/{display → dataset}/triangulation.js +0 -0
  134. package/dist/{display → dataset}/types.d.ts +84 -121
  135. package/dist/dataset/types.js +61 -0
  136. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  137. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  138. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  139. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  140. package/dist/dispatcher/hit-test/service.js +80 -16
  141. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  142. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  143. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  144. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  145. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  146. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  147. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  148. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  149. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  150. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  151. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  152. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  153. package/dist/dispatcher/input-router.js +154 -70
  154. package/dist/dispatcher/normalizer.js +25 -4
  155. package/dist/dispatcher/types.d.ts +6 -1
  156. package/dist/extension/feature-handler.d.ts +1 -182
  157. package/dist/extension/index.d.ts +4 -7
  158. package/dist/extension/renderers.d.ts +1 -208
  159. package/dist/geometry/angle.d.ts +0 -8
  160. package/dist/geometry/angle.js +0 -8
  161. package/dist/geometry/bbox.d.ts +4 -12
  162. package/dist/geometry/bbox.js +4 -12
  163. package/dist/geometry/boolean.d.ts +0 -51
  164. package/dist/geometry/boolean.js +0 -51
  165. package/dist/geometry/buffer.d.ts +0 -26
  166. package/dist/geometry/buffer.js +0 -26
  167. package/dist/geometry/circle.d.ts +0 -9
  168. package/dist/geometry/circle.js +0 -9
  169. package/dist/geometry/coords.d.ts +0 -16
  170. package/dist/geometry/coords.js +0 -16
  171. package/dist/geometry/distance.d.ts +0 -24
  172. package/dist/geometry/distance.js +0 -24
  173. package/dist/geometry/errors.d.ts +21 -36
  174. package/dist/geometry/errors.js +49 -29
  175. package/dist/geometry/geojson.d.ts +85 -0
  176. package/dist/geometry/geojson.js +173 -0
  177. package/dist/geometry/index.d.ts +38 -23
  178. package/dist/geometry/index.js +43 -31
  179. package/dist/geometry/measure.d.ts +0 -27
  180. package/dist/geometry/measure.js +0 -27
  181. package/dist/geometry/predicates.d.ts +0 -9
  182. package/dist/geometry/predicates.js +0 -9
  183. package/dist/geometry/public-bounds.d.ts +26 -0
  184. package/dist/geometry/public-bounds.js +30 -0
  185. package/dist/geometry/public-combine.d.ts +78 -0
  186. package/dist/geometry/public-combine.js +82 -0
  187. package/dist/geometry/public-create.d.ts +54 -0
  188. package/dist/geometry/public-create.js +70 -0
  189. package/dist/geometry/public-measure.d.ts +170 -0
  190. package/dist/geometry/public-measure.js +283 -0
  191. package/dist/geometry/public-predicates.d.ts +54 -0
  192. package/dist/geometry/public-predicates.js +144 -0
  193. package/dist/geometry/public-repair.d.ts +75 -0
  194. package/dist/geometry/public-repair.js +77 -0
  195. package/dist/geometry/simplify.d.ts +0 -7
  196. package/dist/geometry/simplify.js +0 -7
  197. package/dist/geometry/split.d.ts +0 -20
  198. package/dist/geometry/split.js +0 -20
  199. package/dist/geometry/units.d.ts +20 -12
  200. package/dist/geometry/units.js +20 -12
  201. package/dist/index.d.ts +66 -66
  202. package/dist/index.js +6 -18
  203. package/dist/messages.d.ts +7 -7
  204. package/dist/modes/draw/circle.js +83 -207
  205. package/dist/modes/draw/commit-layer.d.ts +5 -16
  206. package/dist/modes/draw/commit-layer.js +2 -13
  207. package/dist/modes/draw/freehand.js +108 -246
  208. package/dist/modes/draw/image.js +4 -2
  209. package/dist/modes/draw/index.d.ts +5 -5
  210. package/dist/modes/draw/index.js +5 -5
  211. package/dist/modes/draw/line.js +18 -354
  212. package/dist/modes/draw/point.js +29 -78
  213. package/dist/modes/draw/polygon.js +23 -368
  214. package/dist/modes/draw/trace-support.d.ts +43 -36
  215. package/dist/modes/draw/trace-support.js +95 -98
  216. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  217. package/dist/modes/draw/vertex-drawing.js +176 -0
  218. package/dist/modes/handler.d.ts +1 -285
  219. package/dist/modes/manager.d.ts +2 -2
  220. package/dist/modes/manager.js +3 -0
  221. package/dist/modes/select/box-selection.d.ts +3 -3
  222. package/dist/modes/select/box-selection.js +2 -1
  223. package/dist/modes/select/click-handler.d.ts +5 -5
  224. package/dist/modes/select/click-handler.js +22 -20
  225. package/dist/modes/select/cursor-handler.d.ts +2 -2
  226. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  227. package/dist/modes/select/drag/move.js +3 -3
  228. package/dist/modes/select/drag/operation.d.ts +3 -3
  229. package/dist/modes/select/drag/radius.js +5 -4
  230. package/dist/modes/select/drag/transform.d.ts +2 -2
  231. package/dist/modes/select/drag/transform.js +11 -5
  232. package/dist/modes/select/drag/vertex.d.ts +2 -2
  233. package/dist/modes/select/drag/vertex.js +13 -8
  234. package/dist/modes/select/drag-handler.js +44 -25
  235. package/dist/modes/select/mode.js +17 -17
  236. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  237. package/dist/modes/select/shortcut-handler.js +9 -7
  238. package/dist/operations/layer-operations.js +29 -168
  239. package/dist/operations/resize.d.ts +2 -2
  240. package/dist/operations/resize.js +5 -5
  241. package/dist/operations/rotate.js +5 -5
  242. package/dist/operations/selection-operations.d.ts +16 -1
  243. package/dist/operations/selection-operations.js +28 -13
  244. package/dist/operations/shared-vertex.js +4 -2
  245. package/dist/operations/trace-graph.d.ts +0 -18
  246. package/dist/operations/trace-graph.js +0 -18
  247. package/dist/operations/vertex.js +36 -35
  248. package/dist/shared/color.d.ts +1 -0
  249. package/dist/shared/color.js +245 -0
  250. package/dist/shared/config/constants.d.ts +1 -54
  251. package/dist/shared/config/constants.js +1 -58
  252. package/dist/shared/config/feature-style.d.ts +16 -13
  253. package/dist/shared/config/feature-style.js +9 -0
  254. package/dist/shared/config/rendering.d.ts +3 -3
  255. package/dist/shared/config/selection-highlight.d.ts +0 -15
  256. package/dist/shared/config/selection-highlight.js +4 -7
  257. package/dist/shared/config/selection.d.ts +2 -32
  258. package/dist/shared/config/selection.js +0 -18
  259. package/dist/shared/config/topology.d.ts +2 -2
  260. package/dist/shared/config/trace.d.ts +4 -4
  261. package/dist/shared/math/angle.d.ts +1 -1
  262. package/dist/shared/math/angle.js +1 -1
  263. package/dist/shared/math/circle.d.ts +1 -1
  264. package/dist/shared/math/circle.js +1 -1
  265. package/dist/shared/math/distance.d.ts +2 -1
  266. package/dist/shared/math/distance.js +3 -2
  267. package/dist/shared/math/index.d.ts +1 -1
  268. package/dist/shared/math/index.js +1 -1
  269. package/dist/shared/math/transform.d.ts +23 -0
  270. package/dist/shared/math/transform.js +47 -28
  271. package/dist/shared/properties.d.ts +18 -0
  272. package/dist/shared/properties.js +129 -0
  273. package/dist/shared/types/events.d.ts +15 -7
  274. package/dist/shared/types/model.d.ts +109 -159
  275. package/dist/shared/types/style.d.ts +1 -1
  276. package/dist/shared/utils/color.d.ts +2 -36
  277. package/dist/shared/utils/color.js +13 -70
  278. package/dist/shared/utils/coordinates.d.ts +30 -4
  279. package/dist/shared/utils/coordinates.js +56 -10
  280. package/dist/shared/utils/event-emitter.d.ts +1 -262
  281. package/dist/shared/utils/event-emitter.js +4 -3
  282. package/dist/shared/utils/feature-bbox.js +8 -7
  283. package/dist/shared/utils/feature-segments.js +5 -4
  284. package/dist/shared/utils/image.d.ts +0 -4
  285. package/dist/shared/utils/image.js +0 -6
  286. package/dist/shared/utils/name-generator.d.ts +14 -20
  287. package/dist/shared/utils/name-generator.js +20 -3
  288. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  289. package/dist/shared/utils/pixel-ratio.js +13 -4
  290. package/dist/shared/utils/property.d.ts +7 -50
  291. package/dist/shared/utils/property.js +22 -87
  292. package/dist/snapping/custom-targets.js +21 -4
  293. package/dist/snapping/indicator.js +20 -11
  294. package/dist/snapping/providers/display.d.ts +6 -1
  295. package/dist/snapping/providers/display.js +2 -1
  296. package/dist/snapping/providers/guide.d.ts +3 -43
  297. package/dist/snapping/providers/guide.js +1 -44
  298. package/dist/snapping/providers/intersection.js +1 -1
  299. package/dist/snapping/providers/store.js +3 -3
  300. package/dist/snapping/service.js +18 -7
  301. package/dist/snapping/types.d.ts +9 -35
  302. package/dist/store/draw-store.js +233 -142
  303. package/dist/store/local-visibility.d.ts +11 -6
  304. package/dist/store/local-visibility.js +38 -7
  305. package/dist/store/lock.d.ts +0 -6
  306. package/dist/store/lock.js +0 -6
  307. package/dist/store/memory/change-bus.d.ts +3 -3
  308. package/dist/store/memory/change-bus.js +12 -0
  309. package/dist/store/memory/file-store.d.ts +2 -2
  310. package/dist/store/memory/ui-state.d.ts +1 -51
  311. package/dist/store/memory/ui-state.js +122 -134
  312. package/dist/store/memory.d.ts +1 -8
  313. package/dist/store/memory.js +249 -45
  314. package/dist/store/ordering.d.ts +9 -0
  315. package/dist/store/ordering.js +17 -0
  316. package/dist/store/spatial/spatial-index.d.ts +1 -1
  317. package/dist/store/spatial/spatial-index.js +1 -1
  318. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  319. package/dist/store/spatial/store-spatial-index.js +9 -3
  320. package/dist/store/store.d.ts +66 -107
  321. package/dist/store/types.d.ts +1 -1
  322. package/dist/store/writable-layer.d.ts +1 -1
  323. package/dist/store/writable-layer.js +2 -2
  324. package/dist/table/builder.d.ts +83 -0
  325. package/dist/table/builder.js +381 -0
  326. package/dist/table/index.d.ts +37 -0
  327. package/dist/table/index.js +5 -0
  328. package/dist/table/packed-rtree.d.ts +1 -0
  329. package/dist/{display → table}/packed-rtree.js +1 -1
  330. package/dist/table/partition.d.ts +1 -0
  331. package/dist/{display → table}/partition.js +3 -3
  332. package/dist/table/prepare.d.ts +44 -0
  333. package/dist/table/prepare.js +136 -0
  334. package/dist/table/table.d.ts +1 -0
  335. package/dist/{display/columnar → table}/table.js +29 -25
  336. package/dist/{display/columnar → table}/types.d.ts +68 -72
  337. package/dist/table/types.js +3 -0
  338. package/dist/view/coordinator.js +4 -3
  339. package/dist/view/feature-companion.d.ts +13 -7
  340. package/dist/view/feature-companion.js +11 -3
  341. package/dist/view/globe-subdivision.js +3 -3
  342. package/dist/view/layer/attach.d.ts +12 -6
  343. package/dist/view/layer/attach.js +86 -10
  344. package/dist/view/layer/custom-layer.js +40 -11
  345. package/dist/view/layer/display-list.js +2 -1
  346. package/dist/view/layer/drape-planner.d.ts +2 -2
  347. package/dist/view/layer/frame-render.d.ts +3 -3
  348. package/dist/view/layer/frame-render.js +7 -2
  349. package/dist/view/layer/frame-state.d.ts +6 -6
  350. package/dist/view/layer/index.d.ts +2 -2
  351. package/dist/view/layer/index.js +1 -1
  352. package/dist/view/layer/render.d.ts +4 -4
  353. package/dist/view/layer/render.js +3 -8
  354. package/dist/view/layer/renderers.d.ts +2 -2
  355. package/dist/view/layer/renderers.js +1 -1
  356. package/dist/view/layer/slot-manager.d.ts +2 -2
  357. package/dist/view/layer/slot-manager.js +4 -4
  358. package/dist/view/layer/slots.d.ts +2 -2
  359. package/dist/view/layer/slots.js +1 -1
  360. package/dist/view/layer/store-retained-bbox.js +3 -2
  361. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  362. package/dist/view/layer/store-retained-classify.js +19 -7
  363. package/dist/view/layer/store-retained-collect.js +8 -7
  364. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  365. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  366. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  367. package/dist/view/layer/store-retained-immediate.js +3 -8
  368. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  369. package/dist/view/layer/store-retained.d.ts +2 -2
  370. package/dist/view/layer/store-retained.js +1 -1
  371. package/dist/view/renderers/batch-manager.js +8 -7
  372. package/dist/view/renderers/drawer.js +21 -15
  373. package/dist/view/renderers/image.js +13 -39
  374. package/dist/view/renderers/line/line-types.d.ts +3 -3
  375. package/dist/view/renderers/line/sdf-line.js +3 -1
  376. package/dist/view/renderers/point/billboard-depth.js +1 -1
  377. package/dist/view/renderers/point/point-instance.js +1 -1
  378. package/dist/view/renderers/point/point-shape.js +2 -2
  379. package/dist/view/renderers/point/point-style.js +48 -4
  380. package/dist/view/renderers/polygon/batch.js +1 -2
  381. package/dist/view/renderers/polygon/fill.js +3 -1
  382. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  383. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  384. package/dist/view/renderers/stroke.js +3 -1
  385. package/dist/view/shaders/helpers.d.ts +2 -42
  386. package/dist/view/shaders/helpers.js +0 -6
  387. package/dist/view/shaders/projection.d.ts +15 -7
  388. package/dist/view/shaders/projection.js +23 -6
  389. package/dist/view/shaders/quad.d.ts +16 -12
  390. package/dist/view/shaders/quad.js +34 -13
  391. package/dist/view/style-rule.d.ts +5 -42
  392. package/dist/view/style-rule.js +20 -44
  393. package/dist/view/terrain/binding.d.ts +1 -0
  394. package/dist/view/terrain/binding.js +29 -0
  395. package/dist/view/terrain/context.d.ts +3 -4
  396. package/dist/view/terrain/context.js +4 -5
  397. package/dist/view/terrain/drape/geometry.js +1 -1
  398. package/dist/view/terrain/drape/pass.d.ts +1 -1
  399. package/dist/view/terrain/drape/pass.js +8 -7
  400. package/dist/view/terrain/polygon.d.ts +9 -5
  401. package/dist/view/terrain/polygon.js +16 -2
  402. package/dist/view/terrain/state.d.ts +1 -1
  403. package/dist/view/terrain/state.js +1 -1
  404. package/dist/view/terrain/tessellation.d.ts +2 -2
  405. package/dist/view/terrain/tessellation.js +1 -1
  406. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  407. package/dist/view/ui/bounds.js +8 -12
  408. package/dist/view/ui/handle-test.js +2 -2
  409. package/dist/view/ui/handle-thinning.js +17 -17
  410. package/dist/view/ui/handles.js +21 -13
  411. package/dist/view/ui/helper.d.ts +1 -1
  412. package/dist/view/ui/helper.js +1 -1
  413. package/dist/view/ui/index.d.ts +1 -1
  414. package/dist/view/ui/selection-scope.js +4 -2
  415. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  416. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  417. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  418. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  419. package/dist/view/ui/selection-ui/index.js +1 -1
  420. package/dist/view/ui/selection-ui/renderer.js +15 -38
  421. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  422. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  423. package/dist/view/ui/selection-ui-drawer.js +63 -2
  424. package/dist/view/ui/tentative.js +1 -1
  425. package/dist/webgl/index.d.ts +65 -0
  426. package/dist/webgl/index.js +62 -0
  427. package/package.json +38 -15
  428. package/dist/api/api.d.ts +0 -1259
  429. package/dist/api/api.js +0 -86
  430. package/dist/api/context.d.ts +0 -173
  431. package/dist/api/display-api.js +0 -23
  432. package/dist/api/event-api.d.ts +0 -13
  433. package/dist/api/event-api.js +0 -17
  434. package/dist/api/extension-api.d.ts +0 -46
  435. package/dist/api/extension-api.js +0 -85
  436. package/dist/api/feature-api.d.ts +0 -11
  437. package/dist/api/feature-api.js +0 -101
  438. package/dist/api/geometry/apply.d.ts +0 -51
  439. package/dist/api/geometry/boolean.d.ts +0 -28
  440. package/dist/api/geometry/boolean.js +0 -65
  441. package/dist/api/geometry/types.d.ts +0 -31
  442. package/dist/api/geometry-operations.d.ts +0 -162
  443. package/dist/api/geometry-operations.js +0 -94
  444. package/dist/api/group-api.d.ts +0 -10
  445. package/dist/api/group-api.js +0 -78
  446. package/dist/api/import-export/constants.d.ts +0 -29
  447. package/dist/api/import-export/constants.js +0 -40
  448. package/dist/api/import-export/file-name.d.ts +0 -10
  449. package/dist/api/import-export/file-name.js +0 -20
  450. package/dist/api/import-export/geojson-export.d.ts +0 -19
  451. package/dist/api/import-export/image-import.d.ts +0 -12
  452. package/dist/api/import-export/image-import.js +0 -53
  453. package/dist/api/import-export/index.d.ts +0 -9
  454. package/dist/api/import-export/index.js +0 -107
  455. package/dist/api/import-export/native-format.d.ts +0 -15
  456. package/dist/api/import-export/style-validation.d.ts +0 -27
  457. package/dist/api/import-export/style-validation.js +0 -49
  458. package/dist/api/import-export/types.d.ts +0 -26
  459. package/dist/api/index.d.ts +0 -15
  460. package/dist/api/index.js +0 -3
  461. package/dist/api/input-api.d.ts +0 -158
  462. package/dist/api/input-api.js +0 -144
  463. package/dist/api/instance-api.d.ts +0 -38
  464. package/dist/api/instance-api.js +0 -136
  465. package/dist/api/layer-api.d.ts +0 -12
  466. package/dist/api/layer-api.js +0 -62
  467. package/dist/api/selection-api.d.ts +0 -7
  468. package/dist/api/selection-api.js +0 -78
  469. package/dist/api/snapping-api.d.ts +0 -125
  470. package/dist/api/snapping-api.js +0 -50
  471. package/dist/api/topology-api.d.ts +0 -30
  472. package/dist/api/topology-api.js +0 -16
  473. package/dist/api/tracing-api.d.ts +0 -31
  474. package/dist/api/tracing-api.js +0 -16
  475. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  476. package/dist/dispatcher/hit-test/index.js +0 -9
  477. package/dist/dispatcher/index.d.ts +0 -15
  478. package/dist/dispatcher/index.js +0 -3
  479. package/dist/display/columnar/index.d.ts +0 -12
  480. package/dist/display/columnar/index.js +0 -13
  481. package/dist/display/columnar/prepare.d.ts +0 -42
  482. package/dist/display/columnar/prepare.js +0 -116
  483. package/dist/display/index.d.ts +0 -13
  484. package/dist/display/types.js +0 -43
  485. package/dist/maplibre-gl-draw.d.ts +0 -47
  486. package/dist/modes/cursor.js +0 -72
  487. package/dist/modes/index.d.ts +0 -7
  488. package/dist/operations/index.d.ts +0 -9
  489. package/dist/operations/index.js +0 -3
  490. package/dist/plugins/index.d.ts +0 -10
  491. package/dist/plugins/mutation-hooks.d.ts +0 -28
  492. package/dist/plugins/mutation-hooks.js +0 -84
  493. package/dist/plugins/plugin-context.js +0 -367
  494. package/dist/plugins/plugin-manager.d.ts +0 -103
  495. package/dist/plugins/plugin-manager.js +0 -316
  496. package/dist/plugins/plugin.d.ts +0 -529
  497. package/dist/shared/config/index.d.ts +0 -17
  498. package/dist/shared/config/index.js +0 -8
  499. package/dist/shared/utils/index.d.ts +0 -15
  500. package/dist/shared/utils/index.js +0 -24
  501. package/dist/snapping/index.d.ts +0 -14
  502. package/dist/snapping/index.js +0 -4
  503. package/dist/store/change-merger.js +0 -102
  504. package/dist/store/event-bridge.js +0 -161
  505. package/dist/store/index.d.ts +0 -12
  506. package/dist/store/index.js +0 -4
  507. package/dist/view/index.d.ts +0 -47
  508. package/dist/view/index.js +0 -20
  509. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  510. /package/dist/api/{import-export/types.js → document.js} +0 -0
  511. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  512. /package/dist/{display/index.js → api/events.js} +0 -0
  513. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  514. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  515. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  516. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  517. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  518. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  519. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  520. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  521. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  522. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  523. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  524. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  525. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  526. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  527. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  528. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  529. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  532. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  533. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  534. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  535. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  536. /package/dist/{display → dataset}/chunk-set.js +0 -0
  537. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  538. /package/dist/{display → dataset}/manager.js +0 -0
  539. /package/dist/{display → dataset}/provider.js +0 -0
  540. /package/dist/{display → dataset}/selection.d.ts +0 -0
  541. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Test: the public predicates between points, lines and polygons
3
+ *
4
+ * The tests run on the lng/lat plane. A point or a line is contained when it lies inside the
5
+ * polygon or on its boundary; a polygon is contained when no part of it lies outside.
6
+ */
7
+ import type { Geometry, MultiPolygon, Point, Polygon, Position } from 'geojson';
8
+ /**
9
+ * Determines whether a point lies inside a polygon, holes taken into account.
10
+ *
11
+ * @param point The point, a position `[lng, lat]` in degrees or a Point
12
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
13
+ * in degrees
14
+ * @returns `true` when the point lies inside an outer ring and inside none of its holes. The
15
+ * result for a point exactly on the boundary is not defined
16
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected type
17
+ */
18
+ export declare function pointInPolygon(point: Position | Point, polygon: Polygon | MultiPolygon | {
19
+ readonly geometry: Geometry;
20
+ }): boolean;
21
+ /**
22
+ * Determines whether two polygons share an area.
23
+ *
24
+ * @param a The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
25
+ * degrees
26
+ * @param b The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
27
+ * degrees
28
+ * @returns `true` when the common part has an area. `false` when they only touch along an edge
29
+ * or at a vertex
30
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not a Polygon or a
31
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
32
+ */
33
+ export declare function overlaps(a: Polygon | MultiPolygon | {
34
+ readonly geometry: Geometry;
35
+ }, b: Polygon | MultiPolygon | {
36
+ readonly geometry: Geometry;
37
+ }): boolean;
38
+ /**
39
+ * Determines whether a polygon completely contains a geometry.
40
+ *
41
+ * @param outer The containing Polygon or MultiPolygon, or a feature whose geometry is one;
42
+ * coordinates in degrees
43
+ * @param inner The contained geometry, or a feature whose geometry it is; coordinates in
44
+ * degrees. It may share the boundary of `outer`
45
+ * @returns `true` when no part of `inner` lies outside `outer`. `false` for a polygon without
46
+ * an area and for an empty geometry
47
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected
48
+ * type, and (`engine-failure`) when the boolean operation fails
49
+ */
50
+ export declare function contains(outer: Polygon | MultiPolygon | {
51
+ readonly geometry: Geometry;
52
+ }, inner: Geometry | {
53
+ readonly geometry: Geometry;
54
+ }): boolean;
@@ -0,0 +1,144 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { usableAreaParts } from './coords.js';
4
+ import { withOperation } from './errors.js';
5
+ import { areaOf, geometryOf, positionOf } from './geojson.js';
6
+ import { contains as containsArea, intersects, pointInPolygon as pointInArea, } from './predicates.js';
7
+ import { segmentIntersection } from './split.js';
8
+ /**
9
+ * Determines whether a point lies inside a polygon, holes taken into account.
10
+ *
11
+ * @param point The point, a position `[lng, lat]` in degrees or a Point
12
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
13
+ * in degrees
14
+ * @returns `true` when the point lies inside an outer ring and inside none of its holes. The
15
+ * result for a point exactly on the boundary is not defined
16
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected type
17
+ */
18
+ export function pointInPolygon(point, polygon) {
19
+ return pointInArea(positionOf(point, 'pointInPolygon'), areaOf(polygon, 'pointInPolygon'));
20
+ }
21
+ /**
22
+ * Determines whether two polygons share an area.
23
+ *
24
+ * @param a The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
25
+ * degrees
26
+ * @param b The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
27
+ * degrees
28
+ * @returns `true` when the common part has an area. `false` when they only touch along an edge
29
+ * or at a vertex
30
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not a Polygon or a
31
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
32
+ */
33
+ export function overlaps(a, b) {
34
+ const left = areaOf(a, 'overlaps');
35
+ const right = areaOf(b, 'overlaps');
36
+ return withOperation('overlaps', () => intersects(left, right));
37
+ }
38
+ /** The distance in degrees within which a point counts as on the boundary */
39
+ const BOUNDARY_EPSILON = 1e-12;
40
+ /** The square of the planar distance from a point to a segment */
41
+ function squaredSegmentDistance(p, a, b) {
42
+ const dx = b[0] - a[0];
43
+ const dy = b[1] - a[1];
44
+ const lengthSquared = dx * dx + dy * dy;
45
+ const t = lengthSquared === 0
46
+ ? 0
47
+ : Math.min(1, Math.max(0, ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / lengthSquared));
48
+ const x = p[0] - (a[0] + t * dx);
49
+ const y = p[1] - (a[1] + t * dy);
50
+ return x * x + y * y;
51
+ }
52
+ /** Calls a function with every edge of every ring, the closing edge included */
53
+ function forEachEdge(parts, visit) {
54
+ for (const part of parts) {
55
+ for (const ring of part) {
56
+ for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
57
+ if (visit(ring[j], ring[i]) === true)
58
+ return true;
59
+ }
60
+ }
61
+ }
62
+ return false;
63
+ }
64
+ function onBoundary(point, parts) {
65
+ const limit = BOUNDARY_EPSILON * BOUNDARY_EPSILON;
66
+ return forEachEdge(parts, (a, b) => squaredSegmentDistance(point, a, b) <= limit);
67
+ }
68
+ function coversPoint(parts, point) {
69
+ return pointInArea(point, parts) || onBoundary(point, parts);
70
+ }
71
+ /**
72
+ * Whether a line lies inside the polygon or on its boundary
73
+ *
74
+ * Each segment is cut where it crosses an edge; every vertex and the middle of every piece
75
+ * must be covered.
76
+ */
77
+ function coversLine(parts, line) {
78
+ if (line.length === 0)
79
+ return false;
80
+ if (!line.every((vertex) => coversPoint(parts, vertex)))
81
+ return false;
82
+ for (let i = 0; i < line.length - 1; i++) {
83
+ const a = line[i];
84
+ const b = line[i + 1];
85
+ const dx = b[0] - a[0];
86
+ const dy = b[1] - a[1];
87
+ const alongX = Math.abs(dx) >= Math.abs(dy);
88
+ const cuts = [0, 1];
89
+ forEachEdge(parts, (c, d) => {
90
+ const crossing = segmentIntersection(a, b, c, d);
91
+ if (crossing !== null) {
92
+ cuts.push(alongX ? (crossing[0] - a[0]) / dx : (crossing[1] - a[1]) / dy);
93
+ }
94
+ return undefined;
95
+ });
96
+ cuts.sort((x, y) => x - y);
97
+ for (let k = 0; k < cuts.length - 1; k++) {
98
+ if (cuts[k + 1] - cuts[k] <= BOUNDARY_EPSILON)
99
+ continue;
100
+ const t = (cuts[k] + cuts[k + 1]) / 2;
101
+ if (!coversPoint(parts, [a[0] + t * dx, a[1] + t * dy]))
102
+ return false;
103
+ }
104
+ }
105
+ return true;
106
+ }
107
+ function containsGeometry(outer, inner) {
108
+ const parts = usableAreaParts(outer);
109
+ switch (inner.type) {
110
+ case 'Polygon':
111
+ case 'MultiPolygon':
112
+ return containsArea(outer, inner.coordinates);
113
+ case 'Point':
114
+ return coversPoint(parts, inner.coordinates);
115
+ case 'MultiPoint':
116
+ return (inner.coordinates.length > 0 &&
117
+ inner.coordinates.every((point) => coversPoint(parts, point)));
118
+ case 'LineString':
119
+ return coversLine(parts, inner.coordinates);
120
+ case 'MultiLineString':
121
+ return (inner.coordinates.length > 0 &&
122
+ inner.coordinates.every((line) => coversLine(parts, line)));
123
+ case 'GeometryCollection':
124
+ return (inner.geometries.length > 0 &&
125
+ inner.geometries.every((member) => containsGeometry(outer, geometryOf(member, 'contains'))));
126
+ }
127
+ }
128
+ /**
129
+ * Determines whether a polygon completely contains a geometry.
130
+ *
131
+ * @param outer The containing Polygon or MultiPolygon, or a feature whose geometry is one;
132
+ * coordinates in degrees
133
+ * @param inner The contained geometry, or a feature whose geometry it is; coordinates in
134
+ * degrees. It may share the boundary of `outer`
135
+ * @returns `true` when no part of `inner` lies outside `outer`. `false` for a polygon without
136
+ * an area and for an empty geometry
137
+ * @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected
138
+ * type, and (`engine-failure`) when the boolean operation fails
139
+ */
140
+ export function contains(outer, inner) {
141
+ const area = areaOf(outer, 'contains');
142
+ const geometry = geometryOf(inner, 'contains');
143
+ return withOperation('contains', () => containsGeometry(area, geometry));
144
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Repair: the public functions that tidy polygons and reduce vertices
3
+ */
4
+ import type { Geometry, LineString, MultiPolygon, Polygon } from 'geojson';
5
+ /**
6
+ * Returns a polygon with its self-intersections resolved, its rings oriented and its rings
7
+ * without an area removed.
8
+ *
9
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
10
+ * in degrees. A ring with fewer than 3 positions or a position that is not finite is dropped
11
+ * @returns A Polygon, or a MultiPolygon when the result falls apart (a figure eight becomes two
12
+ * parts), with outer rings counter-clockwise and holes clockwise. null when nothing with an
13
+ * area remains
14
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a Polygon or a
15
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
16
+ */
17
+ export declare function makeValid(polygon: Polygon | MultiPolygon | {
18
+ readonly geometry: Geometry;
19
+ }): Polygon | MultiPolygon | null;
20
+ /**
21
+ * Returns a polygon with its rings oriented as RFC 7946 recommends: outer rings
22
+ * counter-clockwise and holes clockwise.
23
+ *
24
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
25
+ * in degrees. Only the orientation changes; self-intersections are left as they are (see
26
+ * {@link makeValid})
27
+ * @returns A geometry of the same type as the input
28
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a Polygon or a
29
+ * MultiPolygon
30
+ */
31
+ export declare function rewind(polygon: Polygon | {
32
+ readonly geometry: Polygon;
33
+ }): Polygon;
34
+ export declare function rewind(polygon: MultiPolygon | {
35
+ readonly geometry: MultiPolygon;
36
+ }): MultiPolygon;
37
+ export declare function rewind(polygon: Polygon | MultiPolygon | {
38
+ readonly geometry: Geometry;
39
+ }): Polygon | MultiPolygon;
40
+ /**
41
+ * Reduces the vertices of a line or a polygon with the Douglas-Peucker algorithm and a
42
+ * tolerance in meters.
43
+ *
44
+ * @param geometry The LineString, Polygon or MultiPolygon, or a feature whose geometry is one;
45
+ * coordinates in degrees
46
+ * @param toleranceMeters The largest distance in meters a removed vertex may lie from the
47
+ * simplified line, measured on a plane at the latitude of the center of the bounding box. 0
48
+ * or less removes nothing
49
+ * @returns A geometry of the same type. The ends of a line always remain, and a ring that
50
+ * would keep fewer than 4 positions is kept as it is. The result may intersect itself (see
51
+ * {@link makeValid})
52
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a LineString, a
53
+ * Polygon or a MultiPolygon, and when the tolerance is not a finite number
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * import { simplify } from '@sakuzu/maplibre-gl-draw/geometry';
58
+ *
59
+ * // The middle vertex lies about 1 m off the line, within the 5 m tolerance
60
+ * simplify({ type: 'LineString', coordinates: [[0, 0], [0.001, 0.00001], [0.002, 0]] }, 5);
61
+ * // { type: 'LineString', coordinates: [[0, 0], [0.002, 0]] }
62
+ * ```
63
+ */
64
+ export declare function simplify(geometry: LineString | {
65
+ readonly geometry: LineString;
66
+ }, toleranceMeters: number): LineString;
67
+ export declare function simplify(geometry: Polygon | {
68
+ readonly geometry: Polygon;
69
+ }, toleranceMeters: number): Polygon;
70
+ export declare function simplify(geometry: MultiPolygon | {
71
+ readonly geometry: MultiPolygon;
72
+ }, toleranceMeters: number): MultiPolygon;
73
+ export declare function simplify(geometry: LineString | Polygon | MultiPolygon | {
74
+ readonly geometry: Geometry;
75
+ }, toleranceMeters: number): LineString | Polygon | MultiPolygon;
@@ -0,0 +1,77 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { coordinatesBBox } from './bbox.js';
4
+ import { normalizeArea } from './boolean.js';
5
+ import { invalidInput, withOperation } from './errors.js';
6
+ import { areaGeometryOf, areaOf, geometryOf, positionsOf, toAreaGeometry } from './geojson.js';
7
+ import { normalizeMultiPolygonOrientation, normalizePolygonOrientation, simplify as simplifyPath, } from './simplify.js';
8
+ import { metersToDegrees, toRadians } from './units.js';
9
+ /**
10
+ * Returns a polygon with its self-intersections resolved, its rings oriented and its rings
11
+ * without an area removed.
12
+ *
13
+ * @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
14
+ * in degrees. A ring with fewer than 3 positions or a position that is not finite is dropped
15
+ * @returns A Polygon, or a MultiPolygon when the result falls apart (a figure eight becomes two
16
+ * parts), with outer rings counter-clockwise and holes clockwise. null when nothing with an
17
+ * area remains
18
+ * @throws {@link GeometryError} (`invalid-input`) when the input is not a Polygon or a
19
+ * MultiPolygon, and (`engine-failure`) when the boolean operation fails
20
+ */
21
+ export function makeValid(polygon) {
22
+ const coordinates = areaOf(polygon, 'makeValid');
23
+ return withOperation('makeValid', () => toAreaGeometry(normalizeArea(coordinates)));
24
+ }
25
+ export function rewind(polygon) {
26
+ const geometry = areaGeometryOf(polygon, 'rewind');
27
+ if (geometry.type === 'Polygon') {
28
+ return {
29
+ type: 'Polygon',
30
+ coordinates: normalizePolygonOrientation(geometry.coordinates),
31
+ };
32
+ }
33
+ return {
34
+ type: 'MultiPolygon',
35
+ coordinates: normalizeMultiPolygonOrientation(geometry.coordinates),
36
+ };
37
+ }
38
+ /**
39
+ * Simplifies a path with a tolerance in meters: the path is scaled to a local plane in which
40
+ * a degree of longitude is `cos(latitude)` degrees of latitude, and the tolerance is taken in
41
+ * degrees of latitude
42
+ */
43
+ function simplifyInMeters(path, toleranceDegrees, lngScale) {
44
+ const scaled = path.map((position) => [position[0] * lngScale, position[1]]);
45
+ const indexOf = new Map();
46
+ scaled.forEach((position, index) => {
47
+ indexOf.set(position, index);
48
+ });
49
+ return simplifyPath(scaled, toleranceDegrees).map((position) => [
50
+ ...path[indexOf.get(position) ?? 0],
51
+ ]);
52
+ }
53
+ export function simplify(geometry, toleranceMeters) {
54
+ const input = geometryOf(geometry, 'simplify');
55
+ if (input.type !== 'LineString' && input.type !== 'Polygon' && input.type !== 'MultiPolygon') {
56
+ throw invalidInput('simplify', 'the input is not a LineString, a Polygon or a MultiPolygon');
57
+ }
58
+ if (!Number.isFinite(toleranceMeters)) {
59
+ throw invalidInput('simplify', 'the tolerance is not a finite number');
60
+ }
61
+ const box = coordinatesBBox(positionsOf(input));
62
+ const latitude = box === null ? 0 : (box[1] + box[3]) / 2;
63
+ const toleranceDegrees = metersToDegrees(toleranceMeters, latitude).lat;
64
+ const lngScale = Math.cos(toRadians(latitude));
65
+ const path = (positions) => simplifyInMeters(positions, toleranceDegrees, lngScale);
66
+ switch (input.type) {
67
+ case 'LineString':
68
+ return { type: 'LineString', coordinates: path(input.coordinates) };
69
+ case 'Polygon':
70
+ return { type: 'Polygon', coordinates: input.coordinates.map(path) };
71
+ case 'MultiPolygon':
72
+ return {
73
+ type: 'MultiPolygon',
74
+ coordinates: input.coordinates.map((polygon) => polygon.map(path)),
75
+ };
76
+ }
77
+ }
@@ -14,13 +14,6 @@ import type { Coordinate, MultiPolygonCoordinates, PolygonCoordinates, Ring } fr
14
14
  * simplified line
15
15
  * @returns The simplified vertices as a new array. A copy of the input for 2 positions or
16
16
  * fewer, for a tolerance that is not positive, and for a ring that would collapse
17
- *
18
- * @example
19
- * ```ts
20
- * import { simplify } from '@sakuzu/maplibre-gl-draw/geometry';
21
- *
22
- * simplify([[0, 0], [1, 0.00001], [2, 0], [3, 1]], 0.001); // [[0, 0], [2, 0], [3, 1]]
23
- * ```
24
17
  */
25
18
  export declare function simplify(path: Coordinate[], toleranceDegrees: number): Coordinate[];
26
19
  /**
@@ -69,13 +69,6 @@ function markKeep(path, first, last, squaredTolerance, keep) {
69
69
  * simplified line
70
70
  * @returns The simplified vertices as a new array. A copy of the input for 2 positions or
71
71
  * fewer, for a tolerance that is not positive, and for a ring that would collapse
72
- *
73
- * @example
74
- * ```ts
75
- * import { simplify } from '@sakuzu/maplibre-gl-draw/geometry';
76
- *
77
- * simplify([[0, 0], [1, 0.00001], [2, 0], [3, 1]], 0.001); // [[0, 0], [2, 0], [3, 1]]
78
- * ```
79
72
  */
80
73
  export function simplify(path, toleranceDegrees) {
81
74
  if (path.length <= 2 || !(toleranceDegrees > 0)) {
@@ -18,14 +18,6 @@ import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates } from './typ
18
18
  * @param b2 The end of segment B, `[lng, lat]` in degrees
19
19
  * @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
20
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
21
  */
30
22
  export declare function segmentIntersection(a1: Coordinate, a2: Coordinate, b1: Coordinate, b2: Coordinate): Coordinate | null;
31
23
  /**
@@ -52,17 +44,5 @@ export declare function segmentIntersection(a1: Coordinate, a2: Coordinate, b1:
52
44
  * input normalized) when it is not split. An empty array when the input has no area
53
45
  * @throws {@link GeometryError} when the boolean operation engine fails even after the
54
46
  * 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
47
  */
68
48
  export declare function splitArea(area: AreaCoordinates, line: Coordinate[]): MultiPolygonCoordinates[];
@@ -64,14 +64,6 @@ const NODE_QUANTUM = 1e-9;
64
64
  * @param b2 The end of segment B, `[lng, lat]` in degrees
65
65
  * @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
66
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
67
  */
76
68
  export function segmentIntersection(a1, a2, b1, b2) {
77
69
  const ax = a2[0] - a1[0];
@@ -119,18 +111,6 @@ export function segmentIntersection(a1, a2, b1, b2) {
119
111
  * input normalized) when it is not split. An empty array when the input has no area
120
112
  * @throws {@link GeometryError} when the boolean operation engine fails even after the
121
113
  * 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
114
  */
135
115
  export function splitArea(area, line) {
136
116
  const normalized = normalizeArea(area);
@@ -5,25 +5,18 @@
5
5
  * whole geometry module.
6
6
  */
7
7
  /**
8
- * The radius of the sphere every geodesic function of this module uses, in meters.
8
+ * The radius in meters of the sphere on which every function of this entry measures.
9
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%.
10
+ * The value is the mean Earth radius of the IUGG, 6,371,008.8 m. Distances, bearings, areas,
11
+ * circles and buffers all assume this sphere rather than an ellipsoid, so a result differs from
12
+ * an ellipsoidal computation by up to about 0.5%.
13
13
  */
14
- export declare const EARTH_RADIUS_METERS = 6371000;
14
+ export declare const EARTH_RADIUS_METERS = 6371008.8;
15
15
  /**
16
16
  * Converts an angle in degrees to radians.
17
17
  *
18
18
  * @param degrees The angle in degrees
19
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
20
  */
28
21
  export declare function toRadians(degrees: number): number;
29
22
  /**
@@ -33,3 +26,18 @@ export declare function toRadians(degrees: number): number;
33
26
  * @returns The angle in degrees. NaN and infinities pass through unchanged
34
27
  */
35
28
  export declare function toDegrees(radians: number): number;
29
+ /**
30
+ * Converts a distance at a latitude into degrees of longitude and latitude.
31
+ *
32
+ * On the sphere of {@link EARTH_RADIUS_METERS}: a degree of latitude is always the same
33
+ * length, and a degree of longitude shrinks with the cosine of the latitude. Use it to turn a
34
+ * tolerance in meters into one in degrees. Near the poles the longitude grows without bound.
35
+ *
36
+ * @param meters The distance in meters
37
+ * @param latitude The latitude in degrees at which the distance is taken
38
+ * @returns The distance in degrees of longitude (`lng`) and of latitude (`lat`)
39
+ */
40
+ export declare function metersToDegrees(meters: number, latitude: number): {
41
+ lng: number;
42
+ lat: number;
43
+ };
@@ -7,25 +7,18 @@
7
7
  * whole geometry module.
8
8
  */
9
9
  /**
10
- * The radius of the sphere every geodesic function of this module uses, in meters.
10
+ * The radius in meters of the sphere on which every function of this entry measures.
11
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%.
12
+ * The value is the mean Earth radius of the IUGG, 6,371,008.8 m. Distances, bearings, areas,
13
+ * circles and buffers all assume this sphere rather than an ellipsoid, so a result differs from
14
+ * an ellipsoidal computation by up to about 0.5%.
15
15
  */
16
- export const EARTH_RADIUS_METERS = 6371000;
16
+ export const EARTH_RADIUS_METERS = 6371008.8;
17
17
  /**
18
18
  * Converts an angle in degrees to radians.
19
19
  *
20
20
  * @param degrees The angle in degrees
21
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
22
  */
30
23
  export function toRadians(degrees) {
31
24
  return (degrees * Math.PI) / 180;
@@ -39,3 +32,18 @@ export function toRadians(degrees) {
39
32
  export function toDegrees(radians) {
40
33
  return (radians * 180) / Math.PI;
41
34
  }
35
+ /**
36
+ * Converts a distance at a latitude into degrees of longitude and latitude.
37
+ *
38
+ * On the sphere of {@link EARTH_RADIUS_METERS}: a degree of latitude is always the same
39
+ * length, and a degree of longitude shrinks with the cosine of the latitude. Use it to turn a
40
+ * tolerance in meters into one in degrees. Near the poles the longitude grows without bound.
41
+ *
42
+ * @param meters The distance in meters
43
+ * @param latitude The latitude in degrees at which the distance is taken
44
+ * @returns The distance in degrees of longitude (`lng`) and of latitude (`lat`)
45
+ */
46
+ export function metersToDegrees(meters, latitude) {
47
+ const lat = toDegrees(meters / EARTH_RADIUS_METERS);
48
+ return { lng: lat / Math.cos(toRadians(latitude)), lat };
49
+ }