@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,72 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { getCursorForHandle, hitTestHandles, } from '../view/ui/handle-test.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cursor management class
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class CursorManager {
|
|
10
|
+
constructor(canvas, defaultCursor = 'default') {
|
|
11
|
+
Object.defineProperty(this, "canvas", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: void 0
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(this, "defaultCursor", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: void 0
|
|
22
|
+
});
|
|
23
|
+
this.canvas = canvas;
|
|
24
|
+
this.defaultCursor = defaultCursor;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Sets the default cursor
|
|
28
|
+
*/
|
|
29
|
+
setDefault() {
|
|
30
|
+
this.canvas.style.cursor = this.defaultCursor;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sets the cursor
|
|
34
|
+
*/
|
|
35
|
+
set(cursor) {
|
|
36
|
+
this.canvas.style.cursor = cursor;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Sets the cursor based on the handle hit result
|
|
40
|
+
*/
|
|
41
|
+
setForHandle(handleHit) {
|
|
42
|
+
this.canvas.style.cursor = getCursorForHandle(handleHit);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sets the pointer cursor
|
|
46
|
+
*/
|
|
47
|
+
setPointer() {
|
|
48
|
+
this.canvas.style.cursor = 'pointer';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Sets the text cursor
|
|
52
|
+
*/
|
|
53
|
+
setText() {
|
|
54
|
+
this.canvas.style.cursor = 'text';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Updates the cursor based on the selected features and the mouse position
|
|
58
|
+
*
|
|
59
|
+
* @returns true if a handle was hit
|
|
60
|
+
*/
|
|
61
|
+
updateForSelection(screenPoint, selectedFeatures, bbox, transform, config, zoom, scope) {
|
|
62
|
+
if (!bbox || selectedFeatures.length === 0) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const handleHit = hitTestHandles(screenPoint, selectedFeatures, transform, config, zoom, scope);
|
|
66
|
+
if (handleHit) {
|
|
67
|
+
this.setForHandle(handleHit);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { haversineDistanceMeters, initialBearingDegrees } from '../../geometry/index.js';
|
|
4
|
+
import { createdZoomProperty, resolveCommitLayer } from './commit-layer.js';
|
|
5
|
+
/** Default angle of the radius handle (toward the lower right) */
|
|
6
|
+
const DEFAULT_RADIUS_HANDLE_ANGLE = 135;
|
|
7
|
+
/** Minimum radius (in meters) */
|
|
8
|
+
const MIN_RADIUS_METERS = 1;
|
|
9
|
+
/**
|
|
10
|
+
* DrawCircleMode implementation
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export class DrawCircleMode {
|
|
15
|
+
constructor() {
|
|
16
|
+
Object.defineProperty(this, "modeName", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true,
|
|
20
|
+
value: 'draw_circle'
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(this, "writesFeatures", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true,
|
|
26
|
+
value: true
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(this, "context", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
configurable: true,
|
|
31
|
+
writable: true,
|
|
32
|
+
value: void 0
|
|
33
|
+
});
|
|
34
|
+
/** Center coordinate of the circle */
|
|
35
|
+
Object.defineProperty(this, "center", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: null
|
|
40
|
+
});
|
|
41
|
+
/** Radius (in meters) */
|
|
42
|
+
Object.defineProperty(this, "radiusMeters", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
configurable: true,
|
|
45
|
+
writable: true,
|
|
46
|
+
value: 0
|
|
47
|
+
});
|
|
48
|
+
/** Angle of the radius handle (in degrees) */
|
|
49
|
+
Object.defineProperty(this, "radiusHandleAngle", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
configurable: true,
|
|
52
|
+
writable: true,
|
|
53
|
+
value: DEFAULT_RADIUS_HANDLE_ANGLE
|
|
54
|
+
});
|
|
55
|
+
/** Drawing phase: 'waiting' = the center is not set yet, 'adjusting' = adjusting the radius */
|
|
56
|
+
Object.defineProperty(this, "phase", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: 'waiting'
|
|
61
|
+
});
|
|
62
|
+
/** The Feature ID that is going to be created */
|
|
63
|
+
Object.defineProperty(this, "pendingFeatureId", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: null
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
onStart(context) {
|
|
71
|
+
this.context = context;
|
|
72
|
+
// Change the cursor to a crosshair
|
|
73
|
+
this.context.map.getCanvas().style.cursor = 'crosshair';
|
|
74
|
+
// Clear the selection (not notified as a change)
|
|
75
|
+
this.context.store.transact(() => {
|
|
76
|
+
this.context.store.setSelection(null, []);
|
|
77
|
+
}, 'silent');
|
|
78
|
+
// Reset the state
|
|
79
|
+
this.reset();
|
|
80
|
+
// Generate the Feature ID in advance
|
|
81
|
+
this.pendingFeatureId = this.context.generateFeatureId();
|
|
82
|
+
}
|
|
83
|
+
onStop() {
|
|
84
|
+
// Restore the cursor
|
|
85
|
+
this.context.map.getCanvas().style.cursor = '';
|
|
86
|
+
// Clear the tentative state
|
|
87
|
+
this.context.store.setTentative(null);
|
|
88
|
+
this.reset();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* A double click while drawing is two clicks of the drawing; it never zooms the map
|
|
92
|
+
* (consumed by preventing its default action)
|
|
93
|
+
*/
|
|
94
|
+
onDoubleClick(event) {
|
|
95
|
+
event.originalEvent.preventDefault();
|
|
96
|
+
}
|
|
97
|
+
onClick(event) {
|
|
98
|
+
const coord = [event.lngLat.lng, event.lngLat.lat];
|
|
99
|
+
if (this.phase === 'waiting') {
|
|
100
|
+
// Set the center
|
|
101
|
+
this.center = coord;
|
|
102
|
+
this.phase = 'adjusting';
|
|
103
|
+
this.radiusMeters = 0;
|
|
104
|
+
// Update the tentative state
|
|
105
|
+
this.updateTentative();
|
|
106
|
+
}
|
|
107
|
+
else if (this.phase === 'adjusting') {
|
|
108
|
+
// Confirm if the radius is at least the minimum value
|
|
109
|
+
if (this.radiusMeters >= MIN_RADIUS_METERS) {
|
|
110
|
+
this.finishCircle();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
onMouseMove(event) {
|
|
115
|
+
if (this.phase === 'adjusting' && this.center) {
|
|
116
|
+
// Compute the distance from the center to the mouse position
|
|
117
|
+
const mouseCoord = [event.lngLat.lng, event.lngLat.lat];
|
|
118
|
+
this.radiusMeters = haversineDistanceMeters(this.center, mouseCoord);
|
|
119
|
+
// The great-circle bearing from the center to the mouse position. The handle is placed
|
|
120
|
+
// with destinationPoint, the inverse of this bearing, so it lands on the pointer
|
|
121
|
+
this.radiusHandleAngle = initialBearingDegrees(this.center, mouseCoord);
|
|
122
|
+
// Update the tentative state
|
|
123
|
+
this.updateTentative();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
onKeyDown(event) {
|
|
127
|
+
if (event.key === 'Escape') {
|
|
128
|
+
if (this.phase === 'adjusting') {
|
|
129
|
+
// Cancel if drawing is in progress
|
|
130
|
+
this.reset();
|
|
131
|
+
this.context.store.setTentative(null);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Return to the select mode if drawing is not in progress
|
|
135
|
+
this.context.setMode('select');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Called after an external state change
|
|
141
|
+
*
|
|
142
|
+
* Resets the state of the drawing in progress so that the next drawing operation can start
|
|
143
|
+
* normally.
|
|
144
|
+
*/
|
|
145
|
+
onExternalStateChange() {
|
|
146
|
+
this.reset();
|
|
147
|
+
this.context.store.setTentative(null);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Confirms the circle
|
|
151
|
+
*/
|
|
152
|
+
finishCircle() {
|
|
153
|
+
if (!this.center || this.radiusMeters < MIN_RADIUS_METERS) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const { store, autoNameGenerator } = this.context;
|
|
157
|
+
// Discard the drawing when no layer can be written any more
|
|
158
|
+
const layerId = resolveCommitLayer(this.context);
|
|
159
|
+
if (layerId === null)
|
|
160
|
+
return;
|
|
161
|
+
// Generate the automatic name
|
|
162
|
+
const autoName = autoNameGenerator.generateName('Circle');
|
|
163
|
+
// Use the ID generated in advance (generate a new one if there is none)
|
|
164
|
+
const featureId = this.pendingFeatureId ?? this.context.generateFeatureId();
|
|
165
|
+
// Create a new circle feature
|
|
166
|
+
const feature = {
|
|
167
|
+
id: featureId,
|
|
168
|
+
type: 'Circle',
|
|
169
|
+
coordinates: this.center,
|
|
170
|
+
layerId,
|
|
171
|
+
properties: {
|
|
172
|
+
radiusMeters: this.radiusMeters,
|
|
173
|
+
radiusHandleAngle: this.radiusHandleAngle,
|
|
174
|
+
...createdZoomProperty(this.context),
|
|
175
|
+
// The polygon coordinates for rendering are computed at render time, so they are not saved
|
|
176
|
+
...(autoName !== undefined && { name: autoName }),
|
|
177
|
+
},
|
|
178
|
+
locked: false,
|
|
179
|
+
visible: true,
|
|
180
|
+
};
|
|
181
|
+
// Bundle the feature creation and the selection into a single transaction
|
|
182
|
+
// (so that both are undone at once on undo)
|
|
183
|
+
store.transact(() => {
|
|
184
|
+
store.createFeature(feature);
|
|
185
|
+
// Clear the tentative state
|
|
186
|
+
store.setTentative(null);
|
|
187
|
+
// Select the created feature
|
|
188
|
+
store.setSelection('feature', [feature.id]);
|
|
189
|
+
});
|
|
190
|
+
// Reset the state
|
|
191
|
+
this.reset();
|
|
192
|
+
// Return to the select mode
|
|
193
|
+
this.context.setMode('select');
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Updates the tentative state
|
|
197
|
+
*/
|
|
198
|
+
updateTentative() {
|
|
199
|
+
if (!this.center) {
|
|
200
|
+
this.context.store.setTentative(null);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
this.context.store.setTentative({
|
|
204
|
+
type: 'Circle',
|
|
205
|
+
coordinates: this.center,
|
|
206
|
+
layerId: this.context.getCurrentLayerId(),
|
|
207
|
+
radiusMeters: this.radiusMeters,
|
|
208
|
+
radiusHandleAngle: this.radiusHandleAngle,
|
|
209
|
+
pendingFeatureId: this.pendingFeatureId ?? undefined,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Resets the state
|
|
214
|
+
*/
|
|
215
|
+
reset() {
|
|
216
|
+
this.center = null;
|
|
217
|
+
this.radiusMeters = 0;
|
|
218
|
+
this.radiusHandleAngle = DEFAULT_RADIUS_HANDLE_ANGLE;
|
|
219
|
+
this.phase = 'waiting';
|
|
220
|
+
this.pendingFeatureId = null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a drawing mode writes when it commits: the layer, and the created zoom
|
|
3
|
+
*/
|
|
4
|
+
import type { ModeContext } from '../handler.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the layer a drawing mode commits a new feature into
|
|
7
|
+
*
|
|
8
|
+
* Applies the commit rule of `ModeContext.getCurrentLayerId`: it returns the writable layer,
|
|
9
|
+
* and when no layer can be written any more (the layer was deleted, locked or hidden while
|
|
10
|
+
* drawing), the drawing is discarded instead: the tentative state is cleared and the mode
|
|
11
|
+
* returns to select, which stops the current handler. The caller then returns without
|
|
12
|
+
* creating anything, so no exception reaches the input handling. A plugin mode follows the
|
|
13
|
+
* same rule through the ModeContext.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveCommitLayer(context: ModeContext): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* The created zoom a drawing mode writes into the properties of a new feature
|
|
18
|
+
*
|
|
19
|
+
* When the instance lets line widths follow the zoom (`ModeContext.scaleWithZoom`), it is the
|
|
20
|
+
* zoom at the time of the commit, from which the widths grow and shrink with the map. Otherwise
|
|
21
|
+
* nothing is written, and the feature keeps its widths on the screen like one added through
|
|
22
|
+
* the API.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createdZoomProperty(context: ModeContext): {
|
|
25
|
+
createdZoom?: number;
|
|
26
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the layer a drawing mode commits a new feature into
|
|
5
|
+
*
|
|
6
|
+
* Applies the commit rule of `ModeContext.getCurrentLayerId`: it returns the writable layer,
|
|
7
|
+
* and when no layer can be written any more (the layer was deleted, locked or hidden while
|
|
8
|
+
* drawing), the drawing is discarded instead: the tentative state is cleared and the mode
|
|
9
|
+
* returns to select, which stops the current handler. The caller then returns without
|
|
10
|
+
* creating anything, so no exception reaches the input handling. A plugin mode follows the
|
|
11
|
+
* same rule through the ModeContext.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveCommitLayer(context) {
|
|
14
|
+
const layerId = context.getCurrentLayerId();
|
|
15
|
+
if (layerId !== '')
|
|
16
|
+
return layerId;
|
|
17
|
+
context.store.setTentative(null);
|
|
18
|
+
context.setMode('select');
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The created zoom a drawing mode writes into the properties of a new feature
|
|
23
|
+
*
|
|
24
|
+
* When the instance lets line widths follow the zoom (`ModeContext.scaleWithZoom`), it is the
|
|
25
|
+
* zoom at the time of the commit, from which the widths grow and shrink with the map. Otherwise
|
|
26
|
+
* nothing is written, and the feature keeps its widths on the screen like one added through
|
|
27
|
+
* the API.
|
|
28
|
+
*/
|
|
29
|
+
export function createdZoomProperty(context) {
|
|
30
|
+
return context.scaleWithZoom ? { createdZoom: context.map.getZoom() } : {};
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { createdZoomProperty, resolveCommitLayer } from './commit-layer.js';
|
|
4
|
+
/** Minimum distance for adding a coordinate (in degrees) */
|
|
5
|
+
const MIN_DISTANCE_DEGREES = 0.00001;
|
|
6
|
+
/**
|
|
7
|
+
* The input types that are not passed through snapping (the points inside a stroke)
|
|
8
|
+
*
|
|
9
|
+
* The snapping tolerance is a value premised on "once per click", so applying it to dragmove,
|
|
10
|
+
* which passes several hundred points in a single stroke, pulls the intermediate sample points
|
|
11
|
+
* one after another to nearby vertices and edges, and a line the user meant to draw straight
|
|
12
|
+
* ends up bent (this is conspicuous when dense administrative boundaries and the like are
|
|
13
|
+
* displayed). Furthermore, when snapping collapses consecutive samples onto the same point,
|
|
14
|
+
* they are discarded by the MIN_DISTANCE_DEGREES sieve, and the line jumps all at once the
|
|
15
|
+
* moment it leaves the tolerance.
|
|
16
|
+
*
|
|
17
|
+
* The start and the end of the drag remain snapped, which keeps "start drawing exactly from a
|
|
18
|
+
* corner of a boundary and end at a corner".
|
|
19
|
+
*/
|
|
20
|
+
const UNSNAPPED_INPUT_TYPES = new Set(['dragmove']);
|
|
21
|
+
/**
|
|
22
|
+
* DrawFreehandMode implementation
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export class DrawFreehandMode {
|
|
27
|
+
constructor() {
|
|
28
|
+
Object.defineProperty(this, "modeName", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
configurable: true,
|
|
31
|
+
writable: true,
|
|
32
|
+
value: 'draw_freehand'
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(this, "writesFeatures", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: true
|
|
39
|
+
});
|
|
40
|
+
Object.defineProperty(this, "context", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
writable: true,
|
|
44
|
+
value: void 0
|
|
45
|
+
});
|
|
46
|
+
/** Whether a drag is in progress */
|
|
47
|
+
Object.defineProperty(this, "isDrawing", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: false
|
|
52
|
+
});
|
|
53
|
+
/** Coordinates of the current stroke */
|
|
54
|
+
Object.defineProperty(this, "currentCoordinates", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
configurable: true,
|
|
57
|
+
writable: true,
|
|
58
|
+
value: []
|
|
59
|
+
});
|
|
60
|
+
/** The Feature ID that is going to be created */
|
|
61
|
+
Object.defineProperty(this, "pendingFeatureId", {
|
|
62
|
+
enumerable: true,
|
|
63
|
+
configurable: true,
|
|
64
|
+
writable: true,
|
|
65
|
+
value: null
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Whether snapping is to be applied, per input type
|
|
70
|
+
*
|
|
71
|
+
* Snapping is refused only inside a stroke (dragmove); the start point (dragstart) and the
|
|
72
|
+
* end point (dragend) are snapped.
|
|
73
|
+
*/
|
|
74
|
+
isSnapEnabledFor(inputType) {
|
|
75
|
+
return !UNSNAPPED_INPUT_TYPES.has(inputType);
|
|
76
|
+
}
|
|
77
|
+
onStart(context) {
|
|
78
|
+
this.context = context;
|
|
79
|
+
// Change the cursor to a crosshair
|
|
80
|
+
this.context.map.getCanvas().style.cursor = 'crosshair';
|
|
81
|
+
// Clear the selection (not notified as a change)
|
|
82
|
+
this.context.store.transact(() => {
|
|
83
|
+
this.context.store.setSelection(null, []);
|
|
84
|
+
}, 'silent');
|
|
85
|
+
// Reset the state
|
|
86
|
+
this.reset();
|
|
87
|
+
}
|
|
88
|
+
onStop() {
|
|
89
|
+
// Restore the cursor
|
|
90
|
+
this.context.map.getCanvas().style.cursor = '';
|
|
91
|
+
// Clear the tentative state
|
|
92
|
+
this.context.store.setTentative(null);
|
|
93
|
+
this.reset();
|
|
94
|
+
// Re-enable the dragPan of MapLibre
|
|
95
|
+
if (!this.context.map.dragPan.isEnabled()) {
|
|
96
|
+
this.context.map.dragPan.enable();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Called after an external state change
|
|
101
|
+
*
|
|
102
|
+
* Resets the state of the drawing in progress so that the next drawing operation can start
|
|
103
|
+
* normally.
|
|
104
|
+
*/
|
|
105
|
+
onExternalStateChange() {
|
|
106
|
+
this.reset();
|
|
107
|
+
this.context.store.setTentative(null);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Disables dragPan on a mouse down
|
|
111
|
+
* @returns true consumes the event (blocks the subsequent processing)
|
|
112
|
+
*/
|
|
113
|
+
onMouseDown() {
|
|
114
|
+
// Disable the dragPan of MapLibre so that dragging is enabled
|
|
115
|
+
this.context.map.dragPan.disable();
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
onDragStart(event) {
|
|
119
|
+
// Start drawing
|
|
120
|
+
this.isDrawing = true;
|
|
121
|
+
this.currentCoordinates = [[event.lngLat.lng, event.lngLat.lat]];
|
|
122
|
+
// Generate the Feature ID in advance (for each stroke)
|
|
123
|
+
this.pendingFeatureId = this.context.generateFeatureId();
|
|
124
|
+
// Update the tentative state
|
|
125
|
+
this.updateTentative();
|
|
126
|
+
}
|
|
127
|
+
onDragMove(event) {
|
|
128
|
+
if (!this.isDrawing)
|
|
129
|
+
return;
|
|
130
|
+
const newCoord = [event.lngLat.lng, event.lngLat.lat];
|
|
131
|
+
// Check the distance from the last coordinate
|
|
132
|
+
if (this.currentCoordinates.length > 0) {
|
|
133
|
+
const lastCoord = this.currentCoordinates[this.currentCoordinates.length - 1];
|
|
134
|
+
const dx = newCoord[0] - lastCoord[0];
|
|
135
|
+
const dy = newCoord[1] - lastCoord[1];
|
|
136
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
137
|
+
// Do not add it if it is below the minimum distance
|
|
138
|
+
if (distance < MIN_DISTANCE_DEGREES) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Add the coordinate
|
|
143
|
+
this.currentCoordinates.push(newCoord);
|
|
144
|
+
// Update the tentative state
|
|
145
|
+
this.updateTentative();
|
|
146
|
+
}
|
|
147
|
+
onDragEnd(event) {
|
|
148
|
+
if (!this.isDrawing)
|
|
149
|
+
return;
|
|
150
|
+
// Add the last coordinate
|
|
151
|
+
const endCoord = [event.lngLat.lng, event.lngLat.lat];
|
|
152
|
+
if (this.currentCoordinates.length > 0) {
|
|
153
|
+
const lastCoord = this.currentCoordinates[this.currentCoordinates.length - 1];
|
|
154
|
+
const dx = endCoord[0] - lastCoord[0];
|
|
155
|
+
const dy = endCoord[1] - lastCoord[1];
|
|
156
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
157
|
+
if (distance >= MIN_DISTANCE_DEGREES) {
|
|
158
|
+
this.currentCoordinates.push(endCoord);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Confirm the stroke
|
|
162
|
+
this.finishStroke();
|
|
163
|
+
// End the drawing (the mode is kept active)
|
|
164
|
+
this.isDrawing = false;
|
|
165
|
+
this.currentCoordinates = [];
|
|
166
|
+
this.context.store.setTentative(null);
|
|
167
|
+
// Re-enable the dragPan of MapLibre (until the next drag)
|
|
168
|
+
this.context.map.dragPan.enable();
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The press ended without a release (a second finger, or the browser cancelled the touch)
|
|
172
|
+
*
|
|
173
|
+
* The stroke in progress is discarded, and the pan goes back to MapLibre.
|
|
174
|
+
*/
|
|
175
|
+
onDragCancel() {
|
|
176
|
+
if (this.isDrawing) {
|
|
177
|
+
this.reset();
|
|
178
|
+
this.context.store.setTentative(null);
|
|
179
|
+
}
|
|
180
|
+
if (!this.context.map.dragPan.isEnabled()) {
|
|
181
|
+
this.context.map.dragPan.enable();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
onKeyDown(event) {
|
|
185
|
+
if (event.key === 'Escape') {
|
|
186
|
+
if (this.isDrawing) {
|
|
187
|
+
// Cancel if drawing is in progress
|
|
188
|
+
this.isDrawing = false;
|
|
189
|
+
this.currentCoordinates = [];
|
|
190
|
+
this.context.store.setTentative(null);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Return to the select mode if drawing is not in progress
|
|
194
|
+
this.context.setMode('select');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Confirms the stroke and creates the feature
|
|
200
|
+
*/
|
|
201
|
+
finishStroke() {
|
|
202
|
+
// At least two points are required
|
|
203
|
+
if (this.currentCoordinates.length < 2) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const { store, autoNameGenerator } = this.context;
|
|
207
|
+
// Discard the drawing when no layer can be written any more
|
|
208
|
+
const layerId = resolveCommitLayer(this.context);
|
|
209
|
+
if (layerId === null)
|
|
210
|
+
return;
|
|
211
|
+
// Generate the automatic name
|
|
212
|
+
const autoName = autoNameGenerator.generateName('Freehand');
|
|
213
|
+
// Use the ID generated in advance (generate a new one if there is none)
|
|
214
|
+
const featureId = this.pendingFeatureId ?? this.context.generateFeatureId();
|
|
215
|
+
// Create a new freehand feature
|
|
216
|
+
const feature = {
|
|
217
|
+
id: featureId,
|
|
218
|
+
type: 'Freehand',
|
|
219
|
+
coordinates: [...this.currentCoordinates],
|
|
220
|
+
layerId,
|
|
221
|
+
properties: {
|
|
222
|
+
...createdZoomProperty(this.context),
|
|
223
|
+
...(autoName !== undefined && { name: autoName }),
|
|
224
|
+
},
|
|
225
|
+
style: {
|
|
226
|
+
// Uses the same default color as LineString
|
|
227
|
+
// (lineString.stroke.color of feature-style-config)
|
|
228
|
+
strokeWidth: 3,
|
|
229
|
+
},
|
|
230
|
+
locked: false,
|
|
231
|
+
visible: true,
|
|
232
|
+
};
|
|
233
|
+
// Create the feature inside a transaction (notified as a single change)
|
|
234
|
+
store.transact(() => {
|
|
235
|
+
store.createFeature(feature);
|
|
236
|
+
});
|
|
237
|
+
// Clear pendingFeatureId
|
|
238
|
+
this.pendingFeatureId = null;
|
|
239
|
+
// Note: the feature is not selected after creation (so that drawing can continue)
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Updates the tentative state
|
|
243
|
+
*/
|
|
244
|
+
updateTentative() {
|
|
245
|
+
if (this.currentCoordinates.length === 0) {
|
|
246
|
+
this.context.store.setTentative(null);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
this.context.store.setTentative({
|
|
250
|
+
type: 'Freehand',
|
|
251
|
+
coordinates: [...this.currentCoordinates],
|
|
252
|
+
layerId: this.context.getCurrentLayerId(),
|
|
253
|
+
pendingFeatureId: this.pendingFeatureId ?? undefined,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Resets the state
|
|
258
|
+
*/
|
|
259
|
+
reset() {
|
|
260
|
+
this.isDrawing = false;
|
|
261
|
+
this.currentCoordinates = [];
|
|
262
|
+
this.pendingFeatureId = null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { resolveCommitLayer } from './commit-layer.js';
|
|
4
|
+
/**
|
|
5
|
+
* DrawImageMode implementation
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class DrawImageMode {
|
|
10
|
+
constructor() {
|
|
11
|
+
Object.defineProperty(this, "modeName", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: 'draw_image'
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(this, "writesFeatures", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: true
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "context", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: void 0
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
onStart(context) {
|
|
31
|
+
this.context = context;
|
|
32
|
+
const { map, store, eventEmitter } = this.context;
|
|
33
|
+
// Set the cursor to the default
|
|
34
|
+
map.getCanvas().style.cursor = 'default';
|
|
35
|
+
// Clear the selection (not notified as a change)
|
|
36
|
+
store.transact(() => {
|
|
37
|
+
store.setSelection(null, []);
|
|
38
|
+
}, 'silent');
|
|
39
|
+
// Get the center coordinate and the zoom of the map
|
|
40
|
+
const center = map.getCenter();
|
|
41
|
+
const coordinate = [center.lng, center.lat];
|
|
42
|
+
const zoom = map.getZoom();
|
|
43
|
+
// Nothing is requested when no layer can be written (the mode returns to select)
|
|
44
|
+
const layerId = resolveCommitLayer(this.context);
|
|
45
|
+
if (layerId === null)
|
|
46
|
+
return;
|
|
47
|
+
// Emit the event and delegate the file selection to the demo side
|
|
48
|
+
eventEmitter.emit('image.request', { coordinate, zoom, layerId });
|
|
49
|
+
// Return to the select mode
|
|
50
|
+
this.context.setMode('select');
|
|
51
|
+
}
|
|
52
|
+
onStop() {
|
|
53
|
+
this.context.map.getCanvas().style.cursor = '';
|
|
54
|
+
}
|
|
55
|
+
onKeyDown(event) {
|
|
56
|
+
if (event.key === 'Escape') {
|
|
57
|
+
this.context.setMode('select');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Draw Modes module
|
|
3
|
+
*/
|
|
4
|
+
export { DrawCircleMode } from './circle.js';
|
|
5
|
+
export { DrawFreehandMode } from './freehand.js';
|
|
6
|
+
export { DrawImageMode } from './image.js';
|
|
7
|
+
export { DrawLineMode } from './line.js';
|
|
8
|
+
export { DrawPointMode } from './point.js';
|
|
9
|
+
export { DrawPolygonMode } from './polygon.js';
|