@sakuzu/maplibre-gl-draw 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { createdZoomProperty, resolveCommitLayer } from './commit-layer.js';
|
|
4
|
+
import { computeTracePath, isTraceEnabled, readTraceAnchor } from './trace-support.js';
|
|
5
|
+
/** Tolerance for deciding a vertex click (in pixels) */
|
|
6
|
+
const VERTEX_CLICK_TOLERANCE = 10;
|
|
7
|
+
/**
|
|
8
|
+
* DrawPolygonMode implementation
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export class DrawPolygonMode {
|
|
13
|
+
constructor() {
|
|
14
|
+
Object.defineProperty(this, "modeName", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: 'draw_polygon'
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(this, "writesFeatures", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
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;
|
|
144
|
+
}
|
|
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
|
+
return {
|
|
205
|
+
featureId: this.traceAnchor.featureId,
|
|
206
|
+
datasetId: this.traceAnchor.datasetId,
|
|
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 }),
|
|
250
|
+
},
|
|
251
|
+
locked: false,
|
|
252
|
+
visible: true,
|
|
253
|
+
};
|
|
254
|
+
// Bundle the feature creation and the selection into a single transaction
|
|
255
|
+
// (so that both are undone at once on undo)
|
|
256
|
+
store.transact(() => {
|
|
257
|
+
store.createFeature(feature);
|
|
258
|
+
// Clear the tentative state
|
|
259
|
+
store.setTentative(null);
|
|
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
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace support for the drawing modes
|
|
3
|
+
*
|
|
4
|
+
* A small set of helpers, used in common by draw_line / draw_polygon, for deriving a trace
|
|
5
|
+
* path from a snapping result. A mode does not hold a SnapService and learns about snapping
|
|
6
|
+
* only through `getSnapResult()` of ModeContext (a port that does no more than read the most
|
|
7
|
+
* recent snapping result).
|
|
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).
|
|
15
|
+
*
|
|
16
|
+
* The path itself is the shortest path of a graph assembled from the nearby edges
|
|
17
|
+
* (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
|
+
* references to both ends of an edge); whether the two points belong to the same feature does
|
|
20
|
+
* not matter.
|
|
21
|
+
*/
|
|
22
|
+
import type { MouseNormalizedEvent } from '../../dispatcher/types.js';
|
|
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
|
|
27
|
+
*/
|
|
28
|
+
export interface TraceAnchorSegment {
|
|
29
|
+
/** The vertex reference of the start point of the edge */
|
|
30
|
+
startRef: VertexRef;
|
|
31
|
+
/** The vertex reference of the end point of the edge */
|
|
32
|
+
endRef: VertexRef;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* An endpoint of a trace (the snap target of a single click)
|
|
36
|
+
*
|
|
37
|
+
* 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 without references) cannot be traced.
|
|
39
|
+
*/
|
|
40
|
+
export interface TraceAnchorEndpoint {
|
|
41
|
+
/** The coordinate decided by snapping (including a point in the middle of an edge) */
|
|
42
|
+
coordinate: Coordinate;
|
|
43
|
+
/** When snapped to a vertex, that vertex reference */
|
|
44
|
+
vertex?: VertexRef;
|
|
45
|
+
/** When snapped to an edge, the vertex references of both ends of that edge */
|
|
46
|
+
segment?: TraceAnchorSegment;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The snap target that becomes the start point or the end point of a trace
|
|
50
|
+
*/
|
|
51
|
+
export interface TraceAnchor {
|
|
52
|
+
/** The feature ID of the snap target */
|
|
53
|
+
featureId: string;
|
|
54
|
+
/** The dataset ID of the snap target (only for one from a dataset) */
|
|
55
|
+
datasetId?: string;
|
|
56
|
+
/** The geometric references and the coordinate of the snap target */
|
|
57
|
+
endpoint: TraceAnchorEndpoint;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Whether tracing is enabled (if there is no configuration, it is regarded as enabled)
|
|
61
|
+
*/
|
|
62
|
+
export declare function isTraceEnabled(context: ModeContext): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Reads the snap target of the event that was just delivered as an endpoint of a trace
|
|
65
|
+
*
|
|
66
|
+
* Returns null for snaps that cannot be used for tracing (a guide, an intersection without
|
|
67
|
+
* vertex references, an external candidate without a feature ID) and when nothing was snapped.
|
|
68
|
+
*/
|
|
69
|
+
export declare function readTraceAnchor(context: ModeContext, event: MouseNormalizedEvent): TraceAnchor | null;
|
|
70
|
+
/**
|
|
71
|
+
* Derives the path between the previous confirmed click and the current snap target
|
|
72
|
+
*
|
|
73
|
+
* Returns the shortest path of the graph assembled from the nearby edges, as the sequence of
|
|
74
|
+
* vertices to insert in between. Vertices whose coordinates match are folded into a single
|
|
75
|
+
* node, so edges of different features also form a path as long as they are connected by a
|
|
76
|
+
* shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
|
|
77
|
+
* be resolved (the caller then treats it as a straight line).
|
|
78
|
+
*/
|
|
79
|
+
export declare function computeTracePath(context: ModeContext, from: TraceAnchor | null, to: TraceAnchor | null): Coordinate[] | null;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { resolveVertexCoordinates } from '../../operations/shared-vertex.js';
|
|
4
|
+
import { buildTraceGraph, findTracePath } from '../../operations/trace-graph.js';
|
|
5
|
+
import { degreesPerPixel } from '../../snapping/geometry.js';
|
|
6
|
+
import { isSnapVisible } from '../../snapping/providers/shared.js';
|
|
7
|
+
import { DEFAULT_SNAP_OPTIONS } from '../../snapping/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* The margin of the extent over which the material of the graph is collected
|
|
10
|
+
* (as a ratio of the bbox of the two endpoints)
|
|
11
|
+
*/
|
|
12
|
+
const TRACE_BBOX_MARGIN_RATIO = 0.2;
|
|
13
|
+
/**
|
|
14
|
+
* Whether tracing is enabled (if there is no configuration, it is regarded as enabled)
|
|
15
|
+
*/
|
|
16
|
+
export function isTraceEnabled(context) {
|
|
17
|
+
return context.trace?.enabled !== false;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Reads the snap target of the event that was just delivered as an endpoint of a trace
|
|
21
|
+
*
|
|
22
|
+
* Returns null for snaps that cannot be used for tracing (a guide, an intersection without
|
|
23
|
+
* vertex references, an external candidate without a feature ID) and when nothing was snapped.
|
|
24
|
+
*/
|
|
25
|
+
export function readTraceAnchor(context, event) {
|
|
26
|
+
if (!isTraceEnabled(context))
|
|
27
|
+
return null;
|
|
28
|
+
const result = context.getSnapResult?.();
|
|
29
|
+
const target = result?.target;
|
|
30
|
+
if (!result || !target || target.featureId === undefined)
|
|
31
|
+
return null;
|
|
32
|
+
// For an event delivered without going through snapping (such as snap: false of a synthetic
|
|
33
|
+
// input), the most recent result belongs to a different coordinate, so it is not used
|
|
34
|
+
if (result.lngLat.lng !== event.lngLat.lng || result.lngLat.lat !== event.lngLat.lat) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const coordinate = [result.lngLat.lng, result.lngLat.lat];
|
|
38
|
+
if (target.vertex) {
|
|
39
|
+
return {
|
|
40
|
+
featureId: target.featureId,
|
|
41
|
+
datasetId: target.datasetId,
|
|
42
|
+
endpoint: { coordinate, vertex: target.vertex },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const segment = target.segment;
|
|
46
|
+
if (segment?.startRef && segment.endRef) {
|
|
47
|
+
return {
|
|
48
|
+
featureId: target.featureId,
|
|
49
|
+
datasetId: target.datasetId,
|
|
50
|
+
endpoint: {
|
|
51
|
+
coordinate,
|
|
52
|
+
segment: { startRef: segment.startRef, endRef: segment.endRef },
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Looks up the feature of the snap target
|
|
60
|
+
*
|
|
61
|
+
* Where it is resolved from depends on its origin. One from the Store is looked up with
|
|
62
|
+
* store.getFeature, one from a dataset with getDatasetFeature.
|
|
63
|
+
*/
|
|
64
|
+
function anchorFeature(context, anchor) {
|
|
65
|
+
if (anchor.datasetId === undefined) {
|
|
66
|
+
return context.store.getFeature(anchor.featureId) ?? null;
|
|
67
|
+
}
|
|
68
|
+
return context.getDatasetFeature?.(anchor.datasetId, anchor.featureId) ?? null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Turns the snap target into an endpoint of the graph (resolves the vertex references into
|
|
72
|
+
* actual coordinates)
|
|
73
|
+
*/
|
|
74
|
+
function toGraphEndpoint(context, anchor) {
|
|
75
|
+
const { coordinate, vertex, segment } = anchor.endpoint;
|
|
76
|
+
const feature = anchorFeature(context, anchor);
|
|
77
|
+
if (vertex) {
|
|
78
|
+
// For a snap to a vertex the snapped coordinate is the vertex itself, but if the feature
|
|
79
|
+
// can be looked up, that one is taken as authoritative
|
|
80
|
+
const resolved = feature ? resolveVertexCoordinates(feature, [vertex])[0] : undefined;
|
|
81
|
+
return { coordinate, node: resolved ?? coordinate };
|
|
82
|
+
}
|
|
83
|
+
if (!segment || !feature)
|
|
84
|
+
return null;
|
|
85
|
+
const start = resolveVertexCoordinates(feature, [segment.startRef])[0];
|
|
86
|
+
const end = resolveVertexCoordinates(feature, [segment.endRef])[0];
|
|
87
|
+
if (!start || !end)
|
|
88
|
+
return null;
|
|
89
|
+
return { coordinate, segment: { start, end } };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The extent over which the material of the graph is collected
|
|
93
|
+
*
|
|
94
|
+
* The bbox of the two endpoints is expanded by 20 percent of its size plus the snapping
|
|
95
|
+
* tolerance.
|
|
96
|
+
*/
|
|
97
|
+
function traceBounds(context, from, to) {
|
|
98
|
+
const minX = Math.min(from[0], to[0]);
|
|
99
|
+
const maxX = Math.max(from[0], to[0]);
|
|
100
|
+
const minY = Math.min(from[1], to[1]);
|
|
101
|
+
const maxY = Math.max(from[1], to[1]);
|
|
102
|
+
const tolerancePx = context.snapOptions?.tolerancePx ?? DEFAULT_SNAP_OPTIONS.tolerancePx;
|
|
103
|
+
const perPixel = degreesPerPixel((minY + maxY) / 2, context.map.getZoom());
|
|
104
|
+
const marginX = (maxX - minX) * TRACE_BBOX_MARGIN_RATIO + perPixel.lng * tolerancePx;
|
|
105
|
+
const marginY = (maxY - minY) * TRACE_BBOX_MARGIN_RATIO + perPixel.lat * tolerancePx;
|
|
106
|
+
return {
|
|
107
|
+
minX: minX - marginX,
|
|
108
|
+
minY: minY - marginY,
|
|
109
|
+
maxX: maxX + marginX,
|
|
110
|
+
maxY: maxY + marginY,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Collects the features that become the material of the graph
|
|
115
|
+
*
|
|
116
|
+
* The same scope as the targets of snapping, that is, the visible features of the Store and,
|
|
117
|
+
* when snapping to data is enabled, the visible features of the datasets.
|
|
118
|
+
*/
|
|
119
|
+
function collectTraceFeatures(context, bbox) {
|
|
120
|
+
const lng = (bbox.minX + bbox.maxX) / 2;
|
|
121
|
+
const lat = (bbox.minY + bbox.maxY) / 2;
|
|
122
|
+
// findNear looks up with a square extent, so the larger of the two radii is used
|
|
123
|
+
const radius = Math.max(bbox.maxX - lng, bbox.maxY - lat);
|
|
124
|
+
const features = [];
|
|
125
|
+
const seen = new Set();
|
|
126
|
+
for (const id of context.spatialIndex.findNear([lng, lat], radius)) {
|
|
127
|
+
if (seen.has(id))
|
|
128
|
+
continue;
|
|
129
|
+
seen.add(id);
|
|
130
|
+
const feature = context.store.getFeature(id);
|
|
131
|
+
if (!feature)
|
|
132
|
+
continue;
|
|
133
|
+
if (!isSnapVisible(feature, context.store))
|
|
134
|
+
continue;
|
|
135
|
+
features.push(feature);
|
|
136
|
+
}
|
|
137
|
+
const display = context.getDatasetTraceFeatures?.(bbox);
|
|
138
|
+
if (display)
|
|
139
|
+
features.push(...display);
|
|
140
|
+
return features;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Derives the path between the previous confirmed click and the current snap target
|
|
144
|
+
*
|
|
145
|
+
* Returns the shortest path of the graph assembled from the nearby edges, as the sequence of
|
|
146
|
+
* vertices to insert in between. Vertices whose coordinates match are folded into a single
|
|
147
|
+
* node, so edges of different features also form a path as long as they are connected by a
|
|
148
|
+
* shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
|
|
149
|
+
* be resolved (the caller then treats it as a straight line).
|
|
150
|
+
*/
|
|
151
|
+
export function computeTracePath(context, from, to) {
|
|
152
|
+
if (!from || !to)
|
|
153
|
+
return null;
|
|
154
|
+
const fromEndpoint = toGraphEndpoint(context, from);
|
|
155
|
+
const toEndpoint = toGraphEndpoint(context, to);
|
|
156
|
+
if (!fromEndpoint || !toEndpoint)
|
|
157
|
+
return null;
|
|
158
|
+
const bbox = traceBounds(context, fromEndpoint.coordinate, toEndpoint.coordinate);
|
|
159
|
+
const features = collectTraceFeatures(context, bbox);
|
|
160
|
+
return findTracePath(buildTraceGraph(features, bbox), fromEndpoint, toEndpoint);
|
|
161
|
+
}
|