@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
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import { commitResult, emitApplied } from './apply.js';
|
|
4
|
-
import { currentSelectionIds, isAreaFeature, resolveTargetFeatures, toAreaCoordinates, toResultGeometry, } from './targets.js';
|
|
5
|
-
/**
|
|
6
|
-
* The common path that runs an operation on the area types and replaces the inputs with the
|
|
7
|
-
* result.
|
|
8
|
-
*
|
|
9
|
-
* @param inputs The targets ordered in z order (the tail is the frontmost)
|
|
10
|
-
* @param compute The geometric operation that receives the area coordinates in the same order
|
|
11
|
-
* as inputs and returns the result
|
|
12
|
-
*/
|
|
13
|
-
export function runAreaOperation(deps, operation, inputs, compute) {
|
|
14
|
-
const inputIds = inputs.map((feature) => feature.id);
|
|
15
|
-
const areas = [];
|
|
16
|
-
for (const feature of inputs) {
|
|
17
|
-
const area = toAreaCoordinates(feature);
|
|
18
|
-
if (area === null)
|
|
19
|
-
return null;
|
|
20
|
-
areas.push(area);
|
|
21
|
-
}
|
|
22
|
-
const geometry = toResultGeometry(compute(areas));
|
|
23
|
-
if (geometry === null) {
|
|
24
|
-
// An empty result (an intersection that does not overlap, a punch-out where everything was
|
|
25
|
-
// subtracted). The inputs are not changed at all; only the notification is emitted.
|
|
26
|
-
emitApplied(deps.eventEmitter, {
|
|
27
|
-
operation,
|
|
28
|
-
inputIds,
|
|
29
|
-
resultId: null,
|
|
30
|
-
resultIds: [],
|
|
31
|
-
status: 'empty',
|
|
32
|
-
});
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
// The style, the properties and the placement are inherited from the frontmost input.
|
|
36
|
-
const anchor = inputs[inputs.length - 1];
|
|
37
|
-
const resultId = commitResult(deps, { anchor, removedIds: inputIds, geometry });
|
|
38
|
-
emitApplied(deps.eventEmitter, {
|
|
39
|
-
operation,
|
|
40
|
-
inputIds,
|
|
41
|
-
resultId,
|
|
42
|
-
resultIds: [resultId],
|
|
43
|
-
status: 'applied',
|
|
44
|
-
});
|
|
45
|
-
return resultId;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Resolves the targets of subtract.
|
|
49
|
-
*
|
|
50
|
-
* When targetId is omitted, it is "subtract the group of frontmost features from the backmost
|
|
51
|
-
* one". When it is given explicitly, that feature is added to the targets even if it is not
|
|
52
|
-
* included in the list of targets (ids / the selection).
|
|
53
|
-
*/
|
|
54
|
-
export function resolveSubtractInputs(store, targetId, ids) {
|
|
55
|
-
const baseIds = ids ?? currentSelectionIds(store);
|
|
56
|
-
const wanted = targetId === undefined ? baseIds : [...new Set([targetId, ...baseIds])];
|
|
57
|
-
const inputs = resolveTargetFeatures(store, wanted, isAreaFeature);
|
|
58
|
-
if (inputs.length < 2)
|
|
59
|
-
return null;
|
|
60
|
-
// By default the backmost in z order is the side that is subtracted from.
|
|
61
|
-
const targetIndex = targetId === undefined ? 0 : inputs.findIndex((feature) => feature.id === targetId);
|
|
62
|
-
if (targetIndex < 0)
|
|
63
|
-
return null;
|
|
64
|
-
return { inputs, targetIndex };
|
|
65
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The option and dependency types of the draw.geometry namespace
|
|
3
|
-
*/
|
|
4
|
-
import type { EventEmitter } from '../../shared/utils/event-emitter.js';
|
|
5
|
-
import type { Store } from '../../store/store.js';
|
|
6
|
-
/**
|
|
7
|
-
* The options of `draw.geometry.buffer` (see {@link GeometryOperations.buffer})
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* draw.geometry.buffer({ distanceMeters: 250, segments: 32 });
|
|
12
|
-
* ```
|
|
13
|
-
*/
|
|
14
|
-
export interface GeometryBufferOptions {
|
|
15
|
-
/**
|
|
16
|
-
* The buffer distance (in meters). A negative value shrinks (area types only); 0 or a value
|
|
17
|
-
* that is not finite does nothing
|
|
18
|
-
*/
|
|
19
|
-
distanceMeters: number;
|
|
20
|
-
/**
|
|
21
|
-
* The number of segments of a full circle for the rounded parts (64 by default). It is
|
|
22
|
-
* rounded down and clamped to 3-1024
|
|
23
|
-
*/
|
|
24
|
-
segments?: number;
|
|
25
|
-
}
|
|
26
|
-
/** The dependencies of the geometry operations (a bare Store is enough for tests) */
|
|
27
|
-
export interface GeometryApiDeps {
|
|
28
|
-
store: Store;
|
|
29
|
-
eventEmitter: EventEmitter;
|
|
30
|
-
generateFeatureId: () => string;
|
|
31
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import type { MapLibreGLDraw } from './api.js';
|
|
2
|
-
import type { GeometryApiDeps, GeometryBufferOptions } from './geometry/types.js';
|
|
3
|
-
export type { GeometryApiDeps, GeometryBufferOptions } from './geometry/types.js';
|
|
4
|
-
/**
|
|
5
|
-
* The geometry operations of a draw instance, reached as `draw.geometry`.
|
|
6
|
-
*
|
|
7
|
-
* When the arguments are omitted, the current feature selection is the target (a group or
|
|
8
|
-
* layer selection gives no target). Locked features (either the feature itself, the group it
|
|
9
|
-
* belongs to, or the layer it belongs to) and hidden features (by the shared visible flag or
|
|
10
|
-
* by local hiding) are excluded from the targets, and nothing happens while read-only.
|
|
11
|
-
*
|
|
12
|
-
* Each operation is one transaction, so one undo reverts it, and the result features become
|
|
13
|
-
* selected. When it ran, `draw.geometry.applied` reports the inputs and the results, with
|
|
14
|
-
* `status: 'empty'` when the result had no area and nothing changed. The computation is done
|
|
15
|
-
* by the pure functions of `@sakuzu/maplibre-gl-draw/geometry`.
|
|
16
|
-
*
|
|
17
|
-
* The boolean editing operations (union / subtract / intersect) take the area types
|
|
18
|
-
* (Polygon / MultiPolygon / Circle) and need at least two targets. They replace the inputs
|
|
19
|
-
* with one feature, a Polygon or else a MultiPolygon (a Circle becomes a 64-segment polygon
|
|
20
|
-
* first), which takes the style, the properties and the place of the frontmost input. The
|
|
21
|
-
* buffer and the split instead return an array of IDs, since they can create several
|
|
22
|
-
* features.
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* draw.on('draw.geometry.applied', ({ operation, status, resultIds }) => {
|
|
27
|
-
* if (status === 'empty') console.log(operation, 'left nothing');
|
|
28
|
-
* });
|
|
29
|
-
* const merged = draw.geometry.union(); // the selected areas
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export interface GeometryOperations {
|
|
33
|
-
/**
|
|
34
|
-
* Merges the targets into a single feature.
|
|
35
|
-
*
|
|
36
|
-
* Areas that do not touch give a MultiPolygon.
|
|
37
|
-
*
|
|
38
|
-
* @param ids The IDs of the target features. When omitted, the current selection
|
|
39
|
-
* @returns The ID of the result feature. null when there are fewer than 2 targets
|
|
40
|
-
* @throws {@link geometry!GeometryError} when the computation fails on the input (a degenerate or
|
|
41
|
-
* malformed ring, for example); nothing changes
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```typescript
|
|
45
|
-
* const id = draw.geometry.union([parcelA, parcelB]);
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
union(ids?: string[]): string | null;
|
|
49
|
-
/**
|
|
50
|
-
* Punches out: subtracts the other targets from the target.
|
|
51
|
-
*
|
|
52
|
-
* When `targetId` is given it is a target even when `ids` does not list it. The result
|
|
53
|
-
* still takes the style and the properties of the frontmost input, not of the target.
|
|
54
|
-
*
|
|
55
|
-
* @param targetId The ID of the feature that is subtracted from. When omitted, the
|
|
56
|
-
* backmost of the targets
|
|
57
|
-
* @param ids The IDs of the target features. When omitted, the current selection
|
|
58
|
-
* @returns The ID of the result feature. null when there are fewer than 2 targets or the
|
|
59
|
-
* result is empty
|
|
60
|
-
* @throws {@link geometry!GeometryError} when the computation fails on the input; nothing changes
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```typescript
|
|
64
|
-
* // Subtract the selected features in front from the backmost one
|
|
65
|
-
* draw.geometry.subtract();
|
|
66
|
-
* // Name the feature to subtract from
|
|
67
|
-
* draw.geometry.subtract(parcelId, [parcelId, roadId]);
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
subtract(targetId?: string, ids?: string[]): string | null;
|
|
71
|
-
/**
|
|
72
|
-
* Keeps the part that is common to all the targets.
|
|
73
|
-
*
|
|
74
|
-
* @param ids The IDs of the target features. When omitted, the current selection
|
|
75
|
-
* @returns The ID of the result feature. null when there are fewer than 2 targets or they
|
|
76
|
-
* do not overlap
|
|
77
|
-
* @throws {@link geometry!GeometryError} when the computation fails on the input; nothing changes
|
|
78
|
-
*
|
|
79
|
-
* @example
|
|
80
|
-
* ```typescript
|
|
81
|
-
* const id = draw.geometry.intersect();
|
|
82
|
-
* if (id === null) {
|
|
83
|
-
* // no overlap, or fewer than two targets
|
|
84
|
-
* }
|
|
85
|
-
* ```
|
|
86
|
-
*/
|
|
87
|
-
intersect(ids?: string[]): string | null;
|
|
88
|
-
/**
|
|
89
|
-
* Creates the area within the given distance of the targets as new features.
|
|
90
|
-
*
|
|
91
|
-
* The inputs remain, and one result is created per input, just in front of it, with its
|
|
92
|
-
* style and properties. The targets are all geometries
|
|
93
|
-
* (Point / MultiPoint / LineString / MultiLineString / Polygon / MultiPolygon / Circle),
|
|
94
|
-
* and every other type is excluded from the targets. It works from a single target.
|
|
95
|
-
* A negative value (shrinking) applies to the area types only; an input that is a point or
|
|
96
|
-
* a line given a negative value produces no result, and parts of an area narrower than twice
|
|
97
|
-
* the distance disappear. A Circle stays a Circle whose radius grows or shrinks. The
|
|
98
|
-
* distance is laid out along great circles, so it holds at any latitude. A distance of 0 or
|
|
99
|
-
* one that is not finite does nothing.
|
|
100
|
-
*
|
|
101
|
-
* @param options The distance (in meters) and the number of segments
|
|
102
|
-
* @returns The IDs of the result features that were created (in z order). An empty array
|
|
103
|
-
* when nothing was created
|
|
104
|
-
* @throws {@link geometry!GeometryError} when the computation fails on the input; nothing changes
|
|
105
|
-
*
|
|
106
|
-
* @example
|
|
107
|
-
* ```typescript
|
|
108
|
-
* // The area within 100 m of the selected features
|
|
109
|
-
* const ids = draw.geometry.buffer({ distanceMeters: 100 });
|
|
110
|
-
* // Shrink two areas by 50 m
|
|
111
|
-
* draw.geometry.buffer([parcelA, parcelB], { distanceMeters: -50 });
|
|
112
|
-
* ```
|
|
113
|
-
*/
|
|
114
|
-
buffer(options: GeometryBufferOptions): string[];
|
|
115
|
-
/**
|
|
116
|
-
* Creates the area within the given distance of the named features as new features (see
|
|
117
|
-
* the other overload for the details).
|
|
118
|
-
*
|
|
119
|
-
* @param ids The IDs of the target features. When undefined, the current selection
|
|
120
|
-
* @param options The distance (in meters) and the number of segments
|
|
121
|
-
* @returns The IDs of the result features that were created (in z order). An empty array
|
|
122
|
-
* when nothing was created
|
|
123
|
-
*/
|
|
124
|
-
buffer(ids: string[] | undefined, options: GeometryBufferOptions): string[];
|
|
125
|
-
/**
|
|
126
|
-
* Cuts a polygon with a line and replaces it with the several features that result from the
|
|
127
|
-
* split.
|
|
128
|
-
*
|
|
129
|
-
* The targets are one polygon (Polygon / MultiPolygon / Circle) and one line (LineString /
|
|
130
|
-
* MultiLineString / Freehand). The side that is omitted is picked from the current
|
|
131
|
-
* selection by type; when it does not come down to exactly one of each, nothing happens and
|
|
132
|
-
* no event is emitted. The cutting line is not deleted and remains, and the results inherit
|
|
133
|
-
* the place, the style and the properties of the original polygon.
|
|
134
|
-
*
|
|
135
|
-
* When the line does not pass through the polygon (it does not intersect, it stops inside
|
|
136
|
-
* the polygon, or it only touches), nothing is changed. When the line crosses several times
|
|
137
|
-
* the polygon is split into three or more, and when only a part of a MultiPolygon is cut the
|
|
138
|
-
* parts that were not cut also become a single feature. A hole stays on the side that holds
|
|
139
|
-
* it.
|
|
140
|
-
*
|
|
141
|
-
* @param targetId The ID of the polygon feature to be cut. When omitted, the selected polygon
|
|
142
|
-
* @param lineId The ID of the line feature that cuts. When omitted, the selected line
|
|
143
|
-
* @returns The IDs of the result features that were created (in z order). An empty array
|
|
144
|
-
* when nothing was split
|
|
145
|
-
* @throws {@link geometry!GeometryError} when the computation fails on the input; nothing changes
|
|
146
|
-
*
|
|
147
|
-
* @example
|
|
148
|
-
* ```typescript
|
|
149
|
-
* // With one area and one line selected
|
|
150
|
-
* const ids = draw.geometry.split();
|
|
151
|
-
* // Or by name
|
|
152
|
-
* draw.geometry.split(parcelId, cutLineId);
|
|
153
|
-
* ```
|
|
154
|
-
*/
|
|
155
|
-
split(targetId?: string, lineId?: string): string[];
|
|
156
|
-
}
|
|
157
|
-
/** The `geometry` namespace on its own (what `createGeometryApi` returns) */
|
|
158
|
-
export type GeometryApi = Pick<MapLibreGLDraw, 'geometry'>;
|
|
159
|
-
/**
|
|
160
|
-
* Creates the draw.geometry namespace.
|
|
161
|
-
*/
|
|
162
|
-
export declare function createGeometryApi(deps: GeometryApiDeps): GeometryApi;
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* Geometry API (the draw.geometry namespace)
|
|
5
|
-
*
|
|
6
|
-
* Provides the boolean editing operations (union / subtract / intersect), the buffer (buffer)
|
|
7
|
-
* and the split (split) on the selected features. The computation itself lives in the pure
|
|
8
|
-
* functions of the geometry module (src/geometry); this file and api/geometry/ are the
|
|
9
|
-
* integration layer that connects the selection, the transactions, the spatial index and the
|
|
10
|
-
* events.
|
|
11
|
-
*
|
|
12
|
-
* This file holds the namespace and its entry checks. The steps live in api/geometry/.
|
|
13
|
-
*
|
|
14
|
-
* targets.ts which features each operation accepts, feature <-> geometry module input and
|
|
15
|
-
* result, and resolveTargetFeatures (selection / z order / lock / hidden)
|
|
16
|
-
* apply.ts the common part: applyResult places one result, commitResult wraps it in one
|
|
17
|
-
* transaction and moves the selection, emitApplied emits draw.geometry.applied
|
|
18
|
-
* boolean.ts union / subtract / intersect on the area types
|
|
19
|
-
* buffer.ts the buffer (keeps the inputs, one result per input)
|
|
20
|
-
* split.ts the split of a polygon by a line
|
|
21
|
-
* types.ts the option and dependency types
|
|
22
|
-
*/
|
|
23
|
-
import { differenceAll, intersectionAll, unionAll } from '../geometry/index.js';
|
|
24
|
-
import { resolveSubtractInputs, runAreaOperation } from './geometry/boolean.js';
|
|
25
|
-
import { runBuffer } from './geometry/buffer.js';
|
|
26
|
-
import { runSplit } from './geometry/split.js';
|
|
27
|
-
import { isAreaFeature, isBufferableFeature, isSplitLineFeature, resolveTargetFeatures, } from './geometry/targets.js';
|
|
28
|
-
/**
|
|
29
|
-
* Creates the draw.geometry namespace.
|
|
30
|
-
*/
|
|
31
|
-
export function createGeometryApi(deps) {
|
|
32
|
-
const { store } = deps;
|
|
33
|
-
// While readOnly, writes to the Store become a no-op, so an operation would report results
|
|
34
|
-
// that were never created. It is rejected at the entry point.
|
|
35
|
-
const blocked = () => store.isReadOnly();
|
|
36
|
-
return {
|
|
37
|
-
geometry: {
|
|
38
|
-
union(ids) {
|
|
39
|
-
if (blocked())
|
|
40
|
-
return null;
|
|
41
|
-
const inputs = resolveTargetFeatures(store, ids, isAreaFeature);
|
|
42
|
-
if (inputs.length < 2)
|
|
43
|
-
return null;
|
|
44
|
-
return runAreaOperation(deps, 'union', inputs, (areas) => unionAll(areas));
|
|
45
|
-
},
|
|
46
|
-
subtract(targetId, ids) {
|
|
47
|
-
if (blocked())
|
|
48
|
-
return null;
|
|
49
|
-
const resolved = resolveSubtractInputs(store, targetId, ids);
|
|
50
|
-
if (resolved === null)
|
|
51
|
-
return null;
|
|
52
|
-
const { inputs, targetIndex } = resolved;
|
|
53
|
-
return runAreaOperation(deps, 'subtract', inputs, (areas) => differenceAll(areas[targetIndex], areas.filter((_, index) => index !== targetIndex)));
|
|
54
|
-
},
|
|
55
|
-
intersect(ids) {
|
|
56
|
-
if (blocked())
|
|
57
|
-
return null;
|
|
58
|
-
const inputs = resolveTargetFeatures(store, ids, isAreaFeature);
|
|
59
|
-
if (inputs.length < 2)
|
|
60
|
-
return null;
|
|
61
|
-
return runAreaOperation(deps, 'intersect', inputs, (areas) => intersectionAll(areas));
|
|
62
|
-
},
|
|
63
|
-
buffer(idsOrOptions, maybeOptions) {
|
|
64
|
-
// It accepts the two forms buffer(options) and buffer(ids, options).
|
|
65
|
-
const ids = Array.isArray(idsOrOptions) ? idsOrOptions : undefined;
|
|
66
|
-
const options = Array.isArray(idsOrOptions) ? maybeOptions : idsOrOptions;
|
|
67
|
-
if (blocked() || options === undefined)
|
|
68
|
-
return [];
|
|
69
|
-
// A distance of 0 is "a copy of the original shape", a non-finite value is meaningless.
|
|
70
|
-
// The operation itself is not performed.
|
|
71
|
-
const { distanceMeters } = options;
|
|
72
|
-
if (!Number.isFinite(distanceMeters) || distanceMeters === 0)
|
|
73
|
-
return [];
|
|
74
|
-
const inputs = resolveTargetFeatures(store, ids, isBufferableFeature);
|
|
75
|
-
// Unlike the boolean operations, it works from a single target.
|
|
76
|
-
if (inputs.length === 0)
|
|
77
|
-
return [];
|
|
78
|
-
return runBuffer(deps, inputs, options);
|
|
79
|
-
},
|
|
80
|
-
split(targetId, lineId) {
|
|
81
|
-
if (blocked())
|
|
82
|
-
return [];
|
|
83
|
-
// The polygon and the line are resolved separately. When omitted, both are picked from
|
|
84
|
-
// the current selection by type.
|
|
85
|
-
const areas = resolveTargetFeatures(store, targetId === undefined ? undefined : [targetId], isAreaFeature);
|
|
86
|
-
const lines = resolveTargetFeatures(store, lineId === undefined ? undefined : [lineId], isSplitLineFeature);
|
|
87
|
-
// When it does not come down to exactly one polygon and one line, nothing is done.
|
|
88
|
-
if (areas.length !== 1 || lines.length !== 1)
|
|
89
|
-
return [];
|
|
90
|
-
return runSplit(deps, areas[0], lines[0]);
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
}
|
package/dist/api/group-api.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { AutoNameGenerator } from '../shared/utils/name-generator.js';
|
|
2
|
-
import type { Store } from '../store/store.js';
|
|
3
|
-
import type { MapLibreGLDraw } from './api.js';
|
|
4
|
-
export type GroupApi = Pick<MapLibreGLDraw, 'getAllGroups' | 'getGroup' | 'addGroup' | 'updateGroup' | 'deleteGroup' | 'reorderInGroup' | 'addFeatureToGroup' | 'removeFeatureFromGroup' | 'groupSelection' | 'ungroupSelection' | 'ungroupGroup'>;
|
|
5
|
-
export interface GroupApiDeps {
|
|
6
|
-
store: Store;
|
|
7
|
-
generateFeatureId: () => string;
|
|
8
|
-
autoNameGenerator: AutoNameGenerator;
|
|
9
|
-
}
|
|
10
|
-
export declare function createGroupApi(deps: GroupApiDeps): GroupApi;
|
package/dist/api/group-api.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* Group API
|
|
5
|
-
*
|
|
6
|
-
* Provides the Group CRUD and grouping operations of MapLibreGLDraw.
|
|
7
|
-
*/
|
|
8
|
-
import { addFeatureToGroup as addFeatureToGroupImpl, groupSelection as groupSelectionImpl, removeFeatureFromGroup as removeFeatureFromGroupImpl, ungroupGroup as ungroupGroupImpl, ungroupSelection as ungroupSelectionImpl, } from '../operations/layer-operations.js';
|
|
9
|
-
import { isGroupLocked } from '../store/lock.js';
|
|
10
|
-
import { onlyLockOrVisibility } from './feature-api.js';
|
|
11
|
-
export function createGroupApi(deps) {
|
|
12
|
-
const { store, generateFeatureId, autoNameGenerator } = deps;
|
|
13
|
-
return {
|
|
14
|
-
getAllGroups() {
|
|
15
|
-
return store.getAllGroups();
|
|
16
|
-
},
|
|
17
|
-
getGroup(id) {
|
|
18
|
-
return store.getGroup(id);
|
|
19
|
-
},
|
|
20
|
-
addGroup(featureIds, layerId, name) {
|
|
21
|
-
// While read-only every write below would be refused: report it as null up front
|
|
22
|
-
if (store.isReadOnly())
|
|
23
|
-
return null;
|
|
24
|
-
const id = generateFeatureId();
|
|
25
|
-
const groupName = name || autoNameGenerator.generateGroupName();
|
|
26
|
-
const group = {
|
|
27
|
-
id,
|
|
28
|
-
name: groupName,
|
|
29
|
-
featureIds: [...featureIds],
|
|
30
|
-
locked: false,
|
|
31
|
-
visible: true,
|
|
32
|
-
};
|
|
33
|
-
// Remove the features from the order of the layer
|
|
34
|
-
const layer = store.getLayer(layerId);
|
|
35
|
-
if (layer) {
|
|
36
|
-
const newOrder = layer.order.filter((itemId) => !featureIds.includes(itemId));
|
|
37
|
-
// Add the group to the order
|
|
38
|
-
newOrder.push(id);
|
|
39
|
-
store.updateLayer(layerId, { order: newOrder });
|
|
40
|
-
}
|
|
41
|
-
// Create the group (this sets groupId on the features)
|
|
42
|
-
return store.createGroup(group) ? id : null;
|
|
43
|
-
},
|
|
44
|
-
updateGroup(id, updates) {
|
|
45
|
-
const group = store.getGroup(id);
|
|
46
|
-
if (group && !onlyLockOrVisibility(updates)) {
|
|
47
|
-
// While locked (itself or its layer), reject any change other than locked/visible
|
|
48
|
-
// (full protection)
|
|
49
|
-
const findLayerOfGroup = (gid) => store.getAllLayers().find((l) => l.order.includes(gid));
|
|
50
|
-
if (isGroupLocked(group, findLayerOfGroup))
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
return store.updateGroup(id, updates);
|
|
54
|
-
},
|
|
55
|
-
deleteGroup(id) {
|
|
56
|
-
// The Store puts the features of the group in its place in the order of its layer
|
|
57
|
-
return store.deleteGroup(id);
|
|
58
|
-
},
|
|
59
|
-
reorderInGroup(featureId, groupId, newIndex) {
|
|
60
|
-
return store.reorderInGroup(featureId, groupId, newIndex);
|
|
61
|
-
},
|
|
62
|
-
addFeatureToGroup(featureId, groupId, index) {
|
|
63
|
-
addFeatureToGroupImpl(store, featureId, groupId, index);
|
|
64
|
-
},
|
|
65
|
-
removeFeatureFromGroup(featureId) {
|
|
66
|
-
removeFeatureFromGroupImpl(store, featureId);
|
|
67
|
-
},
|
|
68
|
-
groupSelection() {
|
|
69
|
-
return groupSelectionImpl(store, generateFeatureId, autoNameGenerator);
|
|
70
|
-
},
|
|
71
|
-
ungroupSelection() {
|
|
72
|
-
ungroupSelectionImpl(store);
|
|
73
|
-
},
|
|
74
|
-
ungroupGroup(groupId) {
|
|
75
|
-
ungroupGroupImpl(store, groupId);
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Constants related to Import/Export
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Version of the native format
|
|
6
|
-
*
|
|
7
|
-
* Semantic versioning. A minor version only adds fields; a major version can change the
|
|
8
|
-
* meaning of any field, and data of another major version is rejected. 2.0.0 made the
|
|
9
|
-
* stacking order (`layerOrder`) a required part of the data.
|
|
10
|
-
*/
|
|
11
|
-
export declare const NATIVE_VERSION = "2.0.0";
|
|
12
|
-
/** Prefix of the GeoJSON properties that hold this library's own data */
|
|
13
|
-
export declare const GEOJSON_PREFIX = "maplibre-gl-draw:";
|
|
14
|
-
/**
|
|
15
|
-
* The properties this library itself keeps in `Feature.properties`
|
|
16
|
-
*
|
|
17
|
-
* They are stored without a prefix in the native format, and the
|
|
18
|
-
* `maplibre-gl-draw:` prefix is added when exporting to GeoJSON. Every other property, those
|
|
19
|
-
* of the host and of extensions included, is written as a plain key. `name` and `description`
|
|
20
|
-
* are plain keys too: other GIS tools read them as the name and the description.
|
|
21
|
-
*/
|
|
22
|
-
export declare const LIBRARY_PROPERTIES: ReadonlySet<string>;
|
|
23
|
-
/**
|
|
24
|
-
* The number of decimal places the GeoJSON export keeps in a coordinate
|
|
25
|
-
*
|
|
26
|
-
* 1e-7 degrees is about 1.1 cm at the equator, finer than any edit on the map, and it keeps
|
|
27
|
-
* the file from carrying the noise digits of floating-point arithmetic (RFC 7946, 11.2).
|
|
28
|
-
*/
|
|
29
|
-
export declare const GEOJSON_COORDINATE_DECIMALS = 7;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* Constants related to Import/Export
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Version of the native format
|
|
8
|
-
*
|
|
9
|
-
* Semantic versioning. A minor version only adds fields; a major version can change the
|
|
10
|
-
* meaning of any field, and data of another major version is rejected. 2.0.0 made the
|
|
11
|
-
* stacking order (`layerOrder`) a required part of the data.
|
|
12
|
-
*/
|
|
13
|
-
export const NATIVE_VERSION = '2.0.0';
|
|
14
|
-
/** Prefix of the GeoJSON properties that hold this library's own data */
|
|
15
|
-
export const GEOJSON_PREFIX = 'maplibre-gl-draw:';
|
|
16
|
-
/**
|
|
17
|
-
* The properties this library itself keeps in `Feature.properties`
|
|
18
|
-
*
|
|
19
|
-
* They are stored without a prefix in the native format, and the
|
|
20
|
-
* `maplibre-gl-draw:` prefix is added when exporting to GeoJSON. Every other property, those
|
|
21
|
-
* of the host and of extensions included, is written as a plain key. `name` and `description`
|
|
22
|
-
* are plain keys too: other GIS tools read them as the name and the description.
|
|
23
|
-
*/
|
|
24
|
-
export const LIBRARY_PROPERTIES = new Set([
|
|
25
|
-
// Common
|
|
26
|
-
'createdZoom',
|
|
27
|
-
'rotation',
|
|
28
|
-
'scale',
|
|
29
|
-
// Image
|
|
30
|
-
'imageFileId',
|
|
31
|
-
'imageWidth',
|
|
32
|
-
'imageHeight',
|
|
33
|
-
]);
|
|
34
|
-
/**
|
|
35
|
-
* The number of decimal places the GeoJSON export keeps in a coordinate
|
|
36
|
-
*
|
|
37
|
-
* 1e-7 degrees is about 1.1 cm at the equator, finer than any edit on the map, and it keeps
|
|
38
|
-
* the file from carrying the noise digits of floating-point arithmetic (RFC 7946, 11.2).
|
|
39
|
-
*/
|
|
40
|
-
export const GEOJSON_COORDINATE_DECIMALS = 7;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generation of the export file name
|
|
3
|
-
*/
|
|
4
|
-
import type { Metadata } from '../../store/types.js';
|
|
5
|
-
/**
|
|
6
|
-
* Builds the export file name
|
|
7
|
-
*
|
|
8
|
-
* Format: `{title}_{YYYY-MM-DD}_{HHMMSS}{suffix}`
|
|
9
|
-
*/
|
|
10
|
-
export declare function buildExportFileName(metadata: Metadata, suffix: string): string;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* Replaces characters that cannot be used in a file name with underscores
|
|
5
|
-
*/
|
|
6
|
-
function sanitize(name) {
|
|
7
|
-
return name.replace(/[<>:"/\\|?*]/g, '_');
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Builds the export file name
|
|
11
|
-
*
|
|
12
|
-
* Format: `{title}_{YYYY-MM-DD}_{HHMMSS}{suffix}`
|
|
13
|
-
*/
|
|
14
|
-
export function buildExportFileName(metadata, suffix) {
|
|
15
|
-
const title = sanitize(metadata.title || 'drawing');
|
|
16
|
-
const date = new Date();
|
|
17
|
-
const dateStr = date.toISOString().slice(0, 10);
|
|
18
|
-
const timeStr = date.toTimeString().slice(0, 8).replace(/:/g, '');
|
|
19
|
-
return `${title}_${dateStr}_${timeStr}${suffix}`;
|
|
20
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Store } from '../../store/store.js';
|
|
2
|
-
import type { ExportOptions, Feature } from '../../store/types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Converts an internal Feature into a GeoJSON Feature
|
|
5
|
-
*
|
|
6
|
-
* Conforms to docs/reference/data-format.md:
|
|
7
|
-
* - includes the metadata in properties with the maplibre-gl-draw: prefix, and writes
|
|
8
|
-
* name and description as plain keys
|
|
9
|
-
* - rounds the positions and orients the rings (see the top of this file)
|
|
10
|
-
* - a Point is written out as a Point geometry
|
|
11
|
-
* - the Multi types (MultiPoint / MultiLineString / MultiPolygon) are written out as they are
|
|
12
|
-
* - an Image is written out as a Point geometry and identified by featureType
|
|
13
|
-
* - for an Image feature, the image data is embedded as Base64
|
|
14
|
-
*/
|
|
15
|
-
export declare function convertFeatureToGeoJSON(feature: Feature, store: Store): GeoJSON.Feature<GeoJSON.Geometry> | null;
|
|
16
|
-
/**
|
|
17
|
-
* Exports the current data as a GeoJSON FeatureCollection
|
|
18
|
-
*/
|
|
19
|
-
export declare function exportGeoJSON(store: Store, options?: ExportOptions): GeoJSON.FeatureCollection<GeoJSON.Geometry>;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { AutoNameGenerator } from '../../shared/utils/name-generator.js';
|
|
2
|
-
import type { Store } from '../../store/store.js';
|
|
3
|
-
import type { LoadOptions, LoadResult } from '../../store/types.js';
|
|
4
|
-
/**
|
|
5
|
-
* Imports an image file and creates an Image feature
|
|
6
|
-
*/
|
|
7
|
-
export declare function loadImage(file: File, options: LoadOptions, deps: {
|
|
8
|
-
store: Store;
|
|
9
|
-
autoNameGenerator: AutoNameGenerator;
|
|
10
|
-
generateFeatureId: () => string;
|
|
11
|
-
getCurrentLayerId: () => string;
|
|
12
|
-
}): Promise<LoadResult>;
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* Import of image files (creates an Image feature)
|
|
5
|
-
*/
|
|
6
|
-
import { processImageFile } from '../../shared/utils/image.js';
|
|
7
|
-
/**
|
|
8
|
-
* Imports an image file and creates an Image feature
|
|
9
|
-
*/
|
|
10
|
-
export async function loadImage(file, options, deps) {
|
|
11
|
-
if (!options.coordinate) {
|
|
12
|
-
throw new Error('Image files require coordinate option');
|
|
13
|
-
}
|
|
14
|
-
const { store, autoNameGenerator, generateFeatureId, getCurrentLayerId } = deps;
|
|
15
|
-
const processed = await processImageFile(file);
|
|
16
|
-
// Create the FileData
|
|
17
|
-
const fileId = generateFeatureId();
|
|
18
|
-
const fileData = {
|
|
19
|
-
id: fileId,
|
|
20
|
-
mimeType: processed.mimeType,
|
|
21
|
-
dataURL: processed.dataUrl,
|
|
22
|
-
};
|
|
23
|
-
// Create the Image feature
|
|
24
|
-
const featureId = generateFeatureId();
|
|
25
|
-
const layerId = options.layerId || getCurrentLayerId();
|
|
26
|
-
const autoName = autoNameGenerator.generateName('Image');
|
|
27
|
-
const feature = {
|
|
28
|
-
id: featureId,
|
|
29
|
-
type: 'Image',
|
|
30
|
-
coordinates: options.coordinate,
|
|
31
|
-
layerId,
|
|
32
|
-
properties: {
|
|
33
|
-
imageFileId: fileId,
|
|
34
|
-
imageWidth: processed.width,
|
|
35
|
-
imageHeight: processed.height,
|
|
36
|
-
createdZoom: options.zoom ?? 1,
|
|
37
|
-
...(autoName !== undefined && { name: autoName }),
|
|
38
|
-
},
|
|
39
|
-
locked: false,
|
|
40
|
-
visible: true,
|
|
41
|
-
};
|
|
42
|
-
// Create the file and the feature in a transaction
|
|
43
|
-
store.transact(() => {
|
|
44
|
-
store.createFile(fileData);
|
|
45
|
-
store.createFeature(feature);
|
|
46
|
-
store.setSelection('feature', [featureId]);
|
|
47
|
-
});
|
|
48
|
-
return {
|
|
49
|
-
format: 'image',
|
|
50
|
-
featureIds: [featureId],
|
|
51
|
-
replaced: false,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ExportFormat, ExportOptions, ExportResult, LoadOptions, LoadResult } from '../../store/types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Import/Export API interface
|
|
4
|
-
*/
|
|
5
|
-
export interface ImportExportAPI {
|
|
6
|
-
load(source: File | unknown, options?: LoadOptions): Promise<LoadResult>;
|
|
7
|
-
export(format: ExportFormat, options?: ExportOptions): ExportResult;
|
|
8
|
-
getSuggestedFileName(): string;
|
|
9
|
-
}
|