@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,78 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Selection API
|
|
5
|
+
*
|
|
6
|
+
* Provides the Selection and Vertex Selection operations of MapLibreGLDraw.
|
|
7
|
+
*/
|
|
8
|
+
import { deleteSelection } from '../operations/selection-operations.js';
|
|
9
|
+
import { deleteVertex as deleteVertexOp, sortVertexRefsForDeletion } from '../operations/vertex.js';
|
|
10
|
+
export function createSelectionApi(deps) {
|
|
11
|
+
const { store } = deps;
|
|
12
|
+
return {
|
|
13
|
+
getSelection() {
|
|
14
|
+
return store.getSelection();
|
|
15
|
+
},
|
|
16
|
+
select(ids, type = 'feature') {
|
|
17
|
+
const idsArray = Array.isArray(ids) ? ids : [ids];
|
|
18
|
+
store.setSelection(type, idsArray);
|
|
19
|
+
},
|
|
20
|
+
deselect() {
|
|
21
|
+
store.setSelection(null, []);
|
|
22
|
+
},
|
|
23
|
+
getSelectedFeatures() {
|
|
24
|
+
const selection = store.getSelection();
|
|
25
|
+
if (selection.type !== 'feature')
|
|
26
|
+
return [];
|
|
27
|
+
return selection.ids
|
|
28
|
+
.map((id) => store.getFeature(id))
|
|
29
|
+
.filter((f) => f !== undefined);
|
|
30
|
+
},
|
|
31
|
+
getSelectedIds() {
|
|
32
|
+
return [...store.getSelection().ids];
|
|
33
|
+
},
|
|
34
|
+
deleteSelection() {
|
|
35
|
+
return deleteSelection(store);
|
|
36
|
+
},
|
|
37
|
+
selectVertices(featureId, vertices) {
|
|
38
|
+
store.setSelectedVertices({ featureId, vertexIndices: vertices });
|
|
39
|
+
},
|
|
40
|
+
deselectVertices() {
|
|
41
|
+
store.setSelectedVertices(null);
|
|
42
|
+
},
|
|
43
|
+
getSelectedVertices() {
|
|
44
|
+
return store.getSelectedVertices();
|
|
45
|
+
},
|
|
46
|
+
deleteVertices(featureId, vertices) {
|
|
47
|
+
if (vertices.length === 0)
|
|
48
|
+
return 0;
|
|
49
|
+
const feature = store.getFeature(featureId);
|
|
50
|
+
if (!feature)
|
|
51
|
+
return 0;
|
|
52
|
+
// Within the same part and the same ring, delete in descending index order
|
|
53
|
+
// (avoids the shift caused by earlier deletions; for MultiPoint the part itself
|
|
54
|
+
// disappears, so parts are in descending order too)
|
|
55
|
+
const sortedRefs = sortVertexRefsForDeletion(vertices);
|
|
56
|
+
let coords = JSON.parse(JSON.stringify(feature.coordinates));
|
|
57
|
+
let deletedCount = 0;
|
|
58
|
+
for (const ref of sortedRefs) {
|
|
59
|
+
const result = deleteVertexOp({ ...feature, coordinates: coords }, ref);
|
|
60
|
+
if (result !== null) {
|
|
61
|
+
coords = result;
|
|
62
|
+
deletedCount++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (deletedCount > 0) {
|
|
66
|
+
store.transact(() => {
|
|
67
|
+
store.updateFeature(featureId, { coordinates: coords });
|
|
68
|
+
// If the deleted vertices were selected, clear the selection
|
|
69
|
+
const selectedVertices = store.getSelectedVertices();
|
|
70
|
+
if (selectedVertices?.featureId === featureId) {
|
|
71
|
+
store.setSelectedVertices(null);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return deletedCount;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { ScreenPoint } from '../shared/math/index.js';
|
|
2
|
+
import type { ResolvedSnapOptions, SnapContext, SnapLngLat, SnapProvider, SnapResult, SnapTargetKind } from '../snapping/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The snapping of a draw instance, reached as `draw.snapping`: switching it at runtime,
|
|
5
|
+
* reading its settings and adding candidates.
|
|
6
|
+
*
|
|
7
|
+
* Snapping replaces the coordinate of a click, a move or a drag with the nearest candidate
|
|
8
|
+
* within the tolerance, before any mode sees it, so it works the same way in every mode and
|
|
9
|
+
* for vertex dragging. The initial settings come from {@link Options.snap}. Holding the
|
|
10
|
+
* modifier of `disableKey` (Alt by default) releases it while held. Every change of the
|
|
11
|
+
* result is announced by the `draw.snap.change` event.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* draw.snapping.setEnabled(false);
|
|
16
|
+
* draw.snapping.setKindEnabled('guide', false); // turn off guides only
|
|
17
|
+
* const unregister = draw.snapping.register(myProvider);
|
|
18
|
+
* unregister();
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export interface SnappingOperations {
|
|
22
|
+
/**
|
|
23
|
+
* Registers a provider of snapping candidates.
|
|
24
|
+
*
|
|
25
|
+
* The candidates are mixed in on top of the built-in providers (the vertices and edges of
|
|
26
|
+
* the Store) and compete with them by distance and priority. On a destroyed instance the
|
|
27
|
+
* registration is ignored.
|
|
28
|
+
*
|
|
29
|
+
* @param provider the provider to register
|
|
30
|
+
* @returns a function that unregisters it
|
|
31
|
+
*/
|
|
32
|
+
register(provider: SnapProvider): () => void;
|
|
33
|
+
/**
|
|
34
|
+
* Enables or disables snapping.
|
|
35
|
+
*
|
|
36
|
+
* The initial value is `options.snap.enabled` (default true). A change takes effect from the
|
|
37
|
+
* next input.
|
|
38
|
+
*
|
|
39
|
+
* @param enabled true to snap, false to pass every coordinate through as it is
|
|
40
|
+
*/
|
|
41
|
+
setEnabled(enabled: boolean): void;
|
|
42
|
+
/** Whether snapping is enabled */
|
|
43
|
+
isEnabled(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Enables or disables snapping per kind (vertex / edge / intersection / guide).
|
|
46
|
+
*
|
|
47
|
+
* The initial value is `options.snap.kinds` (all true by default). The candidates of a
|
|
48
|
+
* disabled kind are excluded from the evaluation, even when a provider returns them.
|
|
49
|
+
*
|
|
50
|
+
* @param kind the kind of target
|
|
51
|
+
* @param enabled whether that kind is snapped to
|
|
52
|
+
*/
|
|
53
|
+
setKindEnabled(kind: SnapTargetKind, enabled: boolean): void;
|
|
54
|
+
/**
|
|
55
|
+
* Whether the kind is enabled
|
|
56
|
+
*
|
|
57
|
+
* @param kind the kind of target
|
|
58
|
+
*/
|
|
59
|
+
isKindEnabled(kind: SnapTargetKind): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Switches whether datasets (data that is only displayed) are included as
|
|
62
|
+
* snapping targets.
|
|
63
|
+
*
|
|
64
|
+
* The initial value is `options.snap.datasets` (default true). Setting it to false stops
|
|
65
|
+
* only the snapping to that data; snapping to the features of the Store remains.
|
|
66
|
+
*
|
|
67
|
+
* @param enabled whether datasets are snapping targets
|
|
68
|
+
*/
|
|
69
|
+
setDatasetsEnabled(enabled: boolean): void;
|
|
70
|
+
/** Whether datasets are snapping targets */
|
|
71
|
+
isDatasetsEnabled(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Sets the step angle of the built-in north-based guides.
|
|
74
|
+
*
|
|
75
|
+
* The initial value is `options.snap.guideStepDegrees` (default 45, which gives 8 guides).
|
|
76
|
+
* The change takes effect from the next snapping query. A value of 0 or less, or a
|
|
77
|
+
* non-finite value, gives the default 45. The current value is in
|
|
78
|
+
* `getOptions().guideStepDegrees`. Guides added with `createGuideSnapProvider` keep their
|
|
79
|
+
* own step.
|
|
80
|
+
*
|
|
81
|
+
* @param degrees the step angle in degrees, counted from true north
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* draw.snapping.setGuideStep(15); // 24 guides, every 15 degrees
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
setGuideStep(degrees: number): void;
|
|
89
|
+
/**
|
|
90
|
+
* Gets the snapping options with the defaults filled in.
|
|
91
|
+
*
|
|
92
|
+
* enabled, kinds, display and guideStepDegrees are the current values, reflecting the changes made at runtime.
|
|
93
|
+
* `kinds` is a copy with every kind filled in, so changing it has no effect. A settings UI
|
|
94
|
+
* reads its current values here.
|
|
95
|
+
*/
|
|
96
|
+
getOptions(): ResolvedSnapOptions;
|
|
97
|
+
/**
|
|
98
|
+
* Gets the most recent snapping result.
|
|
99
|
+
*
|
|
100
|
+
* null if nothing has been resolved yet. When nothing is snapped, it returns a SnapResult
|
|
101
|
+
* with no target.
|
|
102
|
+
*/
|
|
103
|
+
getResult(): SnapResult | null;
|
|
104
|
+
/**
|
|
105
|
+
* Resolves snapping for a coordinate.
|
|
106
|
+
*
|
|
107
|
+
* There is no need to call it for normal input, because the InputRouter passes it through
|
|
108
|
+
* automatically. It is the entry point for when a coordinate produced outside the library,
|
|
109
|
+
* such as numeric input or synthetic input, should be passed through snapping.
|
|
110
|
+
*
|
|
111
|
+
* @param lngLat the input coordinate
|
|
112
|
+
* @param point the screen coordinate (when omitted, it is computed with map.project)
|
|
113
|
+
* @param ctx overrides for the context (when omitted, zoom is the current zoom and
|
|
114
|
+
* modifiers are all false)
|
|
115
|
+
* @returns the snapped coordinate and what it snapped to; the input coordinate with no
|
|
116
|
+
* target when nothing is within the tolerance
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const { lngLat, target } = draw.snapping.resolve({ lng: 139.7, lat: 35.68 });
|
|
121
|
+
* if (target) console.log('snapped to a', target.kind);
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
resolve(lngLat: SnapLngLat, point?: ScreenPoint, ctx?: Partial<SnapContext>): SnapResult;
|
|
125
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** The state in which no modifier key is pressed */
|
|
4
|
+
const NO_MODIFIERS = { shift: false, ctrl: false, alt: false, meta: false };
|
|
5
|
+
/** @internal */
|
|
6
|
+
export function createSnappingApi(deps) {
|
|
7
|
+
const { snapService, map } = deps;
|
|
8
|
+
return {
|
|
9
|
+
snapping: {
|
|
10
|
+
register(provider) {
|
|
11
|
+
return snapService.register(provider);
|
|
12
|
+
},
|
|
13
|
+
setEnabled(enabled) {
|
|
14
|
+
snapService.setEnabled(enabled);
|
|
15
|
+
},
|
|
16
|
+
isEnabled() {
|
|
17
|
+
return snapService.isEnabled();
|
|
18
|
+
},
|
|
19
|
+
setKindEnabled(kind, enabled) {
|
|
20
|
+
snapService.setKindEnabled(kind, enabled);
|
|
21
|
+
},
|
|
22
|
+
isKindEnabled(kind) {
|
|
23
|
+
return snapService.isKindEnabled(kind);
|
|
24
|
+
},
|
|
25
|
+
setDatasetsEnabled(enabled) {
|
|
26
|
+
snapService.setDatasetsEnabled(enabled);
|
|
27
|
+
},
|
|
28
|
+
isDatasetsEnabled() {
|
|
29
|
+
return snapService.isDatasetsEnabled();
|
|
30
|
+
},
|
|
31
|
+
setGuideStep(degrees) {
|
|
32
|
+
snapService.setGuideStep(degrees);
|
|
33
|
+
},
|
|
34
|
+
getOptions() {
|
|
35
|
+
return snapService.getOptions();
|
|
36
|
+
},
|
|
37
|
+
getResult() {
|
|
38
|
+
return snapService.getResult();
|
|
39
|
+
},
|
|
40
|
+
resolve(lngLat, point, ctx) {
|
|
41
|
+
const screenPoint = point ?? map.project([lngLat.lng, lngLat.lat]);
|
|
42
|
+
return snapService.resolve(lngLat, { x: screenPoint.x, y: screenPoint.y }, {
|
|
43
|
+
zoom: map.getZoom(),
|
|
44
|
+
modifiers: { ...NO_MODIFIERS },
|
|
45
|
+
...ctx,
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The topology settings of a draw instance, reached as `draw.topology`: switching at runtime
|
|
3
|
+
* the settings that keep editing from breaking boundaries shared by adjacent features.
|
|
4
|
+
*
|
|
5
|
+
* The initial values come from {@link Options.topology}. A switch takes effect from the next
|
|
6
|
+
* drag start and does not affect a drag in progress.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* sharedVertexToggle.onchange = () => {
|
|
11
|
+
* draw.topology.setSharedVertexDrag(sharedVertexToggle.checked);
|
|
12
|
+
* };
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export interface TopologyOperations {
|
|
16
|
+
/**
|
|
17
|
+
* Enables or disables simultaneous movement of shared vertices.
|
|
18
|
+
*
|
|
19
|
+
* The initial value is `options.topology.sharedVertexDrag` (the core default is false).
|
|
20
|
+
* While it is enabled, dragging a vertex also moves other features that have a vertex at
|
|
21
|
+
* an exact match (tolerance 0), and the following vertices are highlighted during the drag.
|
|
22
|
+
* The following features must be visible and unlocked, and be of a type whose vertices can
|
|
23
|
+
* be edited (not Circle, Image or Freehand). The drag commits as one change, one notification.
|
|
24
|
+
*
|
|
25
|
+
* @param enabled whether shared vertices move together
|
|
26
|
+
*/
|
|
27
|
+
setSharedVertexDrag(enabled: boolean): void;
|
|
28
|
+
/** Whether simultaneous movement of shared vertices is enabled */
|
|
29
|
+
isSharedVertexDrag(): boolean;
|
|
30
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** @internal */
|
|
4
|
+
export function createTopologyApi(deps) {
|
|
5
|
+
const { topology } = deps;
|
|
6
|
+
return {
|
|
7
|
+
topology: {
|
|
8
|
+
setSharedVertexDrag(enabled) {
|
|
9
|
+
topology.sharedVertexDrag = enabled;
|
|
10
|
+
},
|
|
11
|
+
isSharedVertexDrag() {
|
|
12
|
+
return topology.sharedVertexDrag;
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The edge tracing of a draw instance, reached as `draw.tracing`.
|
|
3
|
+
*
|
|
4
|
+
* In draw_line / draw_polygon, when the previous click and this click both snapped to the
|
|
5
|
+
* boundary (a vertex or an edge) of the same feature, the boundary vertices between them are
|
|
6
|
+
* inserted: the shortest path along the edges of the visible features nearby, across shared
|
|
7
|
+
* vertices. It needs snapping, so it does not hold while snapping is off or released. The
|
|
8
|
+
* path is previewed while the pointer moves.
|
|
9
|
+
* The initial value comes from {@link Options.trace}; the path itself is computed by
|
|
10
|
+
* {@link buildTraceGraph} and {@link findTracePath}.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* draw.tracing.setEnabled(false);
|
|
15
|
+
* draw.tracing.isEnabled(); // false
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export interface TracingOperations {
|
|
19
|
+
/**
|
|
20
|
+
* Enables or disables tracing.
|
|
21
|
+
*
|
|
22
|
+
* The initial value is `options.trace.enabled` (default true). When it is disabled, the
|
|
23
|
+
* clicks and the preview while drawing add only the point clicked. A change takes effect
|
|
24
|
+
* from the next click or move.
|
|
25
|
+
*
|
|
26
|
+
* @param enabled whether to trace
|
|
27
|
+
*/
|
|
28
|
+
setEnabled(enabled: boolean): void;
|
|
29
|
+
/** Whether tracing is enabled */
|
|
30
|
+
isEnabled(): boolean;
|
|
31
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** @internal */
|
|
4
|
+
export function createTracingApi(deps) {
|
|
5
|
+
const { trace } = deps;
|
|
6
|
+
return {
|
|
7
|
+
tracing: {
|
|
8
|
+
setEnabled(enabled) {
|
|
9
|
+
trace.enabled = enabled;
|
|
10
|
+
},
|
|
11
|
+
isEnabled() {
|
|
12
|
+
return trace.enabled;
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BoundingBox, Feature } from '../../store/types.js';
|
|
2
|
+
import type { BoxSelectionStrategy } from './box-strategy.js';
|
|
3
|
+
/**
|
|
4
|
+
* Box selection test for Circle
|
|
5
|
+
*
|
|
6
|
+
* It tests the intersection between the selection box and the ring of the circle, which is
|
|
7
|
+
* expressed as a center plus a radius (in meters). Testing with the center point alone
|
|
8
|
+
* would fail to select a circle whose ring overlaps the box widely while its center is
|
|
9
|
+
* outside the box.
|
|
10
|
+
*
|
|
11
|
+
* In geographic coordinate (lng/lat) space a circle becomes an ellipse stretched by a
|
|
12
|
+
* factor of 1/cos(lat) along the longitude axis, so the latitude axis is normalized by a
|
|
13
|
+
* factor of rLng/rLat to turn it back into a true circle, and the box is put through the
|
|
14
|
+
* same transformation before the test.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CircleBoxSelectionStrategy implements BoxSelectionStrategy {
|
|
17
|
+
readonly featureType: "Circle";
|
|
18
|
+
intersects(feature: Feature, rect: BoundingBox): boolean;
|
|
19
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* BoxSelectionStrategies
|
|
5
|
+
*
|
|
6
|
+
* The basic BoxSelectionStrategy implementations of the core edition.
|
|
7
|
+
* They provide the intersection test logic for box selection of each feature type.
|
|
8
|
+
*/
|
|
9
|
+
import { createOBB, DEFAULT_TILE_SIZE, getMetersPerPixel, getOBBCorners, metersToDegreesLat, metersToDegreesLng, pointInRectangle, rectangleIntersectsCircle, rectangleIntersectsLineString, rectangleIntersectsOBB, rectangleIntersectsPolygon, } from '../../shared/math/index.js';
|
|
10
|
+
import { getCircleRadius, getImageProperties } from '../../shared/utils/property.js';
|
|
11
|
+
/**
|
|
12
|
+
* Box selection test for Point
|
|
13
|
+
*
|
|
14
|
+
* It tests whether the center coordinate is contained in the box.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export class PointBoxSelectionStrategy {
|
|
19
|
+
constructor() {
|
|
20
|
+
Object.defineProperty(this, "featureType", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value: 'Point'
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
intersects(feature, rect) {
|
|
28
|
+
if (feature.type !== 'Point')
|
|
29
|
+
return false;
|
|
30
|
+
const coord = feature.coordinates;
|
|
31
|
+
return pointInRectangle(coord, rect);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Box selection test for LineString
|
|
36
|
+
*
|
|
37
|
+
* It tests the intersection between the geometry and the selection box.
|
|
38
|
+
* true when any vertex is inside the box, or any edge intersects the box.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export class LineStringBoxSelectionStrategy {
|
|
43
|
+
constructor() {
|
|
44
|
+
Object.defineProperty(this, "featureType", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
configurable: true,
|
|
47
|
+
writable: true,
|
|
48
|
+
value: 'LineString'
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
intersects(feature, rect) {
|
|
52
|
+
if (feature.type !== 'LineString')
|
|
53
|
+
return false;
|
|
54
|
+
const coords = feature.coordinates;
|
|
55
|
+
return rectangleIntersectsLineString(rect, coords);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Box selection test for Polygon
|
|
60
|
+
*
|
|
61
|
+
* It tests the intersection between the geometry and the selection box.
|
|
62
|
+
* true when any vertex of the polygon is inside the box,
|
|
63
|
+
* or any vertex of the box is inside the polygon,
|
|
64
|
+
* or any edge of the polygon intersects the box.
|
|
65
|
+
*
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
export class PolygonBoxSelectionStrategy {
|
|
69
|
+
constructor() {
|
|
70
|
+
Object.defineProperty(this, "featureType", {
|
|
71
|
+
enumerable: true,
|
|
72
|
+
configurable: true,
|
|
73
|
+
writable: true,
|
|
74
|
+
value: 'Polygon'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
intersects(feature, rect) {
|
|
78
|
+
if (feature.type !== 'Polygon')
|
|
79
|
+
return false;
|
|
80
|
+
const rings = feature.coordinates;
|
|
81
|
+
return rectangleIntersectsPolygon(rect, rings);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Box selection test for MultiPoint
|
|
86
|
+
*
|
|
87
|
+
* true when any part (a point) is inside the box.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
export class MultiPointBoxSelectionStrategy {
|
|
92
|
+
constructor() {
|
|
93
|
+
Object.defineProperty(this, "featureType", {
|
|
94
|
+
enumerable: true,
|
|
95
|
+
configurable: true,
|
|
96
|
+
writable: true,
|
|
97
|
+
value: 'MultiPoint'
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
intersects(feature, rect) {
|
|
101
|
+
if (feature.type !== 'MultiPoint')
|
|
102
|
+
return false;
|
|
103
|
+
const parts = feature.coordinates;
|
|
104
|
+
return parts.some((coord) => pointInRectangle(coord, rect));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Box selection test for MultiLineString
|
|
109
|
+
*
|
|
110
|
+
* true when any part (a polyline) intersects the box.
|
|
111
|
+
*
|
|
112
|
+
* @internal
|
|
113
|
+
*/
|
|
114
|
+
export class MultiLineStringBoxSelectionStrategy {
|
|
115
|
+
constructor() {
|
|
116
|
+
Object.defineProperty(this, "featureType", {
|
|
117
|
+
enumerable: true,
|
|
118
|
+
configurable: true,
|
|
119
|
+
writable: true,
|
|
120
|
+
value: 'MultiLineString'
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
intersects(feature, rect) {
|
|
124
|
+
if (feature.type !== 'MultiLineString')
|
|
125
|
+
return false;
|
|
126
|
+
const parts = feature.coordinates;
|
|
127
|
+
return parts.some((coords) => rectangleIntersectsLineString(rect, coords));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Box selection test for MultiPolygon
|
|
132
|
+
*
|
|
133
|
+
* true when any part (an array of rings) intersects the box.
|
|
134
|
+
*
|
|
135
|
+
* @internal
|
|
136
|
+
*/
|
|
137
|
+
export class MultiPolygonBoxSelectionStrategy {
|
|
138
|
+
constructor() {
|
|
139
|
+
Object.defineProperty(this, "featureType", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
configurable: true,
|
|
142
|
+
writable: true,
|
|
143
|
+
value: 'MultiPolygon'
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
intersects(feature, rect) {
|
|
147
|
+
if (feature.type !== 'MultiPolygon')
|
|
148
|
+
return false;
|
|
149
|
+
const parts = feature.coordinates;
|
|
150
|
+
return parts.some((rings) => rings.length > 0 && rectangleIntersectsPolygon(rect, rings));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Box selection test for Image
|
|
155
|
+
*
|
|
156
|
+
* It tests the intersection between the OBB (a bounding box that accounts for the
|
|
157
|
+
* rotation) and the selection box.
|
|
158
|
+
*
|
|
159
|
+
* @internal
|
|
160
|
+
*/
|
|
161
|
+
export class ImageBoxSelectionStrategy {
|
|
162
|
+
constructor(tileSize = DEFAULT_TILE_SIZE) {
|
|
163
|
+
Object.defineProperty(this, "featureType", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
configurable: true,
|
|
166
|
+
writable: true,
|
|
167
|
+
value: 'Image'
|
|
168
|
+
});
|
|
169
|
+
Object.defineProperty(this, "tileSize", {
|
|
170
|
+
enumerable: true,
|
|
171
|
+
configurable: true,
|
|
172
|
+
writable: true,
|
|
173
|
+
value: void 0
|
|
174
|
+
});
|
|
175
|
+
this.tileSize = tileSize;
|
|
176
|
+
}
|
|
177
|
+
intersects(feature, rect) {
|
|
178
|
+
if (feature.type !== 'Image')
|
|
179
|
+
return false;
|
|
180
|
+
const obb = this.createOBBForImage(feature);
|
|
181
|
+
if (!obb) {
|
|
182
|
+
// When the OBB cannot be created, test with the coordinate alone
|
|
183
|
+
const coord = feature.coordinates;
|
|
184
|
+
return pointInRectangle(coord, rect);
|
|
185
|
+
}
|
|
186
|
+
const corners = getOBBCorners(obb);
|
|
187
|
+
return rectangleIntersectsOBB(rect, { corners });
|
|
188
|
+
}
|
|
189
|
+
createOBBForImage(feature) {
|
|
190
|
+
const properties = getImageProperties(feature);
|
|
191
|
+
if (!properties.imageFileId)
|
|
192
|
+
return null;
|
|
193
|
+
const coord = feature.coordinates;
|
|
194
|
+
const latitude = coord[1];
|
|
195
|
+
const style = feature.style;
|
|
196
|
+
const imageWidth = properties.imageWidth || 100;
|
|
197
|
+
const imageHeight = properties.imageHeight || 100;
|
|
198
|
+
const displayWidth = style?.width || imageWidth;
|
|
199
|
+
const displayHeight = style?.height || imageHeight;
|
|
200
|
+
const createdZoom = properties.createdZoom || 14;
|
|
201
|
+
const scale = properties.scale || 1;
|
|
202
|
+
const widthMeters = getMetersPerPixel(latitude, createdZoom, this.tileSize) * displayWidth * scale;
|
|
203
|
+
const heightMeters = getMetersPerPixel(latitude, createdZoom, this.tileSize) * displayHeight * scale;
|
|
204
|
+
const widthDeg = metersToDegreesLng(widthMeters, latitude);
|
|
205
|
+
const heightDeg = metersToDegreesLat(heightMeters);
|
|
206
|
+
const rotation = (style?.rotation || 0) + (properties.rotation || 0);
|
|
207
|
+
return createOBB(coord[0], coord[1], widthDeg, heightDeg, rotation);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Box selection test for Circle
|
|
212
|
+
*
|
|
213
|
+
* It tests the intersection between the selection box and the ring of the circle, which is
|
|
214
|
+
* expressed as a center plus a radius (in meters). Testing with the center point alone
|
|
215
|
+
* would fail to select a circle whose ring overlaps the box widely while its center is
|
|
216
|
+
* outside the box.
|
|
217
|
+
*
|
|
218
|
+
* In geographic coordinate (lng/lat) space a circle becomes an ellipse stretched by a
|
|
219
|
+
* factor of 1/cos(lat) along the longitude axis, so the latitude axis is normalized by a
|
|
220
|
+
* factor of rLng/rLat to turn it back into a true circle, and the box is put through the
|
|
221
|
+
* same transformation before the test.
|
|
222
|
+
*/
|
|
223
|
+
export class CircleBoxSelectionStrategy {
|
|
224
|
+
constructor() {
|
|
225
|
+
Object.defineProperty(this, "featureType", {
|
|
226
|
+
enumerable: true,
|
|
227
|
+
configurable: true,
|
|
228
|
+
writable: true,
|
|
229
|
+
value: 'Circle'
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
intersects(feature, rect) {
|
|
233
|
+
if (feature.type !== 'Circle')
|
|
234
|
+
return false;
|
|
235
|
+
const center = feature.coordinates;
|
|
236
|
+
const radiusMeters = getCircleRadius(feature);
|
|
237
|
+
if (!radiusMeters || radiusMeters <= 0) {
|
|
238
|
+
return pointInRectangle(center, rect);
|
|
239
|
+
}
|
|
240
|
+
const rLng = metersToDegreesLng(radiusMeters, center[1]);
|
|
241
|
+
const rLat = metersToDegreesLat(radiusMeters);
|
|
242
|
+
if (rLng <= 0 || rLat <= 0) {
|
|
243
|
+
return pointInRectangle(center, rect);
|
|
244
|
+
}
|
|
245
|
+
// Normalize the latitude axis by k = rLng/rLat -> the ellipse becomes a true circle of
|
|
246
|
+
// radius rLng. The box is axis-aligned, so multiplying each y coordinate by k is an
|
|
247
|
+
// equivalent transformation.
|
|
248
|
+
const k = rLng / rLat;
|
|
249
|
+
const normRect = {
|
|
250
|
+
minX: rect.minX,
|
|
251
|
+
maxX: rect.maxX,
|
|
252
|
+
minY: rect.minY * k,
|
|
253
|
+
maxY: rect.maxY * k,
|
|
254
|
+
};
|
|
255
|
+
const normCenter = [center[0], center[1] * k];
|
|
256
|
+
return rectangleIntersectsCircle(normRect, normCenter, rLng);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Creates every BoxSelectionStrategy of the core edition
|
|
261
|
+
*
|
|
262
|
+
* @internal
|
|
263
|
+
*/
|
|
264
|
+
export function createCoreBoxSelectionStrategies(tileSize = DEFAULT_TILE_SIZE) {
|
|
265
|
+
return [
|
|
266
|
+
new PointBoxSelectionStrategy(),
|
|
267
|
+
new LineStringBoxSelectionStrategy(),
|
|
268
|
+
new PolygonBoxSelectionStrategy(),
|
|
269
|
+
new MultiPointBoxSelectionStrategy(),
|
|
270
|
+
new MultiLineStringBoxSelectionStrategy(),
|
|
271
|
+
new MultiPolygonBoxSelectionStrategy(),
|
|
272
|
+
new CircleBoxSelectionStrategy(),
|
|
273
|
+
new ImageBoxSelectionStrategy(tileSize),
|
|
274
|
+
];
|
|
275
|
+
}
|