@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1016 -2
- package/README.ja.md +39 -19
- package/README.md +41 -21
- package/dist/api/datasets.d.ts +258 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +135 -0
- package/dist/api/draw.js +18 -0
- package/dist/api/drawing.d.ts +87 -0
- package/dist/api/errors.d.ts +35 -0
- package/dist/api/errors.js +35 -0
- package/dist/api/events.d.ts +306 -0
- package/dist/api/extension/context.d.ts +247 -0
- package/dist/api/extension/feature-type.d.ts +129 -0
- package/dist/api/extension/mode.d.ts +123 -0
- package/dist/api/extension/plugin.d.ts +51 -0
- package/dist/api/extension/plugin.js +3 -0
- package/dist/api/extension/provider.d.ts +119 -0
- package/dist/api/extension/provider.js +3 -0
- package/dist/api/extension/render.d.ts +176 -0
- package/dist/api/extension/render.js +3 -0
- package/dist/api/extension/store.d.ts +190 -0
- package/dist/api/extension/store.js +3 -0
- package/dist/api/extensions.d.ts +306 -0
- package/dist/api/extensions.js +3 -0
- package/dist/api/features.d.ts +188 -0
- package/dist/api/features.js +3 -0
- package/dist/api/groups.d.ts +111 -0
- package/dist/api/groups.js +3 -0
- package/dist/api/hidden.d.ts +45 -0
- package/dist/api/hidden.js +3 -0
- package/dist/api/impl/adapters.js +463 -0
- package/dist/api/impl/contexts.js +466 -0
- package/dist/api/impl/create-draw.js +124 -0
- package/dist/api/impl/datasets.js +404 -0
- package/dist/api/impl/destroy-guard.js +74 -0
- package/dist/api/impl/document.js +280 -0
- package/dist/api/impl/drawing.js +180 -0
- package/dist/api/impl/engine-context.d.ts +7 -0
- package/dist/api/{context.js → impl/engine-context.js} +49 -38
- package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
- package/dist/api/impl/events.js +422 -0
- package/dist/api/impl/extension-host.js +361 -0
- package/dist/api/impl/extensions.js +229 -0
- package/dist/api/impl/features.js +445 -0
- package/dist/api/impl/geometry/apply.d.ts +32 -0
- package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
- package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
- package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/split.js +10 -21
- package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
- package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
- package/dist/api/impl/geometry/types.js +3 -0
- package/dist/api/impl/groups.d.ts +3 -0
- package/dist/api/impl/groups.js +268 -0
- package/dist/api/impl/hidden.js +60 -0
- package/dist/api/impl/import-export/constants.d.ts +22 -0
- package/dist/api/impl/import-export/constants.js +24 -0
- package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
- package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
- package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
- package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
- package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
- package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
- package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
- package/dist/api/impl/import-export/image-import.d.ts +16 -0
- package/dist/api/impl/import-export/image-import.js +73 -0
- package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
- package/dist/api/impl/import-export/legacy-image-style.js +49 -0
- package/dist/api/impl/import-export/native-format.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
- package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
- package/dist/api/impl/import-export/native-upgrade.js +139 -0
- package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
- package/dist/api/impl/import-export/style-validation.d.ts +24 -0
- package/dist/api/impl/import-export/style-validation.js +86 -0
- package/dist/api/impl/import-export/types.d.ts +52 -0
- package/dist/api/impl/import-export/types.js +3 -0
- package/dist/api/impl/input.js +180 -0
- package/dist/api/impl/layers.js +307 -0
- package/dist/api/impl/metadata.d.ts +1 -0
- package/dist/api/impl/metadata.js +22 -0
- package/dist/api/impl/options.d.ts +1 -0
- package/dist/api/impl/options.js +822 -0
- package/dist/api/impl/placement.d.ts +1 -0
- package/dist/api/impl/placement.js +138 -0
- package/dist/api/impl/render-context.d.ts +13 -0
- package/dist/api/impl/render-context.js +272 -0
- package/dist/api/impl/rows.d.ts +1 -0
- package/dist/api/impl/rows.js +46 -0
- package/dist/api/impl/selection.d.ts +1 -0
- package/dist/api/impl/selection.js +186 -0
- package/dist/api/impl/shared.d.ts +64 -0
- package/dist/api/impl/shared.js +178 -0
- package/dist/api/impl/validate-extension.d.ts +1 -0
- package/dist/api/impl/validate-extension.js +159 -0
- package/dist/api/layers.d.ts +130 -0
- package/dist/api/layers.js +3 -0
- package/dist/api/metadata.d.ts +18 -0
- package/dist/api/metadata.js +3 -0
- package/dist/api/model.d.ts +487 -0
- package/dist/api/model.js +47 -0
- package/dist/api/options.d.ts +466 -0
- package/dist/api/options.js +3 -0
- package/dist/api/selection.d.ts +94 -0
- package/dist/api/selection.js +3 -0
- package/dist/api/state.d.ts +155 -0
- package/dist/api/state.js +12 -0
- package/dist/{display → dataset}/chunk.d.ts +1 -1
- package/dist/{display → dataset}/chunk.js +4 -3
- package/dist/{display → dataset}/dataset.js +18 -21
- package/dist/dataset/interaction.d.ts +1 -0
- package/dist/{display → dataset}/interaction.js +18 -6
- package/dist/dataset/manager.d.ts +1 -0
- package/dist/dataset/provider.d.ts +1 -0
- package/dist/{display → dataset}/retained.d.ts +1 -1
- package/dist/{display → dataset}/retained.js +8 -7
- package/dist/dataset/source.d.ts +1 -0
- package/dist/{display → dataset}/source.js +17 -4
- package/dist/dataset/spatial.d.ts +1 -0
- package/dist/{display → dataset}/spatial.js +1 -1
- package/dist/dataset/style.d.ts +1 -0
- package/dist/{display → dataset}/style.js +1 -1
- package/dist/dataset/table-source.d.ts +1 -0
- package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
- package/dist/{display → dataset}/thinning.d.ts +0 -10
- package/dist/{display → dataset}/thinning.js +3 -2
- package/dist/dataset/triangulation.d.ts +1 -0
- package/dist/{display → dataset}/triangulation.js +0 -0
- package/dist/{display → dataset}/types.d.ts +82 -121
- package/dist/dataset/types.js +61 -0
- package/dist/dispatcher/hit-test/box-strategies.js +13 -13
- package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
- package/dist/dispatcher/hit-test/globe-shape.js +5 -4
- package/dist/dispatcher/hit-test/service.d.ts +17 -0
- package/dist/dispatcher/hit-test/service.js +80 -16
- package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
- package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
- package/dist/dispatcher/hit-test/strategies/image.js +6 -18
- package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
- package/dist/dispatcher/hit-test/strategies/line.js +9 -2
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
- package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
- package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
- package/dist/dispatcher/hit-test/strategies/point.js +8 -4
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
- package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
- package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
- package/dist/dispatcher/input-router.js +152 -69
- package/dist/dispatcher/normalizer.js +6 -2
- package/dist/dispatcher/types.d.ts +6 -1
- package/dist/extension/feature-handler.d.ts +1 -182
- package/dist/extension/index.d.ts +4 -7
- package/dist/extension/renderers.d.ts +1 -208
- package/dist/geometry/angle.d.ts +0 -8
- package/dist/geometry/angle.js +0 -8
- package/dist/geometry/bbox.d.ts +4 -12
- package/dist/geometry/bbox.js +4 -12
- package/dist/geometry/boolean.d.ts +0 -51
- package/dist/geometry/boolean.js +0 -51
- package/dist/geometry/buffer.d.ts +0 -26
- package/dist/geometry/buffer.js +0 -26
- package/dist/geometry/circle.d.ts +0 -9
- package/dist/geometry/circle.js +0 -9
- package/dist/geometry/coords.d.ts +0 -16
- package/dist/geometry/coords.js +0 -16
- package/dist/geometry/distance.d.ts +0 -24
- package/dist/geometry/distance.js +0 -24
- package/dist/geometry/errors.d.ts +21 -36
- package/dist/geometry/errors.js +49 -29
- package/dist/geometry/geojson.d.ts +81 -0
- package/dist/geometry/geojson.js +164 -0
- package/dist/geometry/index.d.ts +38 -23
- package/dist/geometry/index.js +43 -31
- package/dist/geometry/measure.d.ts +0 -27
- package/dist/geometry/measure.js +0 -27
- package/dist/geometry/predicates.d.ts +0 -9
- package/dist/geometry/predicates.js +0 -9
- package/dist/geometry/public-bounds.d.ts +26 -0
- package/dist/geometry/public-bounds.js +30 -0
- package/dist/geometry/public-combine.d.ts +78 -0
- package/dist/geometry/public-combine.js +82 -0
- package/dist/geometry/public-create.d.ts +54 -0
- package/dist/geometry/public-create.js +70 -0
- package/dist/geometry/public-measure.d.ts +170 -0
- package/dist/geometry/public-measure.js +283 -0
- package/dist/geometry/public-predicates.d.ts +54 -0
- package/dist/geometry/public-predicates.js +144 -0
- package/dist/geometry/public-repair.d.ts +75 -0
- package/dist/geometry/public-repair.js +77 -0
- package/dist/geometry/simplify.d.ts +0 -7
- package/dist/geometry/simplify.js +0 -7
- package/dist/geometry/split.d.ts +0 -20
- package/dist/geometry/split.js +0 -20
- package/dist/geometry/units.d.ts +20 -12
- package/dist/geometry/units.js +20 -12
- package/dist/index.d.ts +52 -66
- package/dist/index.js +6 -18
- package/dist/messages.d.ts +7 -7
- package/dist/modes/draw/circle.js +83 -207
- package/dist/modes/draw/commit-layer.d.ts +5 -16
- package/dist/modes/draw/commit-layer.js +2 -13
- package/dist/modes/draw/freehand.js +108 -246
- package/dist/modes/draw/image.js +4 -2
- package/dist/modes/draw/index.d.ts +5 -5
- package/dist/modes/draw/index.js +5 -5
- package/dist/modes/draw/line.js +18 -354
- package/dist/modes/draw/point.js +29 -78
- package/dist/modes/draw/polygon.js +23 -368
- package/dist/modes/draw/trace-support.d.ts +43 -36
- package/dist/modes/draw/trace-support.js +95 -98
- package/dist/modes/draw/vertex-drawing.d.ts +1 -0
- package/dist/modes/draw/vertex-drawing.js +176 -0
- package/dist/modes/handler.d.ts +1 -285
- package/dist/modes/manager.d.ts +2 -2
- package/dist/modes/manager.js +3 -0
- package/dist/modes/select/box-selection.d.ts +3 -3
- package/dist/modes/select/box-selection.js +2 -1
- package/dist/modes/select/click-handler.d.ts +5 -5
- package/dist/modes/select/click-handler.js +22 -20
- package/dist/modes/select/cursor-handler.d.ts +2 -2
- package/dist/modes/select/drag/intermediate-writes.js +1 -1
- package/dist/modes/select/drag/move.js +3 -3
- package/dist/modes/select/drag/operation.d.ts +3 -3
- package/dist/modes/select/drag/radius.js +5 -4
- package/dist/modes/select/drag/transform.d.ts +2 -2
- package/dist/modes/select/drag/transform.js +11 -5
- package/dist/modes/select/drag/vertex.d.ts +2 -2
- package/dist/modes/select/drag/vertex.js +13 -8
- package/dist/modes/select/drag-handler.js +44 -25
- package/dist/modes/select/mode.js +17 -17
- package/dist/modes/select/shortcut-handler.d.ts +8 -8
- package/dist/modes/select/shortcut-handler.js +9 -7
- package/dist/operations/layer-operations.js +29 -168
- package/dist/operations/resize.d.ts +2 -2
- package/dist/operations/resize.js +5 -5
- package/dist/operations/rotate.js +5 -5
- package/dist/operations/selection-operations.d.ts +16 -1
- package/dist/operations/selection-operations.js +28 -13
- package/dist/operations/shared-vertex.js +4 -2
- package/dist/operations/trace-graph.d.ts +0 -18
- package/dist/operations/trace-graph.js +0 -18
- package/dist/operations/vertex.js +36 -35
- package/dist/shared/color.d.ts +1 -0
- package/dist/shared/color.js +245 -0
- package/dist/shared/config/constants.d.ts +1 -54
- package/dist/shared/config/constants.js +1 -58
- package/dist/shared/config/feature-style.d.ts +16 -13
- package/dist/shared/config/feature-style.js +9 -0
- package/dist/shared/config/rendering.d.ts +3 -3
- package/dist/shared/config/selection-highlight.d.ts +0 -15
- package/dist/shared/config/selection-highlight.js +4 -7
- package/dist/shared/config/selection.d.ts +2 -32
- package/dist/shared/config/selection.js +0 -18
- package/dist/shared/config/topology.d.ts +2 -2
- package/dist/shared/config/trace.d.ts +4 -4
- package/dist/shared/math/angle.d.ts +1 -1
- package/dist/shared/math/angle.js +1 -1
- package/dist/shared/math/circle.d.ts +1 -1
- package/dist/shared/math/circle.js +1 -1
- package/dist/shared/math/distance.d.ts +2 -1
- package/dist/shared/math/distance.js +3 -2
- package/dist/shared/math/index.d.ts +1 -1
- package/dist/shared/math/index.js +1 -1
- package/dist/shared/math/transform.d.ts +23 -0
- package/dist/shared/math/transform.js +47 -28
- package/dist/shared/properties.d.ts +18 -0
- package/dist/shared/properties.js +129 -0
- package/dist/shared/types/events.d.ts +15 -7
- package/dist/shared/types/model.d.ts +109 -159
- package/dist/shared/types/style.d.ts +1 -1
- package/dist/shared/utils/color.d.ts +2 -36
- package/dist/shared/utils/color.js +13 -70
- package/dist/shared/utils/coordinates.d.ts +30 -4
- package/dist/shared/utils/coordinates.js +56 -10
- package/dist/shared/utils/event-emitter.d.ts +1 -262
- package/dist/shared/utils/event-emitter.js +4 -3
- package/dist/shared/utils/feature-bbox.js +8 -7
- package/dist/shared/utils/feature-segments.js +5 -4
- package/dist/shared/utils/image.d.ts +0 -4
- package/dist/shared/utils/image.js +0 -6
- package/dist/shared/utils/name-generator.d.ts +14 -20
- package/dist/shared/utils/name-generator.js +20 -3
- package/dist/shared/utils/pixel-ratio.d.ts +9 -3
- package/dist/shared/utils/pixel-ratio.js +13 -4
- package/dist/shared/utils/property.d.ts +7 -50
- package/dist/shared/utils/property.js +22 -87
- package/dist/snapping/custom-targets.js +21 -4
- package/dist/snapping/indicator.js +20 -11
- package/dist/snapping/providers/display.d.ts +6 -1
- package/dist/snapping/providers/display.js +2 -1
- package/dist/snapping/providers/guide.d.ts +3 -43
- package/dist/snapping/providers/guide.js +1 -44
- package/dist/snapping/providers/intersection.js +1 -1
- package/dist/snapping/providers/store.js +3 -3
- package/dist/snapping/service.js +18 -7
- package/dist/snapping/types.d.ts +9 -35
- package/dist/store/draw-store.js +233 -142
- package/dist/store/local-visibility.d.ts +11 -6
- package/dist/store/local-visibility.js +38 -7
- package/dist/store/lock.d.ts +0 -6
- package/dist/store/lock.js +0 -6
- package/dist/store/memory/change-bus.d.ts +3 -3
- package/dist/store/memory/change-bus.js +12 -0
- package/dist/store/memory/file-store.d.ts +2 -2
- package/dist/store/memory/ui-state.d.ts +1 -51
- package/dist/store/memory/ui-state.js +122 -134
- package/dist/store/memory.d.ts +1 -8
- package/dist/store/memory.js +249 -45
- package/dist/store/ordering.d.ts +9 -0
- package/dist/store/ordering.js +17 -0
- package/dist/store/spatial/spatial-index.d.ts +1 -1
- package/dist/store/spatial/spatial-index.js +1 -1
- package/dist/store/spatial/store-spatial-index.d.ts +3 -1
- package/dist/store/spatial/store-spatial-index.js +9 -3
- package/dist/store/store.d.ts +66 -107
- package/dist/store/types.d.ts +1 -1
- package/dist/store/writable-layer.d.ts +1 -1
- package/dist/store/writable-layer.js +2 -2
- package/dist/table/builder.d.ts +83 -0
- package/dist/table/builder.js +381 -0
- package/dist/table/index.d.ts +37 -0
- package/dist/table/index.js +5 -0
- package/dist/table/packed-rtree.d.ts +1 -0
- package/dist/{display → table}/packed-rtree.js +1 -1
- package/dist/table/partition.d.ts +1 -0
- package/dist/{display → table}/partition.js +3 -3
- package/dist/table/prepare.d.ts +44 -0
- package/dist/table/prepare.js +136 -0
- package/dist/table/table.d.ts +1 -0
- package/dist/{display/columnar → table}/table.js +29 -25
- package/dist/{display/columnar → table}/types.d.ts +68 -72
- package/dist/table/types.js +3 -0
- package/dist/view/coordinator.js +4 -3
- package/dist/view/feature-companion.d.ts +13 -7
- package/dist/view/feature-companion.js +11 -3
- package/dist/view/globe-subdivision.js +3 -3
- package/dist/view/layer/attach.d.ts +1 -1
- package/dist/view/layer/attach.js +1 -1
- package/dist/view/layer/custom-layer.js +40 -11
- package/dist/view/layer/display-list.js +2 -1
- package/dist/view/layer/drape-planner.d.ts +2 -2
- package/dist/view/layer/frame-render.d.ts +3 -3
- package/dist/view/layer/frame-render.js +7 -2
- package/dist/view/layer/frame-state.d.ts +6 -6
- package/dist/view/layer/index.d.ts +2 -2
- package/dist/view/layer/index.js +1 -1
- package/dist/view/layer/render.d.ts +4 -4
- package/dist/view/layer/render.js +3 -8
- package/dist/view/layer/renderers.d.ts +2 -2
- package/dist/view/layer/renderers.js +1 -1
- package/dist/view/layer/slot-manager.d.ts +2 -2
- package/dist/view/layer/slot-manager.js +4 -4
- package/dist/view/layer/slots.d.ts +2 -2
- package/dist/view/layer/slots.js +1 -1
- package/dist/view/layer/store-retained-bbox.js +3 -2
- package/dist/view/layer/store-retained-classify.d.ts +5 -7
- package/dist/view/layer/store-retained-classify.js +19 -7
- package/dist/view/layer/store-retained-collect.js +8 -7
- package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
- package/dist/view/layer/store-retained-coord-patch.js +13 -4
- package/dist/view/layer/store-retained-immediate.d.ts +3 -3
- package/dist/view/layer/store-retained-immediate.js +3 -8
- package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
- package/dist/view/layer/store-retained.d.ts +2 -2
- package/dist/view/layer/store-retained.js +1 -1
- package/dist/view/renderers/batch-manager.js +8 -7
- package/dist/view/renderers/drawer.js +21 -15
- package/dist/view/renderers/image.js +13 -39
- package/dist/view/renderers/line/line-types.d.ts +3 -3
- package/dist/view/renderers/line/sdf-line.js +3 -1
- package/dist/view/renderers/point/billboard-depth.js +1 -1
- package/dist/view/renderers/point/point-instance.js +1 -1
- package/dist/view/renderers/point/point-shape.js +2 -2
- package/dist/view/renderers/point/point-style.js +48 -4
- package/dist/view/renderers/polygon/batch.js +1 -2
- package/dist/view/renderers/polygon/fill.js +3 -1
- package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
- package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
- package/dist/view/renderers/stroke.js +3 -1
- package/dist/view/shaders/helpers.d.ts +2 -42
- package/dist/view/shaders/helpers.js +0 -6
- package/dist/view/shaders/projection.d.ts +15 -7
- package/dist/view/shaders/projection.js +23 -6
- package/dist/view/shaders/quad.d.ts +16 -12
- package/dist/view/shaders/quad.js +34 -13
- package/dist/view/style-rule.d.ts +5 -42
- package/dist/view/style-rule.js +20 -44
- package/dist/view/terrain/binding.d.ts +1 -0
- package/dist/view/terrain/binding.js +29 -0
- package/dist/view/terrain/context.d.ts +3 -4
- package/dist/view/terrain/context.js +4 -5
- package/dist/view/terrain/drape/geometry.js +1 -1
- package/dist/view/terrain/drape/pass.d.ts +1 -1
- package/dist/view/terrain/drape/pass.js +8 -7
- package/dist/view/terrain/polygon.d.ts +9 -5
- package/dist/view/terrain/polygon.js +16 -2
- package/dist/view/terrain/state.d.ts +1 -1
- package/dist/view/terrain/state.js +1 -1
- package/dist/view/terrain/tessellation.d.ts +2 -2
- package/dist/view/terrain/tessellation.js +1 -1
- package/dist/view/ui/auxiliary-handles.d.ts +6 -29
- package/dist/view/ui/bounds.js +8 -12
- package/dist/view/ui/handle-test.js +2 -2
- package/dist/view/ui/handle-thinning.js +17 -17
- package/dist/view/ui/handles.js +21 -13
- package/dist/view/ui/helper.d.ts +1 -1
- package/dist/view/ui/helper.js +1 -1
- package/dist/view/ui/index.d.ts +1 -1
- package/dist/view/ui/selection-scope.js +4 -2
- package/dist/view/ui/selection-ui/bounding-box.js +6 -6
- package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
- package/dist/view/ui/selection-ui/extension-registry.js +70 -7
- package/dist/view/ui/selection-ui/index.d.ts +2 -2
- package/dist/view/ui/selection-ui/index.js +1 -1
- package/dist/view/ui/selection-ui/renderer.js +15 -38
- package/dist/view/ui/selection-ui/types.d.ts +17 -2
- package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
- package/dist/view/ui/selection-ui-drawer.js +63 -2
- package/dist/view/ui/tentative.js +1 -1
- package/dist/webgl/index.d.ts +65 -0
- package/dist/webgl/index.js +62 -0
- package/package.json +20 -9
- package/dist/api/api.d.ts +0 -1259
- package/dist/api/api.js +0 -86
- package/dist/api/context.d.ts +0 -173
- package/dist/api/display-api.js +0 -23
- package/dist/api/event-api.d.ts +0 -13
- package/dist/api/event-api.js +0 -17
- package/dist/api/extension-api.d.ts +0 -46
- package/dist/api/extension-api.js +0 -85
- package/dist/api/feature-api.d.ts +0 -11
- package/dist/api/feature-api.js +0 -101
- package/dist/api/geometry/apply.d.ts +0 -51
- package/dist/api/geometry/boolean.d.ts +0 -28
- package/dist/api/geometry/boolean.js +0 -65
- package/dist/api/geometry/types.d.ts +0 -31
- package/dist/api/geometry-operations.d.ts +0 -162
- package/dist/api/geometry-operations.js +0 -94
- package/dist/api/group-api.d.ts +0 -10
- package/dist/api/group-api.js +0 -78
- package/dist/api/import-export/constants.d.ts +0 -29
- package/dist/api/import-export/constants.js +0 -40
- package/dist/api/import-export/file-name.d.ts +0 -10
- package/dist/api/import-export/file-name.js +0 -20
- package/dist/api/import-export/geojson-export.d.ts +0 -19
- package/dist/api/import-export/image-import.d.ts +0 -12
- package/dist/api/import-export/image-import.js +0 -53
- package/dist/api/import-export/index.d.ts +0 -9
- package/dist/api/import-export/index.js +0 -107
- package/dist/api/import-export/native-format.d.ts +0 -15
- package/dist/api/import-export/style-validation.d.ts +0 -27
- package/dist/api/import-export/style-validation.js +0 -49
- package/dist/api/import-export/types.d.ts +0 -26
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.js +0 -3
- package/dist/api/input-api.d.ts +0 -158
- package/dist/api/input-api.js +0 -144
- package/dist/api/instance-api.d.ts +0 -38
- package/dist/api/instance-api.js +0 -136
- package/dist/api/layer-api.d.ts +0 -12
- package/dist/api/layer-api.js +0 -62
- package/dist/api/selection-api.d.ts +0 -7
- package/dist/api/selection-api.js +0 -78
- package/dist/api/snapping-api.d.ts +0 -125
- package/dist/api/snapping-api.js +0 -50
- package/dist/api/topology-api.d.ts +0 -30
- package/dist/api/topology-api.js +0 -16
- package/dist/api/tracing-api.d.ts +0 -31
- package/dist/api/tracing-api.js +0 -16
- package/dist/dispatcher/hit-test/index.d.ts +0 -14
- package/dist/dispatcher/hit-test/index.js +0 -9
- package/dist/dispatcher/index.d.ts +0 -15
- package/dist/dispatcher/index.js +0 -3
- package/dist/display/columnar/index.d.ts +0 -12
- package/dist/display/columnar/index.js +0 -13
- package/dist/display/columnar/prepare.d.ts +0 -42
- package/dist/display/columnar/prepare.js +0 -116
- package/dist/display/index.d.ts +0 -13
- package/dist/display/types.js +0 -43
- package/dist/maplibre-gl-draw.d.ts +0 -47
- package/dist/modes/cursor.js +0 -72
- package/dist/modes/index.d.ts +0 -7
- package/dist/operations/index.d.ts +0 -9
- package/dist/operations/index.js +0 -3
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/mutation-hooks.d.ts +0 -28
- package/dist/plugins/mutation-hooks.js +0 -84
- package/dist/plugins/plugin-context.js +0 -367
- package/dist/plugins/plugin-manager.d.ts +0 -103
- package/dist/plugins/plugin-manager.js +0 -316
- package/dist/plugins/plugin.d.ts +0 -529
- package/dist/shared/config/index.d.ts +0 -17
- package/dist/shared/config/index.js +0 -8
- package/dist/shared/utils/index.d.ts +0 -15
- package/dist/shared/utils/index.js +0 -24
- package/dist/snapping/index.d.ts +0 -14
- package/dist/snapping/index.js +0 -4
- package/dist/store/change-merger.js +0 -102
- package/dist/store/event-bridge.js +0 -161
- package/dist/store/index.d.ts +0 -12
- package/dist/store/index.js +0 -4
- package/dist/view/index.d.ts +0 -47
- package/dist/view/index.js +0 -20
- /package/dist/api/{geometry/types.js → datasets.js} +0 -0
- /package/dist/api/{import-export/types.js → document.js} +0 -0
- /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
- /package/dist/{display/index.js → api/events.js} +0 -0
- /package/dist/{modes/index.js → api/extension/context.js} +0 -0
- /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
- /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
- /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
- /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
- /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
- /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
- /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
- /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
- /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
- /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
- /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
- /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
- /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
- /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
- /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
- /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
- /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
- /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
- /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
- /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
- /package/dist/{display → dataset}/chunk-set.js +0 -0
- /package/dist/{display → dataset}/dataset.d.ts +0 -0
- /package/dist/{display → dataset}/manager.js +0 -0
- /package/dist/{display → dataset}/provider.js +0 -0
- /package/dist/{display → dataset}/selection.d.ts +0 -0
- /package/dist/{display → dataset}/selection.js +0 -0
|
@@ -15,14 +15,6 @@ import type { Coordinate } from './types.js';
|
|
|
15
15
|
* @param coord1 A position `[lng, lat]` in degrees
|
|
16
16
|
* @param coord2 A position `[lng, lat]` in degrees
|
|
17
17
|
* @returns The distance in meters. 0 for identical positions
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* import { haversineDistanceMeters } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
22
|
-
*
|
|
23
|
-
* // Tokyo Station to Osaka Station
|
|
24
|
-
* haversineDistanceMeters([139.767, 35.681], [135.495, 34.702]); // about 403,139 m
|
|
25
|
-
* ```
|
|
26
18
|
*/
|
|
27
19
|
export declare function haversineDistanceMeters(coord1: Coordinate, coord2: Coordinate): number;
|
|
28
20
|
/**
|
|
@@ -35,14 +27,6 @@ export declare function haversineDistanceMeters(coord1: Coordinate, coord2: Coor
|
|
|
35
27
|
* @param to The end `[lng, lat]` in degrees
|
|
36
28
|
* @returns The bearing in degrees, clockwise with north as 0, in the range [0, 360). 0 when
|
|
37
29
|
* the two positions are identical
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* import { initialBearingDegrees } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
42
|
-
*
|
|
43
|
-
* initialBearingDegrees([0, 0], [1, 0]); // 90 (due east)
|
|
44
|
-
* initialBearingDegrees([0, 0], [0, 1]); // 0 (due north)
|
|
45
|
-
* ```
|
|
46
30
|
*/
|
|
47
31
|
export declare function initialBearingDegrees(from: Coordinate, to: Coordinate): number;
|
|
48
32
|
/**
|
|
@@ -67,13 +51,5 @@ export declare function initialBearingDegrees(from: Coordinate, to: Coordinate):
|
|
|
67
51
|
* goes the opposite way
|
|
68
52
|
* @param bearingDegrees The initial bearing in degrees, clockwise with north as 0
|
|
69
53
|
* @returns The position reached, `[lng, lat]` in degrees
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```ts
|
|
73
|
-
* import { destinationPoint } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
74
|
-
*
|
|
75
|
-
* // 1 km due east of Tokyo Station
|
|
76
|
-
* destinationPoint([139.767, 35.681], 1000, 90); // [139.77807..., 35.68099...]
|
|
77
|
-
* ```
|
|
78
54
|
*/
|
|
79
55
|
export declare function destinationPoint(origin: Coordinate, distanceMeters: number, bearingDegrees: number): Coordinate;
|
|
@@ -11,14 +11,6 @@ import { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
|
|
|
11
11
|
* @param coord1 A position `[lng, lat]` in degrees
|
|
12
12
|
* @param coord2 A position `[lng, lat]` in degrees
|
|
13
13
|
* @returns The distance in meters. 0 for identical positions
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```ts
|
|
17
|
-
* import { haversineDistanceMeters } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
18
|
-
*
|
|
19
|
-
* // Tokyo Station to Osaka Station
|
|
20
|
-
* haversineDistanceMeters([139.767, 35.681], [135.495, 34.702]); // about 403,139 m
|
|
21
|
-
* ```
|
|
22
14
|
*/
|
|
23
15
|
export function haversineDistanceMeters(coord1, coord2) {
|
|
24
16
|
const R = EARTH_RADIUS_METERS;
|
|
@@ -41,14 +33,6 @@ export function haversineDistanceMeters(coord1, coord2) {
|
|
|
41
33
|
* @param to The end `[lng, lat]` in degrees
|
|
42
34
|
* @returns The bearing in degrees, clockwise with north as 0, in the range [0, 360). 0 when
|
|
43
35
|
* the two positions are identical
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* ```ts
|
|
47
|
-
* import { initialBearingDegrees } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
48
|
-
*
|
|
49
|
-
* initialBearingDegrees([0, 0], [1, 0]); // 90 (due east)
|
|
50
|
-
* initialBearingDegrees([0, 0], [0, 1]); // 0 (due north)
|
|
51
|
-
* ```
|
|
52
36
|
*/
|
|
53
37
|
export function initialBearingDegrees(from, to) {
|
|
54
38
|
const [lng1, lat1] = from;
|
|
@@ -86,14 +70,6 @@ export function initialBearingDegrees(from, to) {
|
|
|
86
70
|
* goes the opposite way
|
|
87
71
|
* @param bearingDegrees The initial bearing in degrees, clockwise with north as 0
|
|
88
72
|
* @returns The position reached, `[lng, lat]` in degrees
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```ts
|
|
92
|
-
* import { destinationPoint } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
93
|
-
*
|
|
94
|
-
* // 1 km due east of Tokyo Station
|
|
95
|
-
* destinationPoint([139.767, 35.681], 1000, 90); // [139.77807..., 35.68099...]
|
|
96
|
-
* ```
|
|
97
73
|
*/
|
|
98
74
|
export function destinationPoint(origin, distanceMeters, bearingDegrees) {
|
|
99
75
|
const [lng, lat] = origin;
|
|
@@ -4,47 +4,32 @@
|
|
|
4
4
|
* The boolean operations run on polygon-clipping, which reports a failure by throwing an
|
|
5
5
|
* Error whose message is its own internal wording (a sweep-line event, a segment id). Such
|
|
6
6
|
* a failure leaves the module as a GeometryError instead: the reason is a stable code the
|
|
7
|
-
* caller can branch on, and the original error is kept as `cause` for diagnosis.
|
|
7
|
+
* caller can branch on, and the original error is kept as `cause` for diagnosis. An input
|
|
8
|
+
* whose shape a function cannot take leaves as a GeometryError too.
|
|
8
9
|
*/
|
|
9
10
|
/**
|
|
10
|
-
* Why a geometry
|
|
11
|
-
*
|
|
12
|
-
* - `invalid-input`: the input is not a polygon the operation can take (a degenerate
|
|
13
|
-
* segment, a malformed ring)
|
|
14
|
-
* - `unclosed-ring`: the output ring could not be closed, typically because edges nearly
|
|
15
|
-
* coincide within floating-point precision (still failing after the retry on the grid)
|
|
16
|
-
* - `too-complex`: the operation gave up on an input too large or tangled for it
|
|
17
|
-
* - `internal`: any other failure inside the boolean operation engine
|
|
18
|
-
*/
|
|
19
|
-
export type GeometryErrorCode = 'invalid-input' | 'unclosed-ring' | 'too-complex' | 'internal';
|
|
20
|
-
/**
|
|
21
|
-
* The boolean operation that failed.
|
|
22
|
-
*
|
|
23
|
-
* It can differ from the function called: {@link normalizeArea} and {@link unionAll} run
|
|
24
|
-
* `union`, and {@link buffer} runs `union` and `difference`.
|
|
11
|
+
* Why a geometry function failed: `invalid-input` for an input whose shape the function cannot
|
|
12
|
+
* take, `engine-failure` for a boolean operation that could not compute a result.
|
|
25
13
|
*/
|
|
26
|
-
export type
|
|
14
|
+
export type GeometryErrorCode = 'invalid-input' | 'engine-failure';
|
|
27
15
|
/**
|
|
28
|
-
* The error a geometry
|
|
29
|
-
* result.
|
|
16
|
+
* The error a geometry function throws for an input it cannot take or when its boolean
|
|
17
|
+
* operation cannot compute a result.
|
|
30
18
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* 0.1 mm); this error is thrown only when the retry fails too. Branch on `code`, which is
|
|
35
|
-
* stable across versions of the engine; the message is `<operation>: <reason>` in English
|
|
36
|
-
* and is meant for logs.
|
|
19
|
+
* A failure of a boolean operation is first retried once with the coordinates rounded to a
|
|
20
|
+
* 1e-9 degree grid (about 0.1 mm); the error is thrown only when the retry fails too. Branch
|
|
21
|
+
* on `code`; the message is `<operation>: <reason>` in English and is meant for logs.
|
|
37
22
|
*
|
|
38
23
|
* @example
|
|
39
24
|
* ```ts
|
|
40
|
-
* import type {
|
|
25
|
+
* import type { Polygon } from 'geojson';
|
|
41
26
|
* import { GeometryError, union } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
42
27
|
*
|
|
43
|
-
* function tryMerge(a:
|
|
28
|
+
* function tryMerge(a: Polygon, b: Polygon) {
|
|
44
29
|
* try {
|
|
45
|
-
* return union(a, b);
|
|
30
|
+
* return union([a, b]);
|
|
46
31
|
* } catch (error) {
|
|
47
|
-
* if (error instanceof GeometryError && error.code === '
|
|
32
|
+
* if (error instanceof GeometryError && error.code === 'engine-failure') {
|
|
48
33
|
* // Keep the inputs as they are and tell the user the merge failed
|
|
49
34
|
* return null;
|
|
50
35
|
* }
|
|
@@ -54,21 +39,21 @@ export type GeometryOperation = 'union' | 'difference' | 'intersection';
|
|
|
54
39
|
* ```
|
|
55
40
|
*/
|
|
56
41
|
export declare class GeometryError extends Error {
|
|
57
|
-
/** Why the
|
|
42
|
+
/** Why the function failed */
|
|
58
43
|
readonly code: GeometryErrorCode;
|
|
59
|
-
/** The
|
|
60
|
-
readonly operation:
|
|
61
|
-
/** The error
|
|
44
|
+
/** The name of the function that failed, such as `union` or `buffer` */
|
|
45
|
+
readonly operation: string;
|
|
46
|
+
/** The error that caused this one, kept for diagnosis */
|
|
62
47
|
readonly cause: unknown;
|
|
63
48
|
/**
|
|
64
49
|
* Creates the error. The library creates it; a caller only needs to catch it.
|
|
65
50
|
*
|
|
66
|
-
* @param code Why the
|
|
67
|
-
* @param operation The
|
|
51
|
+
* @param code Why the function failed
|
|
52
|
+
* @param operation The name of the function that failed
|
|
68
53
|
* @param message The message, `<operation>: <reason>`
|
|
69
54
|
* @param options The original error as `cause`
|
|
70
55
|
*/
|
|
71
|
-
constructor(code: GeometryErrorCode, operation:
|
|
56
|
+
constructor(code: GeometryErrorCode, operation: string, message: string, options?: {
|
|
72
57
|
cause?: unknown;
|
|
73
58
|
});
|
|
74
59
|
}
|
package/dist/geometry/errors.js
CHANGED
|
@@ -1,26 +1,23 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
/**
|
|
4
|
-
* The error a geometry
|
|
5
|
-
* result.
|
|
4
|
+
* The error a geometry function throws for an input it cannot take or when its boolean
|
|
5
|
+
* operation cannot compute a result.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* 0.1 mm); this error is thrown only when the retry fails too. Branch on `code`, which is
|
|
11
|
-
* stable across versions of the engine; the message is `<operation>: <reason>` in English
|
|
12
|
-
* and is meant for logs.
|
|
7
|
+
* A failure of a boolean operation is first retried once with the coordinates rounded to a
|
|
8
|
+
* 1e-9 degree grid (about 0.1 mm); the error is thrown only when the retry fails too. Branch
|
|
9
|
+
* on `code`; the message is `<operation>: <reason>` in English and is meant for logs.
|
|
13
10
|
*
|
|
14
11
|
* @example
|
|
15
12
|
* ```ts
|
|
16
|
-
* import type {
|
|
13
|
+
* import type { Polygon } from 'geojson';
|
|
17
14
|
* import { GeometryError, union } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
18
15
|
*
|
|
19
|
-
* function tryMerge(a:
|
|
16
|
+
* function tryMerge(a: Polygon, b: Polygon) {
|
|
20
17
|
* try {
|
|
21
|
-
* return union(a, b);
|
|
18
|
+
* return union([a, b]);
|
|
22
19
|
* } catch (error) {
|
|
23
|
-
* if (error instanceof GeometryError && error.code === '
|
|
20
|
+
* if (error instanceof GeometryError && error.code === 'engine-failure') {
|
|
24
21
|
* // Keep the inputs as they are and tell the user the merge failed
|
|
25
22
|
* return null;
|
|
26
23
|
* }
|
|
@@ -33,28 +30,28 @@ export class GeometryError extends Error {
|
|
|
33
30
|
/**
|
|
34
31
|
* Creates the error. The library creates it; a caller only needs to catch it.
|
|
35
32
|
*
|
|
36
|
-
* @param code Why the
|
|
37
|
-
* @param operation The
|
|
33
|
+
* @param code Why the function failed
|
|
34
|
+
* @param operation The name of the function that failed
|
|
38
35
|
* @param message The message, `<operation>: <reason>`
|
|
39
36
|
* @param options The original error as `cause`
|
|
40
37
|
*/
|
|
41
38
|
constructor(code, operation, message, options) {
|
|
42
39
|
super(message);
|
|
43
|
-
/** Why the
|
|
40
|
+
/** Why the function failed */
|
|
44
41
|
Object.defineProperty(this, "code", {
|
|
45
42
|
enumerable: true,
|
|
46
43
|
configurable: true,
|
|
47
44
|
writable: true,
|
|
48
45
|
value: void 0
|
|
49
46
|
});
|
|
50
|
-
/** The
|
|
47
|
+
/** The name of the function that failed, such as `union` or `buffer` */
|
|
51
48
|
Object.defineProperty(this, "operation", {
|
|
52
49
|
enumerable: true,
|
|
53
50
|
configurable: true,
|
|
54
51
|
writable: true,
|
|
55
52
|
value: void 0
|
|
56
53
|
});
|
|
57
|
-
/** The error
|
|
54
|
+
/** The error that caused this one, kept for diagnosis */
|
|
58
55
|
Object.defineProperty(this, "cause", {
|
|
59
56
|
enumerable: true,
|
|
60
57
|
configurable: true,
|
|
@@ -70,7 +67,8 @@ export class GeometryError extends Error {
|
|
|
70
67
|
/**
|
|
71
68
|
* Classifies an error thrown by polygon-clipping by its message
|
|
72
69
|
*
|
|
73
|
-
* The messages are those of polygon-clipping 0.15
|
|
70
|
+
* The messages are those of polygon-clipping 0.15. An input it rejects is `invalid-input`;
|
|
71
|
+
* everything else is `engine-failure`.
|
|
74
72
|
*/
|
|
75
73
|
function classify(error) {
|
|
76
74
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -78,20 +76,12 @@ function classify(error) {
|
|
|
78
76
|
message.startsWith('Tried to create degenerate segment')) {
|
|
79
77
|
return 'invalid-input';
|
|
80
78
|
}
|
|
81
|
-
|
|
82
|
-
return 'unclosed-ring';
|
|
83
|
-
}
|
|
84
|
-
if (message.startsWith('Infinite loop')) {
|
|
85
|
-
return 'too-complex';
|
|
86
|
-
}
|
|
87
|
-
return 'internal';
|
|
79
|
+
return 'engine-failure';
|
|
88
80
|
}
|
|
89
|
-
/** The message of each reason */
|
|
81
|
+
/** The message of each reason of a boolean operation */
|
|
90
82
|
const MESSAGES = {
|
|
91
83
|
'invalid-input': 'the input is not a valid polygon',
|
|
92
|
-
'
|
|
93
|
-
'too-complex': 'the input is too complex',
|
|
94
|
-
internal: 'the boolean operation failed',
|
|
84
|
+
'engine-failure': 'the boolean operation failed',
|
|
95
85
|
};
|
|
96
86
|
/**
|
|
97
87
|
* Wraps an error thrown by polygon-clipping into a GeometryError
|
|
@@ -102,3 +92,33 @@ export function toGeometryError(error, operation) {
|
|
|
102
92
|
const code = classify(error);
|
|
103
93
|
return new GeometryError(code, operation, `${operation}: ${MESSAGES[code]}`, { cause: error });
|
|
104
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Creates the error for an input whose shape a function cannot take
|
|
97
|
+
*
|
|
98
|
+
* @internal
|
|
99
|
+
*/
|
|
100
|
+
export function invalidInput(operation, reason) {
|
|
101
|
+
return new GeometryError('invalid-input', operation, `${operation}: ${reason}`);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Runs a computation and renames the function of a GeometryError it throws
|
|
105
|
+
*
|
|
106
|
+
* The boolean operations name themselves (`union`, `difference`, `intersection`); a public
|
|
107
|
+
* function that runs them reports its own name instead, keeping the reason and the cause.
|
|
108
|
+
*
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
export function withOperation(operation, run) {
|
|
112
|
+
try {
|
|
113
|
+
return run();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof GeometryError && error.operation !== operation) {
|
|
117
|
+
const reason = error.message.slice(error.message.indexOf(': ') + 2);
|
|
118
|
+
throw new GeometryError(error.code, operation, `${operation}: ${reason}`, {
|
|
119
|
+
cause: error.cause,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GeoJSON input and output of the public functions
|
|
3
|
+
*
|
|
4
|
+
* The public functions take GeoJSON geometries, or anything that carries one in a `geometry`
|
|
5
|
+
* field (GeoJSON features, the features of the drawing), and return GeoJSON geometries;
|
|
6
|
+
* the computations underneath work on coordinate arrays. These helpers take the coordinates
|
|
7
|
+
* out of an input, reject an input whose shape a function cannot take with a GeometryError
|
|
8
|
+
* (`invalid-input`), and wrap the computed coordinates back into a geometry.
|
|
9
|
+
*/
|
|
10
|
+
import type { Geometry, LineString, MultiLineString, MultiPolygon, Point, Polygon, Position } from 'geojson';
|
|
11
|
+
import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates } from './types.js';
|
|
12
|
+
/** A point as taken by the public functions */
|
|
13
|
+
export type PointInput = Position | Point;
|
|
14
|
+
/** A polygon as taken by the public functions */
|
|
15
|
+
export type AreaInput = Polygon | MultiPolygon | {
|
|
16
|
+
readonly geometry: Geometry;
|
|
17
|
+
};
|
|
18
|
+
/** A line as taken by the public functions */
|
|
19
|
+
export type LineInput = LineString | MultiLineString | {
|
|
20
|
+
readonly geometry: Geometry;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Returns the geometry of a geometry, or of anything that carries one in a `geometry` field
|
|
24
|
+
* (a GeoJSON feature, a feature of the drawing)
|
|
25
|
+
*
|
|
26
|
+
* @throws GeometryError (`invalid-input`) for a value that is neither, and for a feature
|
|
27
|
+
* without a geometry
|
|
28
|
+
*/
|
|
29
|
+
export declare function geometryOf(input: Geometry | {
|
|
30
|
+
readonly geometry: Geometry;
|
|
31
|
+
}, operation: string): Geometry;
|
|
32
|
+
/**
|
|
33
|
+
* Returns the coordinates of a point given as a position or a Point
|
|
34
|
+
*
|
|
35
|
+
* @throws GeometryError (`invalid-input`) for anything else
|
|
36
|
+
*/
|
|
37
|
+
export declare function positionOf(input: PointInput, operation: string): Coordinate;
|
|
38
|
+
/**
|
|
39
|
+
* Returns the geometry of a Polygon or a MultiPolygon, given as it is or in a feature
|
|
40
|
+
*
|
|
41
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
42
|
+
*/
|
|
43
|
+
export declare function areaGeometryOf(input: AreaInput, operation: string): Polygon | MultiPolygon;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the coordinates of a Polygon or a MultiPolygon, given as it is or in a feature
|
|
46
|
+
*
|
|
47
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
48
|
+
*/
|
|
49
|
+
export declare function areaOf(input: AreaInput, operation: string): AreaCoordinates;
|
|
50
|
+
/**
|
|
51
|
+
* Returns the coordinates of each polygon in an array
|
|
52
|
+
*
|
|
53
|
+
* @throws GeometryError (`invalid-input`) for a value that is not an array, and for an
|
|
54
|
+
* element that is not a Polygon or a MultiPolygon
|
|
55
|
+
*/
|
|
56
|
+
export declare function areasOf(inputs: readonly AreaInput[], operation: string): AreaCoordinates[];
|
|
57
|
+
/**
|
|
58
|
+
* Returns the coordinates of a LineString, given as it is or in a feature
|
|
59
|
+
*
|
|
60
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
61
|
+
*/
|
|
62
|
+
export declare function lineOf(input: LineString | {
|
|
63
|
+
readonly geometry: Geometry;
|
|
64
|
+
}, operation: string): Coordinate[];
|
|
65
|
+
/**
|
|
66
|
+
* Returns the lines of a LineString or a MultiLineString, given as it is or in a feature
|
|
67
|
+
*
|
|
68
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
69
|
+
*/
|
|
70
|
+
export declare function linesOf(input: LineInput, operation: string): Coordinate[][];
|
|
71
|
+
/** Every position of a geometry, the members of a collection included */
|
|
72
|
+
export declare function positionsOf(geometry: Geometry): Coordinate[];
|
|
73
|
+
/** A copy of a position, as returned by the public functions */
|
|
74
|
+
export declare function toPosition(coordinate: Coordinate): Position;
|
|
75
|
+
/** A Point geometry at a position */
|
|
76
|
+
export declare function toPoint(coordinate: Coordinate): Point;
|
|
77
|
+
/**
|
|
78
|
+
* Wraps MultiPolygon coordinates into a geometry: a Polygon for one part, a MultiPolygon for
|
|
79
|
+
* several, and null for none
|
|
80
|
+
*/
|
|
81
|
+
export declare function toAreaGeometry(coordinates: MultiPolygonCoordinates): Polygon | MultiPolygon | null;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { invalidInput } from './errors.js';
|
|
4
|
+
/** The geometry types that carry `coordinates` */
|
|
5
|
+
const COORDINATE_TYPES = new Set([
|
|
6
|
+
'Point',
|
|
7
|
+
'MultiPoint',
|
|
8
|
+
'LineString',
|
|
9
|
+
'MultiLineString',
|
|
10
|
+
'Polygon',
|
|
11
|
+
'MultiPolygon',
|
|
12
|
+
]);
|
|
13
|
+
function isObject(value) {
|
|
14
|
+
return typeof value === 'object' && value !== null;
|
|
15
|
+
}
|
|
16
|
+
/** Whether a value is an array whose first two elements are numbers */
|
|
17
|
+
function isPosition(value) {
|
|
18
|
+
return (Array.isArray(value) &&
|
|
19
|
+
value.length >= 2 &&
|
|
20
|
+
typeof value[0] === 'number' &&
|
|
21
|
+
typeof value[1] === 'number');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns the geometry of a geometry, or of anything that carries one in a `geometry` field
|
|
25
|
+
* (a GeoJSON feature, a feature of the drawing)
|
|
26
|
+
*
|
|
27
|
+
* @throws GeometryError (`invalid-input`) for a value that is neither, and for a feature
|
|
28
|
+
* without a geometry
|
|
29
|
+
*/
|
|
30
|
+
export function geometryOf(input, operation) {
|
|
31
|
+
const value = input;
|
|
32
|
+
if (!isObject(value)) {
|
|
33
|
+
throw invalidInput(operation, 'the input is not a geometry or a feature');
|
|
34
|
+
}
|
|
35
|
+
if (!isGeometryType(value.type)) {
|
|
36
|
+
if (!('geometry' in value) && value.type !== 'Feature') {
|
|
37
|
+
throw invalidInput(operation, 'the input is not a geometry or a feature');
|
|
38
|
+
}
|
|
39
|
+
const geometry = value.geometry;
|
|
40
|
+
if (!isObject(geometry) || !isGeometryType(geometry.type)) {
|
|
41
|
+
throw invalidInput(operation, 'the feature has no geometry');
|
|
42
|
+
}
|
|
43
|
+
return geometryOf(geometry, operation);
|
|
44
|
+
}
|
|
45
|
+
if (value.type === 'GeometryCollection') {
|
|
46
|
+
if (!Array.isArray(value.geometries)) {
|
|
47
|
+
throw invalidInput(operation, 'the geometry collection has no geometries');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (!Array.isArray(value.coordinates)) {
|
|
51
|
+
throw invalidInput(operation, 'the input is not a geometry or a feature');
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
/** Whether a value names a GeoJSON geometry type */
|
|
56
|
+
function isGeometryType(type) {
|
|
57
|
+
return typeof type === 'string' && (COORDINATE_TYPES.has(type) || type === 'GeometryCollection');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns the coordinates of a point given as a position or a Point
|
|
61
|
+
*
|
|
62
|
+
* @throws GeometryError (`invalid-input`) for anything else
|
|
63
|
+
*/
|
|
64
|
+
export function positionOf(input, operation) {
|
|
65
|
+
if (isPosition(input))
|
|
66
|
+
return input;
|
|
67
|
+
if (isObject(input) && input.type === 'Point' && isPosition(input.coordinates)) {
|
|
68
|
+
return input.coordinates;
|
|
69
|
+
}
|
|
70
|
+
throw invalidInput(operation, 'the input is not a position or a Point');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Returns the geometry of a Polygon or a MultiPolygon, given as it is or in a feature
|
|
74
|
+
*
|
|
75
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
76
|
+
*/
|
|
77
|
+
export function areaGeometryOf(input, operation) {
|
|
78
|
+
const geometry = geometryOf(input, operation);
|
|
79
|
+
if (geometry.type !== 'Polygon' && geometry.type !== 'MultiPolygon') {
|
|
80
|
+
throw invalidInput(operation, 'the input is not a Polygon or a MultiPolygon');
|
|
81
|
+
}
|
|
82
|
+
return geometry;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Returns the coordinates of a Polygon or a MultiPolygon, given as it is or in a feature
|
|
86
|
+
*
|
|
87
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
88
|
+
*/
|
|
89
|
+
export function areaOf(input, operation) {
|
|
90
|
+
return areaGeometryOf(input, operation).coordinates;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns the coordinates of each polygon in an array
|
|
94
|
+
*
|
|
95
|
+
* @throws GeometryError (`invalid-input`) for a value that is not an array, and for an
|
|
96
|
+
* element that is not a Polygon or a MultiPolygon
|
|
97
|
+
*/
|
|
98
|
+
export function areasOf(inputs, operation) {
|
|
99
|
+
if (!Array.isArray(inputs)) {
|
|
100
|
+
throw invalidInput(operation, 'the input is not an array of polygons');
|
|
101
|
+
}
|
|
102
|
+
return inputs.map((input) => areaOf(input, operation));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Returns the coordinates of a LineString, given as it is or in a feature
|
|
106
|
+
*
|
|
107
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
108
|
+
*/
|
|
109
|
+
export function lineOf(input, operation) {
|
|
110
|
+
const geometry = geometryOf(input, operation);
|
|
111
|
+
if (geometry.type !== 'LineString') {
|
|
112
|
+
throw invalidInput(operation, 'the input is not a LineString');
|
|
113
|
+
}
|
|
114
|
+
return geometry.coordinates;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Returns the lines of a LineString or a MultiLineString, given as it is or in a feature
|
|
118
|
+
*
|
|
119
|
+
* @throws GeometryError (`invalid-input`) for any other geometry
|
|
120
|
+
*/
|
|
121
|
+
export function linesOf(input, operation) {
|
|
122
|
+
const geometry = geometryOf(input, operation);
|
|
123
|
+
if (geometry.type === 'LineString')
|
|
124
|
+
return [geometry.coordinates];
|
|
125
|
+
if (geometry.type === 'MultiLineString')
|
|
126
|
+
return geometry.coordinates;
|
|
127
|
+
throw invalidInput(operation, 'the input is not a LineString or a MultiLineString');
|
|
128
|
+
}
|
|
129
|
+
/** Every position of a geometry, the members of a collection included */
|
|
130
|
+
export function positionsOf(geometry) {
|
|
131
|
+
switch (geometry.type) {
|
|
132
|
+
case 'Point':
|
|
133
|
+
return [geometry.coordinates];
|
|
134
|
+
case 'MultiPoint':
|
|
135
|
+
case 'LineString':
|
|
136
|
+
return geometry.coordinates;
|
|
137
|
+
case 'MultiLineString':
|
|
138
|
+
case 'Polygon':
|
|
139
|
+
return geometry.coordinates.flat();
|
|
140
|
+
case 'MultiPolygon':
|
|
141
|
+
return geometry.coordinates.flat(2);
|
|
142
|
+
case 'GeometryCollection':
|
|
143
|
+
return geometry.geometries.flatMap(positionsOf);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** A copy of a position, as returned by the public functions */
|
|
147
|
+
export function toPosition(coordinate) {
|
|
148
|
+
return [coordinate[0], coordinate[1]];
|
|
149
|
+
}
|
|
150
|
+
/** A Point geometry at a position */
|
|
151
|
+
export function toPoint(coordinate) {
|
|
152
|
+
return { type: 'Point', coordinates: toPosition(coordinate) };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Wraps MultiPolygon coordinates into a geometry: a Polygon for one part, a MultiPolygon for
|
|
156
|
+
* several, and null for none
|
|
157
|
+
*/
|
|
158
|
+
export function toAreaGeometry(coordinates) {
|
|
159
|
+
if (coordinates.length === 0)
|
|
160
|
+
return null;
|
|
161
|
+
if (coordinates.length === 1)
|
|
162
|
+
return { type: 'Polygon', coordinates: coordinates[0] };
|
|
163
|
+
return { type: 'MultiPolygon', coordinates };
|
|
164
|
+
}
|
package/dist/geometry/index.d.ts
CHANGED
|
@@ -1,28 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Geometry
|
|
2
|
+
* Geometry calculations that need no map.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* regardless of the environment, and determinism is guaranteed by the version of the
|
|
8
|
-
* package.
|
|
4
|
+
* Measure lengths and areas, build circles and buffers, combine polygons, test whether a
|
|
5
|
+
* point lies in a polygon, and tidy shapes. They also work in code that does not use the
|
|
6
|
+
* drawing engine (workers, servers, tests).
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { area, buffer, union } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
10
|
+
*
|
|
11
|
+
* const a = draw.features.get('park');
|
|
12
|
+
* const b = draw.features.get('lake');
|
|
13
|
+
* const merged = union([a, b]); // Polygon | MultiPolygon | null
|
|
14
|
+
* const zone = buffer(merged, 300); // the area within 300 m
|
|
15
|
+
* console.log(area(zone) / 1e6, 'km²');
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* The functions take GeoJSON geometries, or anything with a `geometry` field whose geometry
|
|
19
|
+
* they use (GeoJSON features and the features of the drawing), and return GeoJSON geometries. Lengths, distances, radii and tolerances are in meters, areas in
|
|
20
|
+
* square meters, and bearings and coordinates in degrees. An input whose shape a function
|
|
21
|
+
* cannot take throws a {@link GeometryError}; a computation whose result is empty returns null.
|
|
22
|
+
* Crossing the ±180 degree meridian and the vicinity of the poles are out of scope.
|
|
23
|
+
*
|
|
24
|
+
* Read next: the guide
|
|
25
|
+
* [snapping and geometry](https://sakuzu.github.io/maplibre-gl-draw/guides/snapping-geometry),
|
|
26
|
+
* which also shows the operations that change the drawing (`draw.features.union` and the
|
|
27
|
+
* rest). The functions used most are {@link area}, {@link length}, {@link buffer} and
|
|
28
|
+
* {@link union}.
|
|
29
|
+
*
|
|
30
|
+
* @module geometry
|
|
12
31
|
*/
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export
|
|
17
|
-
export {
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export {
|
|
21
|
-
export type { GeometryErrorCode
|
|
32
|
+
export { along, area, bearing, centroid, destination, distance, length, midpoint, nearestPointOnLine, perimeter, pointOnSurface, } from './public-measure.js';
|
|
33
|
+
export { buffer, circle } from './public-create.js';
|
|
34
|
+
export { difference, intersection, split, union } from './public-combine.js';
|
|
35
|
+
export { bboxContains, bboxIntersects } from './bbox.js';
|
|
36
|
+
export { contains, overlaps, pointInPolygon } from './public-predicates.js';
|
|
37
|
+
export { makeValid, rewind, simplify } from './public-repair.js';
|
|
38
|
+
export { bbox } from './public-bounds.js';
|
|
39
|
+
export { metersToDegrees } from './units.js';
|
|
40
|
+
export type { GeometryErrorCode } from './errors.js';
|
|
22
41
|
export { GeometryError } from './errors.js';
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
25
|
-
export { isRingClockwise, normalizeMultiPolygonOrientation, normalizePolygonOrientation, normalizeRingOrientation, signedRingArea, simplify, } from './simplify.js';
|
|
26
|
-
export { segmentIntersection, splitArea } from './split.js';
|
|
27
|
-
export type { AreaCoordinates, BBox, Coordinate, GeometryInput, LineStringGeometry, MultiLineStringGeometry, MultiPointGeometry, MultiPolygonCoordinates, MultiPolygonGeometry, PointGeometry, PolygonCoordinates, PolygonGeometry, Ring, } from './types.js';
|
|
28
|
-
export { EARTH_RADIUS_METERS, toDegrees, toRadians } from './units.js';
|
|
42
|
+
export type { BBox } from './types.js';
|
|
43
|
+
export { EARTH_RADIUS_METERS } from './units.js';
|