@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,378 +1,33 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import {
|
|
4
|
-
import { computeTracePath, isTraceEnabled, readTraceAnchor } from './trace-support.js';
|
|
5
|
-
/** Tolerance for deciding a vertex click (in pixels) */
|
|
6
|
-
const VERTEX_CLICK_TOLERANCE = 10;
|
|
3
|
+
import { createVertexDrawing } from './vertex-drawing.js';
|
|
7
4
|
/**
|
|
8
|
-
*
|
|
5
|
+
* The factory of the polygon drawing mode
|
|
9
6
|
*
|
|
10
7
|
* @internal
|
|
11
8
|
*/
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
writable: true,
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
26
|
-
Object.defineProperty(this, "context", {
|
|
27
|
-
enumerable: true,
|
|
28
|
-
configurable: true,
|
|
29
|
-
writable: true,
|
|
30
|
-
value: void 0
|
|
31
|
-
});
|
|
32
|
-
Object.defineProperty(this, "coordinates", {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
configurable: true,
|
|
35
|
-
writable: true,
|
|
36
|
-
value: []
|
|
37
|
-
});
|
|
38
|
-
Object.defineProperty(this, "isNearFirstVertex", {
|
|
39
|
-
enumerable: true,
|
|
40
|
-
configurable: true,
|
|
41
|
-
writable: true,
|
|
42
|
-
value: false
|
|
43
|
-
});
|
|
44
|
-
/** The redo stack (holds the undone vertices) */
|
|
45
|
-
Object.defineProperty(this, "redoStack", {
|
|
46
|
-
enumerable: true,
|
|
47
|
-
configurable: true,
|
|
48
|
-
writable: true,
|
|
49
|
-
value: []
|
|
50
|
-
});
|
|
51
|
-
/** The last mouse coordinate (for displaying the dashed line on undo/redo) */
|
|
52
|
-
Object.defineProperty(this, "lastMouseCoord", {
|
|
53
|
-
enumerable: true,
|
|
54
|
-
configurable: true,
|
|
55
|
-
writable: true,
|
|
56
|
-
value: null
|
|
57
|
-
});
|
|
58
|
-
/** The Feature ID that is going to be created */
|
|
59
|
-
Object.defineProperty(this, "pendingFeatureId", {
|
|
60
|
-
enumerable: true,
|
|
61
|
-
configurable: true,
|
|
62
|
-
writable: true,
|
|
63
|
-
value: null
|
|
64
|
-
});
|
|
65
|
-
/**
|
|
66
|
-
* The snap target of the previously confirmed click (the start point of the trace)
|
|
67
|
-
*
|
|
68
|
-
* It is reset to null for a click that did not snap and for a snap that cannot be traced.
|
|
69
|
-
*/
|
|
70
|
-
Object.defineProperty(this, "traceAnchor", {
|
|
71
|
-
enumerable: true,
|
|
72
|
-
configurable: true,
|
|
73
|
-
writable: true,
|
|
74
|
-
value: null
|
|
75
|
-
});
|
|
76
|
-
/**
|
|
77
|
-
* The trace path up to the cursor position (the unconfirmed vertices for the preview)
|
|
78
|
-
*
|
|
79
|
-
* They are inserted between the confirmed coordinates and the cursor point and drawn as
|
|
80
|
-
* tentative.
|
|
81
|
-
*/
|
|
82
|
-
Object.defineProperty(this, "tracePreview", {
|
|
83
|
-
enumerable: true,
|
|
84
|
-
configurable: true,
|
|
85
|
-
writable: true,
|
|
86
|
-
value: null
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
onStart(context) {
|
|
90
|
-
this.context = context;
|
|
91
|
-
// Change the cursor to a crosshair
|
|
92
|
-
this.context.map.getCanvas().style.cursor = 'crosshair';
|
|
93
|
-
// Clear the selection (not notified as a change)
|
|
94
|
-
this.context.store.transact(() => {
|
|
95
|
-
this.context.store.setSelection(null, []);
|
|
96
|
-
}, 'silent');
|
|
97
|
-
// Reset the state
|
|
98
|
-
this.coordinates = [];
|
|
99
|
-
this.isNearFirstVertex = false;
|
|
100
|
-
this.redoStack = [];
|
|
101
|
-
this.lastMouseCoord = null;
|
|
102
|
-
this.traceAnchor = null;
|
|
103
|
-
this.tracePreview = null;
|
|
104
|
-
// Generate the Feature ID in advance
|
|
105
|
-
this.pendingFeatureId = this.context.generateFeatureId();
|
|
106
|
-
}
|
|
107
|
-
onStop() {
|
|
108
|
-
// Restore the cursor
|
|
109
|
-
this.context.map.getCanvas().style.cursor = '';
|
|
110
|
-
// Clear the tentative state
|
|
111
|
-
this.context.store.setTentative(null);
|
|
112
|
-
this.coordinates = [];
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Called after an external state change
|
|
116
|
-
*
|
|
117
|
-
* Resets the state of the drawing in progress so that the next drawing operation can start
|
|
118
|
-
* normally.
|
|
119
|
-
*/
|
|
120
|
-
onExternalStateChange() {
|
|
121
|
-
// Reset the state
|
|
122
|
-
this.coordinates = [];
|
|
123
|
-
this.redoStack = [];
|
|
124
|
-
this.lastMouseCoord = null;
|
|
125
|
-
this.pendingFeatureId = null;
|
|
126
|
-
this.isNearFirstVertex = false;
|
|
127
|
-
this.traceAnchor = null;
|
|
128
|
-
this.tracePreview = null;
|
|
129
|
-
// Clear the tentative state
|
|
130
|
-
this.context.store.setTentative(null);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* A double click while drawing is two clicks of the drawing; it never zooms the map
|
|
134
|
-
* (consumed by preventing its default action)
|
|
135
|
-
*/
|
|
136
|
-
onDoubleClick(event) {
|
|
137
|
-
event.originalEvent.preventDefault();
|
|
138
|
-
}
|
|
139
|
-
onClick(event) {
|
|
140
|
-
// Complete when there are at least three points and the click is near the first vertex
|
|
141
|
-
if (this.coordinates.length >= 3 && this.isNearFirstVertex) {
|
|
142
|
-
this.finishPolygon();
|
|
143
|
-
return;
|
|
9
|
+
export const drawPolygonMode = (ctx) => createVertexDrawing(ctx, {
|
|
10
|
+
minVertices: 3,
|
|
11
|
+
// The first vertex closes the ring
|
|
12
|
+
closingVertex: () => 0,
|
|
13
|
+
preview(vertices, pointer, closable) {
|
|
14
|
+
const coordinates = pointer ? [...vertices, ...pointer] : [...vertices];
|
|
15
|
+
if (coordinates.length < 2) {
|
|
16
|
+
// One vertex shows as a marker
|
|
17
|
+
return {
|
|
18
|
+
feature: { type: 'Point', geometry: { type: 'Point', coordinates: coordinates[0] } },
|
|
19
|
+
};
|
|
144
20
|
}
|
|
145
|
-
// Read the snap target of this click and first take in the sequence of boundary vertices
|
|
146
|
-
// between it and the previously confirmed click (tracing)
|
|
147
|
-
const anchor = readTraceAnchor(this.context, event);
|
|
148
|
-
const path = computeTracePath(this.context, this.traceAnchor, anchor);
|
|
149
|
-
if (path) {
|
|
150
|
-
this.coordinates.push(...path);
|
|
151
|
-
}
|
|
152
|
-
this.traceAnchor = anchor;
|
|
153
|
-
this.tracePreview = null;
|
|
154
|
-
// Add the vertex
|
|
155
|
-
const coord = [event.lngLat.lng, event.lngLat.lat];
|
|
156
|
-
this.coordinates.push(coord);
|
|
157
|
-
// Clear the redo stack when a new vertex is added
|
|
158
|
-
this.redoStack = [];
|
|
159
|
-
// Update the tentative state
|
|
160
|
-
// Note: the redraw is triggered automatically by RenderCoordinator subscribing to Store changes
|
|
161
|
-
this.updateTentative();
|
|
162
|
-
}
|
|
163
|
-
onMouseMove(event) {
|
|
164
|
-
// Save the last mouse coordinate (for displaying the dashed line on undo/redo)
|
|
165
|
-
this.lastMouseCoord = [event.lngLat.lng, event.lngLat.lat];
|
|
166
|
-
// Check whether it is near the first vertex
|
|
167
|
-
this.isNearFirstVertex = this.checkNearFirstVertex(event.point);
|
|
168
|
-
// When the snap target of the cursor is the same feature as the previously confirmed
|
|
169
|
-
// click, hold the path that is going to be inserted as a preview
|
|
170
|
-
this.tracePreview = computeTracePath(this.context, this.traceAnchor, readTraceAnchor(this.context, event));
|
|
171
|
-
// Update the cursor
|
|
172
|
-
if (this.coordinates.length >= 3 && this.isNearFirstVertex) {
|
|
173
|
-
this.context.map.getCanvas().style.cursor = 'pointer';
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this.context.map.getCanvas().style.cursor = 'crosshair';
|
|
177
|
-
}
|
|
178
|
-
// When there is at least one vertex, display the line up to the mouse position
|
|
179
|
-
if (this.coordinates.length > 0) {
|
|
180
|
-
this.updateTentative(this.lastMouseCoord);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
onKeyDown(event) {
|
|
184
|
-
if (event.key === 'Escape') {
|
|
185
|
-
// Cancel
|
|
186
|
-
this.cancelPolygon();
|
|
187
|
-
}
|
|
188
|
-
else if (event.key === 'Enter') {
|
|
189
|
-
// Confirm
|
|
190
|
-
this.finishPolygon();
|
|
191
|
-
}
|
|
192
|
-
else if (event.key === 'Backspace' || event.key === 'Delete') {
|
|
193
|
-
// Remove the last vertex
|
|
194
|
-
this.removeLastVertex();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* The feature to prefer when snapping candidates are tied (the boundary that tracing started
|
|
199
|
-
* along)
|
|
200
|
-
*/
|
|
201
|
-
getSnapPreference() {
|
|
202
|
-
if (!this.traceAnchor || !isTraceEnabled(this.context))
|
|
203
|
-
return null;
|
|
204
21
|
return {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Checks whether it is near the first vertex
|
|
211
|
-
*/
|
|
212
|
-
checkNearFirstVertex(screenPoint) {
|
|
213
|
-
if (this.coordinates.length === 0)
|
|
214
|
-
return false;
|
|
215
|
-
const firstCoord = this.coordinates[0];
|
|
216
|
-
const firstScreenPoint = this.context.map.project(firstCoord);
|
|
217
|
-
const dx = screenPoint.x - firstScreenPoint.x;
|
|
218
|
-
const dy = screenPoint.y - firstScreenPoint.y;
|
|
219
|
-
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
220
|
-
return distance <= VERTEX_CLICK_TOLERANCE;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Confirms the polygon
|
|
224
|
-
*/
|
|
225
|
-
finishPolygon() {
|
|
226
|
-
// At least three points are required
|
|
227
|
-
if (this.coordinates.length < 3) {
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const { store, autoNameGenerator } = this.context;
|
|
231
|
-
// Discard the drawing when no layer can be written any more
|
|
232
|
-
const layerId = resolveCommitLayer(this.context);
|
|
233
|
-
if (layerId === null)
|
|
234
|
-
return;
|
|
235
|
-
// Generate the automatic name
|
|
236
|
-
const autoName = autoNameGenerator.generateName('Polygon');
|
|
237
|
-
// Create the closed ring (append the first point at the end)
|
|
238
|
-
const ring = [...this.coordinates, this.coordinates[0]];
|
|
239
|
-
// Use the ID generated in advance (generate a new one if there is none)
|
|
240
|
-
const featureId = this.pendingFeatureId ?? this.context.generateFeatureId();
|
|
241
|
-
// Create a new polygon feature
|
|
242
|
-
const feature = {
|
|
243
|
-
id: featureId,
|
|
244
|
-
type: 'Polygon',
|
|
245
|
-
coordinates: [ring],
|
|
246
|
-
layerId,
|
|
247
|
-
properties: {
|
|
248
|
-
...createdZoomProperty(this.context),
|
|
249
|
-
...(autoName !== undefined && { name: autoName }),
|
|
22
|
+
feature: {
|
|
23
|
+
type: 'Polygon',
|
|
24
|
+
geometry: { type: 'Polygon', coordinates: [[...coordinates, coordinates[0]]] },
|
|
250
25
|
},
|
|
251
|
-
|
|
252
|
-
visible: true,
|
|
26
|
+
options: { confirmedVertices: vertices.length, ...(closable && { highlightVertex: 0 }) },
|
|
253
27
|
};
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
// Select the created feature
|
|
261
|
-
store.setSelection('feature', [feature.id]);
|
|
262
|
-
});
|
|
263
|
-
// Reset the state
|
|
264
|
-
this.coordinates = [];
|
|
265
|
-
this.isNearFirstVertex = false;
|
|
266
|
-
this.pendingFeatureId = null;
|
|
267
|
-
this.traceAnchor = null;
|
|
268
|
-
this.tracePreview = null;
|
|
269
|
-
// Return to the select mode
|
|
270
|
-
this.context.setMode('select');
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Cancels the creation of the polygon
|
|
274
|
-
*/
|
|
275
|
-
cancelPolygon() {
|
|
276
|
-
if (this.coordinates.length > 0) {
|
|
277
|
-
this.coordinates = [];
|
|
278
|
-
this.pendingFeatureId = null;
|
|
279
|
-
this.traceAnchor = null;
|
|
280
|
-
this.tracePreview = null;
|
|
281
|
-
this.context.store.setTentative(null);
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
// Return to the select mode if drawing is not in progress
|
|
285
|
-
this.context.setMode('select');
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Removes the last vertex
|
|
290
|
-
*/
|
|
291
|
-
removeLastVertex() {
|
|
292
|
-
if (this.coordinates.length > 0) {
|
|
293
|
-
this.coordinates.pop();
|
|
294
|
-
// A vertex removed with Backspace/Delete cannot be redone
|
|
295
|
-
this.redoStack = [];
|
|
296
|
-
// The previously confirmed click changes, so the start point of the trace is discarded too
|
|
297
|
-
this.clearTrace();
|
|
298
|
-
this.updateTentative();
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Undoes a vertex while drawing
|
|
303
|
-
*/
|
|
304
|
-
undoVertex() {
|
|
305
|
-
if (this.coordinates.length === 0) {
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
const removed = this.coordinates.pop();
|
|
309
|
-
this.redoStack.push(removed);
|
|
310
|
-
this.clearTrace();
|
|
311
|
-
// Pass the mouse coordinate to keep the dashed line
|
|
312
|
-
this.updateTentative(this.lastMouseCoord ?? undefined);
|
|
313
|
-
return true;
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Redoes a vertex that was undone
|
|
317
|
-
*/
|
|
318
|
-
redoVertex() {
|
|
319
|
-
if (this.redoStack.length === 0) {
|
|
320
|
-
return false;
|
|
321
|
-
}
|
|
322
|
-
const restored = this.redoStack.pop();
|
|
323
|
-
this.coordinates.push(restored);
|
|
324
|
-
this.clearTrace();
|
|
325
|
-
// Pass the mouse coordinate to keep the dashed line
|
|
326
|
-
this.updateTentative(this.lastMouseCoord ?? undefined);
|
|
327
|
-
return true;
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Discards the state of the trace
|
|
331
|
-
*
|
|
332
|
-
* On an undo / redo of a vertex the "previously confirmed click" changes, so the snap target
|
|
333
|
-
* that was held as the start point is not kept in use as it is.
|
|
334
|
-
*/
|
|
335
|
-
clearTrace() {
|
|
336
|
-
this.traceAnchor = null;
|
|
337
|
-
this.tracePreview = null;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Updates the tentative state
|
|
341
|
-
*/
|
|
342
|
-
updateTentative(mouseCoord) {
|
|
343
|
-
if (this.coordinates.length === 0) {
|
|
344
|
-
this.context.store.setTentative(null);
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
// The coordinate array including the mouse position and the trace path up to it
|
|
348
|
-
// (the confirmed ones remain the leading coordinates.length entries)
|
|
349
|
-
const coords = mouseCoord
|
|
350
|
-
? [...this.coordinates, ...(this.tracePreview ?? []), mouseCoord]
|
|
351
|
-
: [...this.coordinates];
|
|
352
|
-
// Highlight it when the cursor is near the first vertex (only when it can be closed with
|
|
353
|
-
// three or more points)
|
|
354
|
-
const highlightedVertexIndex = this.coordinates.length >= 3 && this.isNearFirstVertex ? 0 : undefined;
|
|
355
|
-
// Display it as a polygon (a closed shape) when there are at least two points
|
|
356
|
-
if (coords.length >= 2) {
|
|
357
|
-
// Display it as a closed ring
|
|
358
|
-
const ring = [...coords, coords[0]];
|
|
359
|
-
this.context.store.setTentative({
|
|
360
|
-
type: 'Polygon',
|
|
361
|
-
coordinates: [ring],
|
|
362
|
-
layerId: this.context.getCurrentLayerId(),
|
|
363
|
-
confirmedCount: this.coordinates.length, // Number of confirmed coordinates (before closing)
|
|
364
|
-
highlightedVertexIndex,
|
|
365
|
-
pendingFeatureId: this.pendingFeatureId ?? undefined,
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
// Display it as a marker when there is only one point
|
|
370
|
-
this.context.store.setTentative({
|
|
371
|
-
type: 'Point',
|
|
372
|
-
coordinates: coords[0],
|
|
373
|
-
layerId: this.context.getCurrentLayerId(),
|
|
374
|
-
pendingFeatureId: this.pendingFeatureId ?? undefined,
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
28
|
+
},
|
|
29
|
+
feature: (vertices) => ({
|
|
30
|
+
type: 'Polygon',
|
|
31
|
+
geometry: { type: 'Polygon', coordinates: [[...vertices, vertices[0]]] },
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
@@ -1,49 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trace support for the drawing modes
|
|
3
3
|
*
|
|
4
|
-
* A small set of helpers, used in common by
|
|
5
|
-
* path from
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* InputRouter passes the coordinates of click / mousemove through snapping before delivering
|
|
10
|
-
* them to the mode, so at the time of onClick / onMouseMove the most recent readable result is
|
|
11
|
-
* the result corresponding to the event that was just delivered. However, there are also
|
|
12
|
-
* events delivered without going through snapping, such as `snap: false` of a synthetic input,
|
|
13
|
-
* so the result is taken only after confirming that its coordinates match the coordinates of
|
|
14
|
-
* the event (if they do not match, it is regarded as a stale result and ignored).
|
|
4
|
+
* A small set of helpers, used in common by the line and the polygon drawing modes, for
|
|
5
|
+
* deriving a trace path from the snapping result of an input. A mode learns about snapping only
|
|
6
|
+
* through `snapped` of the event it receives, so an input that was not snapped (`snap: false`
|
|
7
|
+
* of a synthetic input) has no target and starts no trace.
|
|
15
8
|
*
|
|
16
9
|
* The path itself is the shortest path of a graph assembled from the nearby edges
|
|
17
10
|
* (operations/trace-graph.ts). The feature ID and the dataset ID of the snap target are
|
|
18
|
-
* used only to resolve the exact coordinates of the endpoints (a vertex reference or the
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import type { Coordinate, VertexRef } from '../../store/types.js';
|
|
24
|
-
import type { ModeContext } from '../handler.js';
|
|
25
|
-
/**
|
|
26
|
-
* The vertex references of both ends of an edge, for when the snap was to that edge
|
|
11
|
+
* used only to resolve the exact coordinates of the endpoints (a vertex reference, or the two
|
|
12
|
+
* ends of an edge); whether the two points belong to the same feature does not matter.
|
|
13
|
+
*
|
|
14
|
+
* Everything the helpers read goes through a {@link TraceSource}, which `traceSourceOf` builds
|
|
15
|
+
* over the context of a mode.
|
|
27
16
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
endRef: VertexRef;
|
|
33
|
-
}
|
|
17
|
+
import type { Geometry } from 'geojson';
|
|
18
|
+
import type { ModeContext } from '../../api/extension/context.js';
|
|
19
|
+
import type { DrawPointerEvent } from '../../api/extension/mode.js';
|
|
20
|
+
import type { BoundingBox, Coordinate, Feature, VertexRef } from '../../store/types.js';
|
|
34
21
|
/**
|
|
35
22
|
* An endpoint of a trace (the snap target of a single click)
|
|
36
23
|
*
|
|
37
24
|
* It has either vertex (snapped to a vertex) or segment (snapped to an edge). An endpoint that
|
|
38
|
-
* has neither (a snap to a guide or to an intersection
|
|
25
|
+
* has neither (a snap to a guide or to an intersection) cannot be traced.
|
|
39
26
|
*/
|
|
40
27
|
export interface TraceAnchorEndpoint {
|
|
41
28
|
/** The coordinate decided by snapping (including a point in the middle of an edge) */
|
|
42
29
|
coordinate: Coordinate;
|
|
43
30
|
/** When snapped to a vertex, that vertex reference */
|
|
44
31
|
vertex?: VertexRef;
|
|
45
|
-
/** When snapped to an edge, the
|
|
46
|
-
segment?:
|
|
32
|
+
/** When snapped to an edge, the two ends of that edge */
|
|
33
|
+
segment?: {
|
|
34
|
+
start: Coordinate;
|
|
35
|
+
end: Coordinate;
|
|
36
|
+
};
|
|
47
37
|
}
|
|
48
38
|
/**
|
|
49
39
|
* The snap target that becomes the start point or the end point of a trace
|
|
@@ -57,16 +47,33 @@ export interface TraceAnchor {
|
|
|
57
47
|
endpoint: TraceAnchorEndpoint;
|
|
58
48
|
}
|
|
59
49
|
/**
|
|
60
|
-
*
|
|
50
|
+
* What tracing reads: whether it is on, the snapping tolerance and the zoom, the geometry of a
|
|
51
|
+
* snap target, and the features the graph is built from
|
|
52
|
+
*/
|
|
53
|
+
export interface TraceSource {
|
|
54
|
+
/** Whether tracing is on */
|
|
55
|
+
isEnabled(): boolean;
|
|
56
|
+
/** The snapping tolerance, in pixels */
|
|
57
|
+
tolerancePx(): number;
|
|
58
|
+
/** The zoom of the map */
|
|
59
|
+
zoom(): number;
|
|
60
|
+
/** The geometry of the feature or the row a snap target names, or null */
|
|
61
|
+
geometryOf(anchor: TraceAnchor): Geometry | null;
|
|
62
|
+
/** The visible features of the document and the rows of the datasets within an extent */
|
|
63
|
+
features(bbox: BoundingBox): Feature[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The trace source over the context of a mode: the options of the instance, the features of
|
|
67
|
+
* the document by extent and the rows of the datasets to trace along
|
|
61
68
|
*/
|
|
62
|
-
export declare function
|
|
69
|
+
export declare function traceSourceOf(ctx: ModeContext): TraceSource;
|
|
63
70
|
/**
|
|
64
|
-
* Reads the snap target of
|
|
71
|
+
* Reads the snap target of an input as an endpoint of a trace
|
|
65
72
|
*
|
|
66
|
-
* Returns null for snaps that cannot be used for tracing (a guide, an intersection
|
|
67
|
-
*
|
|
73
|
+
* Returns null for snaps that cannot be used for tracing (a guide, an intersection, an
|
|
74
|
+
* external candidate without a feature ID), when nothing was snapped, and when tracing is off.
|
|
68
75
|
*/
|
|
69
|
-
export declare function readTraceAnchor(
|
|
76
|
+
export declare function readTraceAnchor(source: TraceSource, event: DrawPointerEvent): TraceAnchor | null;
|
|
70
77
|
/**
|
|
71
78
|
* Derives the path between the previous confirmed click and the current snap target
|
|
72
79
|
*
|
|
@@ -76,4 +83,4 @@ export declare function readTraceAnchor(context: ModeContext, event: MouseNormal
|
|
|
76
83
|
* shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
|
|
77
84
|
* be resolved (the caller then treats it as a straight line).
|
|
78
85
|
*/
|
|
79
|
-
export declare function computeTracePath(
|
|
86
|
+
export declare function computeTracePath(source: TraceSource, from: TraceAnchor | null, to: TraceAnchor | null): Coordinate[] | null;
|