@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,166 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Rotation operation
|
|
5
|
+
*
|
|
6
|
+
* The operation that rotates features. It rotates in Web Mercator (see mercator-plane.ts),
|
|
7
|
+
* which is conformal, so the shape on the map is kept however large the feature is and however
|
|
8
|
+
* often it is rotated. The extension points of the draw instance are passed in as an argument
|
|
9
|
+
* ({@link RotateExtensions}).
|
|
10
|
+
*/
|
|
11
|
+
import { fromPlane, toPlane } from '../shared/math/mercator-plane.js';
|
|
12
|
+
import { mapCoordinatesDeep } from '../shared/utils/coordinates.js';
|
|
13
|
+
import { getImageProperties } from '../shared/utils/property.js';
|
|
14
|
+
/**
|
|
15
|
+
* Decides whether a feature has a rotation property
|
|
16
|
+
*
|
|
17
|
+
* It covers Image, the custom feature types registered with resizeStrategy: 'scale' in the
|
|
18
|
+
* draw instance's registry (they rotate through the rotation property even when it is not
|
|
19
|
+
* set yet), and features that have a rotation property in properties.
|
|
20
|
+
*/
|
|
21
|
+
function hasRotationProperty(feature, extensions) {
|
|
22
|
+
// Image is covered explicitly
|
|
23
|
+
if (feature.type === 'Image') {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
// A custom type that scales (rather than rewriting its coordinates) rotates by property
|
|
27
|
+
if (extensions?.getResizeStrategy(feature.type) === 'scale') {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
// Also covers features that have a rotation property in properties
|
|
31
|
+
return (feature.properties !== null &&
|
|
32
|
+
typeof feature.properties === 'object' &&
|
|
33
|
+
'rotation' in feature.properties);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Gets the value of the rotation property of a feature
|
|
37
|
+
*/
|
|
38
|
+
function getFeatureRotation(feature) {
|
|
39
|
+
if (feature.type === 'Image') {
|
|
40
|
+
const props = getImageProperties(feature);
|
|
41
|
+
return props.rotation ?? 0;
|
|
42
|
+
}
|
|
43
|
+
const props = feature.properties;
|
|
44
|
+
return typeof props.rotation === 'number' ? props.rotation : 0;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Computes the angle of a point around the center (radians, counterclockwise from east, in
|
|
48
|
+
* the transform plane)
|
|
49
|
+
*/
|
|
50
|
+
function computeAngle(center, point) {
|
|
51
|
+
const [cx, cy] = toPlane(center);
|
|
52
|
+
const [px, py] = toPlane([point.lng, point.lat]);
|
|
53
|
+
return Math.atan2(py - cy, px - cx);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Rotates a coordinate around the center in the transform plane
|
|
57
|
+
*/
|
|
58
|
+
function rotateCoordinate(coord, center, angle) {
|
|
59
|
+
const cos = Math.cos(angle);
|
|
60
|
+
const sin = Math.sin(angle);
|
|
61
|
+
const [cx, cy] = toPlane(center);
|
|
62
|
+
const [x, y] = toPlane(coord);
|
|
63
|
+
const dx = x - cx;
|
|
64
|
+
const dy = y - cy;
|
|
65
|
+
return fromPlane(cx + dx * cos - dy * sin, cy + dx * sin + dy * cos);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Rotates an array of coordinates
|
|
69
|
+
*
|
|
70
|
+
* It uses a common traversal that does not depend on the nesting depth, so Multi
|
|
71
|
+
* geometries (a MultiPolygon is nested 4 levels deep) can be rotated as they are.
|
|
72
|
+
*/
|
|
73
|
+
function rotateCoordinates(coords, center, angle) {
|
|
74
|
+
return mapCoordinatesDeep(coords, (coord) => rotateCoordinate(coord, center, angle));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Computes the rotation
|
|
78
|
+
*
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
export function computeRotation(state, currentLngLat, features) {
|
|
82
|
+
const { startAngle, center } = state;
|
|
83
|
+
// Compute the current angle
|
|
84
|
+
const currentAngle = computeAngle(center, currentLngLat);
|
|
85
|
+
// Compute the amount of rotation
|
|
86
|
+
const deltaAngle = currentAngle - startAngle;
|
|
87
|
+
// Compute the new coordinates of each feature
|
|
88
|
+
const result = new Map();
|
|
89
|
+
// Decide whether there are only features with a rotation property (the case of a
|
|
90
|
+
// single selection where the coordinates are not changed). Which features rotate by
|
|
91
|
+
// property was decided when the rotation started (initialRotations)
|
|
92
|
+
const byProperty = (f) => state.initialRotations.has(f.id);
|
|
93
|
+
const rotationFeatures = features.filter(byProperty);
|
|
94
|
+
const otherFeatures = features.filter((f) => !byProperty(f));
|
|
95
|
+
const isSingleRotationFeature = rotationFeatures.length === 1 && otherFeatures.length === 0;
|
|
96
|
+
for (const feature of features) {
|
|
97
|
+
const initialCoords = state.initialCoordinates.get(feature.id);
|
|
98
|
+
if (!initialCoords)
|
|
99
|
+
continue;
|
|
100
|
+
if (byProperty(feature)) {
|
|
101
|
+
// For a feature that has a rotation property (Image, custom types and so on)
|
|
102
|
+
// rotation is stored in degrees (because the rendering side expects degrees)
|
|
103
|
+
const initialRotation = state.initialRotations.get(feature.id) ?? 0;
|
|
104
|
+
const deltaAngleDeg = (deltaAngle * 180) / Math.PI;
|
|
105
|
+
const newRotation = initialRotation + deltaAngleDeg;
|
|
106
|
+
if (isSingleRotationFeature) {
|
|
107
|
+
// For a single selection: leave the coordinates unchanged and change only rotation
|
|
108
|
+
result.set(feature.id, {
|
|
109
|
+
coordinates: initialCoords,
|
|
110
|
+
rotation: newRotation,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// For a multiple selection: rotate the coordinates too, around the center
|
|
115
|
+
const newCoords = rotateCoordinates(initialCoords, center, deltaAngle);
|
|
116
|
+
result.set(feature.id, {
|
|
117
|
+
coordinates: newCoords,
|
|
118
|
+
rotation: newRotation,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Point, LineString, Polygon and so on: change only the coordinates
|
|
124
|
+
const newCoords = rotateCoordinates(initialCoords, center, deltaAngle);
|
|
125
|
+
result.set(feature.id, { coordinates: newCoords });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Starts the rotation operation
|
|
132
|
+
*
|
|
133
|
+
* @param extensions The draw instance's extension points (a custom type registered with
|
|
134
|
+
* resizeStrategy: 'scale' rotates through its rotation property)
|
|
135
|
+
*
|
|
136
|
+
* @internal
|
|
137
|
+
*/
|
|
138
|
+
export function startRotation(startLngLat, bbox, features, extensions) {
|
|
139
|
+
const center = bbox.center;
|
|
140
|
+
const startAngle = computeAngle(center, startLngLat);
|
|
141
|
+
const initialCoordinates = new Map();
|
|
142
|
+
const initialRotations = new Map();
|
|
143
|
+
for (const feature of features) {
|
|
144
|
+
initialCoordinates.set(feature.id, JSON.parse(JSON.stringify(feature.coordinates)));
|
|
145
|
+
// For a feature that has a rotation property, store the initial rotation angle
|
|
146
|
+
if (hasRotationProperty(feature, extensions)) {
|
|
147
|
+
initialRotations.set(feature.id, getFeatureRotation(feature));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
startLngLat,
|
|
152
|
+
startAngle,
|
|
153
|
+
center,
|
|
154
|
+
initialCoordinates,
|
|
155
|
+
initialRotations,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Gets the rotation angle (for debugging)
|
|
160
|
+
*
|
|
161
|
+
* @internal
|
|
162
|
+
*/
|
|
163
|
+
export function getRotationDelta(state, currentLngLat) {
|
|
164
|
+
const currentAngle = computeAngle(state.center, currentLngLat);
|
|
165
|
+
return currentAngle - state.startAngle;
|
|
166
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Store } from '../store/store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Deletes what is selected, as one change. The Delete key of the select mode and
|
|
4
|
+
* `draw.deleteSelection()` both run this.
|
|
5
|
+
*
|
|
6
|
+
* - vertices selected: deletes those vertices
|
|
7
|
+
* - feature: deletes the selected features
|
|
8
|
+
* - group: deletes the contents of the group (its features) (a group that becomes empty is
|
|
9
|
+
* deleted automatically)
|
|
10
|
+
* - layer: deletes the layer (the features / groups under it are deleted too). At least one
|
|
11
|
+
* layer is kept
|
|
12
|
+
*
|
|
13
|
+
* A deletion never removes a locked feature: a group loses only its unlocked members (it
|
|
14
|
+
* stays with the locked ones), and a layer that holds a locked feature or group is not
|
|
15
|
+
* deleted.
|
|
16
|
+
*
|
|
17
|
+
* @returns true when something was deleted; false while read-only or the interaction lock is
|
|
18
|
+
* on, when nothing is selected, or when everything selected is locked
|
|
19
|
+
*/
|
|
20
|
+
export declare function deleteSelection(store: Store): boolean;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Selection operations
|
|
5
|
+
*
|
|
6
|
+
* Deletes what is selected. The Delete key of the select mode (modes/) and
|
|
7
|
+
* `draw.deleteSelection()` (api/) both call this, so the two paths delete the same things.
|
|
8
|
+
*/
|
|
9
|
+
import { isFeatureLocked, isGroupLocked } from '../store/lock.js';
|
|
10
|
+
import { deleteVertex as deleteVertexOp, sortVertexRefsForDeletion } from './vertex.js';
|
|
11
|
+
/**
|
|
12
|
+
* Deletes what is selected, as one change. The Delete key of the select mode and
|
|
13
|
+
* `draw.deleteSelection()` both run this.
|
|
14
|
+
*
|
|
15
|
+
* - vertices selected: deletes those vertices
|
|
16
|
+
* - feature: deletes the selected features
|
|
17
|
+
* - group: deletes the contents of the group (its features) (a group that becomes empty is
|
|
18
|
+
* deleted automatically)
|
|
19
|
+
* - layer: deletes the layer (the features / groups under it are deleted too). At least one
|
|
20
|
+
* layer is kept
|
|
21
|
+
*
|
|
22
|
+
* A deletion never removes a locked feature: a group loses only its unlocked members (it
|
|
23
|
+
* stays with the locked ones), and a layer that holds a locked feature or group is not
|
|
24
|
+
* deleted.
|
|
25
|
+
*
|
|
26
|
+
* @returns true when something was deleted; false while read-only or the interaction lock is
|
|
27
|
+
* on, when nothing is selected, or when everything selected is locked
|
|
28
|
+
*/
|
|
29
|
+
export function deleteSelection(store) {
|
|
30
|
+
// Do not start a deletion while readOnly / the interaction lock is on (group and layer
|
|
31
|
+
// deletion does not go through the per-feature isFeatureLocked).
|
|
32
|
+
if (store.isReadOnly() || store.isInteractionLocked())
|
|
33
|
+
return false;
|
|
34
|
+
// Delete the vertices when vertices are selected
|
|
35
|
+
const selectedVertices = store.getSelectedVertices();
|
|
36
|
+
if (selectedVertices && selectedVertices.vertexIndices.length > 0) {
|
|
37
|
+
return deleteSelectedVertices(store, selectedVertices) > 0;
|
|
38
|
+
}
|
|
39
|
+
const selection = store.getSelection();
|
|
40
|
+
if (selection.ids.length === 0)
|
|
41
|
+
return false;
|
|
42
|
+
if (selection.type === 'feature') {
|
|
43
|
+
// Locked features (themselves / their group / their layer) are not deleted
|
|
44
|
+
const selectedIds = selection.ids.filter((id) => {
|
|
45
|
+
const feature = store.getFeature(id);
|
|
46
|
+
return feature !== undefined && !isFeatureLocked(feature, store);
|
|
47
|
+
});
|
|
48
|
+
if (selectedIds.length === 0)
|
|
49
|
+
return false;
|
|
50
|
+
store.transact(() => {
|
|
51
|
+
store.setSelection(null, []);
|
|
52
|
+
for (const id of selectedIds) {
|
|
53
|
+
store.deleteFeature(id);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
if (selection.type === 'group') {
|
|
59
|
+
// Locked groups (themselves / the layer they belong to) are not deleted
|
|
60
|
+
const findLayerOfGroup = (groupId) => store.getAllLayers().find((l) => l.order.includes(groupId));
|
|
61
|
+
const groupIds = selection.ids.filter((groupId) => {
|
|
62
|
+
const group = store.getGroup(groupId);
|
|
63
|
+
return group !== undefined && !isGroupLocked(group, findLayerOfGroup);
|
|
64
|
+
});
|
|
65
|
+
if (groupIds.length === 0)
|
|
66
|
+
return false;
|
|
67
|
+
store.transact(() => {
|
|
68
|
+
store.setSelection(null, []);
|
|
69
|
+
for (const groupId of groupIds) {
|
|
70
|
+
const group = store.getGroup(groupId);
|
|
71
|
+
if (!group)
|
|
72
|
+
continue;
|
|
73
|
+
// Delete the unlocked contents of the group. The group itself is deleted automatically
|
|
74
|
+
// the moment the last feature is removed.
|
|
75
|
+
for (const featureId of [...group.featureIds]) {
|
|
76
|
+
const feature = store.getFeature(featureId);
|
|
77
|
+
if (feature && isFeatureLocked(feature, store))
|
|
78
|
+
continue;
|
|
79
|
+
store.deleteFeature(featureId);
|
|
80
|
+
}
|
|
81
|
+
// When an empty group (a group with no contents) was selected, delete the group itself
|
|
82
|
+
// (a group that keeps locked members stays)
|
|
83
|
+
if (store.getGroup(groupId)?.featureIds.length === 0) {
|
|
84
|
+
store.deleteGroup(groupId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (selection.type === 'layer') {
|
|
91
|
+
// Locked layers, and layers holding a locked feature or group, are not deleted.
|
|
92
|
+
// At least one layer is kept (prevents deleting every layer).
|
|
93
|
+
const layerIds = [...new Set(selection.ids)].filter((layerId) => {
|
|
94
|
+
const layer = store.getLayer(layerId);
|
|
95
|
+
return layer !== undefined && !layer.locked && !holdsLockedItem(store, layerId);
|
|
96
|
+
});
|
|
97
|
+
const deletable = layerIds.slice(0, Math.max(0, store.getAllLayers().length - 1));
|
|
98
|
+
if (deletable.length === 0)
|
|
99
|
+
return false;
|
|
100
|
+
store.transact(() => {
|
|
101
|
+
store.setSelection(null, []);
|
|
102
|
+
for (const layerId of deletable) {
|
|
103
|
+
store.deleteLayer(layerId);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Whether a layer holds a feature or a group that is locked on its own
|
|
112
|
+
*/
|
|
113
|
+
function holdsLockedItem(store, layerId) {
|
|
114
|
+
const layer = store.getLayer(layerId);
|
|
115
|
+
if (!layer)
|
|
116
|
+
return false;
|
|
117
|
+
for (const itemId of layer.order) {
|
|
118
|
+
const group = store.getGroup(itemId);
|
|
119
|
+
if (group?.locked)
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
return store.getAllFeatures().some((f) => f.layerId === layerId && isFeatureLocked(f, store));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Deletes the selected vertices of one feature as one change
|
|
126
|
+
*
|
|
127
|
+
* @returns The number of vertices deleted
|
|
128
|
+
*/
|
|
129
|
+
function deleteSelectedVertices(store, selection) {
|
|
130
|
+
const feature = store.getFeature(selection.featureId);
|
|
131
|
+
if (!feature)
|
|
132
|
+
return 0;
|
|
133
|
+
// The vertices of a locked feature are not deleted
|
|
134
|
+
if (isFeatureLocked(feature, store))
|
|
135
|
+
return 0;
|
|
136
|
+
// Within the same part and the same ring, deletion goes in descending index order
|
|
137
|
+
// (avoiding the shift caused by what was already removed. For MultiPoint the part itself
|
|
138
|
+
// disappears, so parts are in descending order too)
|
|
139
|
+
const sortedRefs = sortVertexRefsForDeletion(selection.vertexIndices);
|
|
140
|
+
// deleteVertex does not mutate its input and returns a new coordinate structure
|
|
141
|
+
// (copy-on-write), so no upfront copy is needed. Successive deletions only need the return
|
|
142
|
+
// value fed into the next input
|
|
143
|
+
let coords = feature.coordinates;
|
|
144
|
+
let deletedCount = 0;
|
|
145
|
+
for (const ref of sortedRefs) {
|
|
146
|
+
const result = deleteVertexOp({ ...feature, coordinates: coords }, ref);
|
|
147
|
+
if (result !== null) {
|
|
148
|
+
coords = result;
|
|
149
|
+
deletedCount++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (deletedCount > 0) {
|
|
153
|
+
store.transact(() => {
|
|
154
|
+
store.updateFeature(selection.featureId, { coordinates: coords });
|
|
155
|
+
store.setSelectedVertices(null);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return deletedCount;
|
|
159
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Simultaneous movement of shared vertices
|
|
5
|
+
*
|
|
6
|
+
* The collection process for moving vertices that adjacent features hold at the
|
|
7
|
+
* same coordinate (shared vertices) together in a single drag. The "features that
|
|
8
|
+
* follow along and their vertex references" are fixed when the drag starts, and no
|
|
9
|
+
* further search is made afterwards (if the set changed during the drag it would
|
|
10
|
+
* interfere with other features such as snapping).
|
|
11
|
+
*
|
|
12
|
+
* The match test is an exact match with a tolerance of 0. Boundaries in GIS data
|
|
13
|
+
* are assumed to share the same coordinate values, and picking up neighbors would
|
|
14
|
+
* drag in unrelated vertices, so no rounding is applied.
|
|
15
|
+
*
|
|
16
|
+
* The targets are only the unlocked, visible features among the geometries that
|
|
17
|
+
* allow vertex editing (Point / LineString / Polygon and the Multi variants). Types
|
|
18
|
+
* without vertex movement, such as Circle / Image / Freehand, are excluded from the
|
|
19
|
+
* candidates.
|
|
20
|
+
*/
|
|
21
|
+
import { hasVertexRef } from '../shared/utils/vertex-ref.js';
|
|
22
|
+
import { isLocallyHidden } from '../store/local-visibility.js';
|
|
23
|
+
import { isFeatureLocked } from '../store/lock.js';
|
|
24
|
+
import { startVertexMove } from './vertex.js';
|
|
25
|
+
/**
|
|
26
|
+
* Geometry types eligible for the simultaneous movement of shared vertices
|
|
27
|
+
*
|
|
28
|
+
* They are kept identical to the types whose coordinates computeVertexMove can
|
|
29
|
+
* move.
|
|
30
|
+
*/
|
|
31
|
+
const VERTEX_MOVABLE_TYPES = new Set([
|
|
32
|
+
'Point',
|
|
33
|
+
'LineString',
|
|
34
|
+
'Polygon',
|
|
35
|
+
'MultiPoint',
|
|
36
|
+
'MultiLineString',
|
|
37
|
+
'MultiPolygon',
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* Lists every vertex of a feature
|
|
41
|
+
*
|
|
42
|
+
* The end of a closed ring (the closing point) is also listed as one vertex. The
|
|
43
|
+
* match test for shared vertices is done on coordinates, so leaving out the closing
|
|
44
|
+
* point would lose track of "which of the first and the last one matched".
|
|
45
|
+
*/
|
|
46
|
+
function forEachVertex(feature, visit) {
|
|
47
|
+
const { type, coordinates } = feature;
|
|
48
|
+
if (type === 'Point') {
|
|
49
|
+
visit(coordinates, { ring: 0, index: 0 });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (type === 'LineString') {
|
|
53
|
+
const coords = coordinates;
|
|
54
|
+
for (let index = 0; index < coords.length; index++) {
|
|
55
|
+
visit(coords[index], { ring: 0, index });
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (type === 'Polygon') {
|
|
60
|
+
visitRings(coordinates, visit);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (type === 'MultiPoint') {
|
|
64
|
+
// Each coordinate is one part. ring / index is always 0
|
|
65
|
+
const points = coordinates;
|
|
66
|
+
for (let part = 0; part < points.length; part++) {
|
|
67
|
+
visit(points[part], { part, ring: 0, index: 0 });
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (type === 'MultiLineString') {
|
|
72
|
+
const parts = coordinates;
|
|
73
|
+
for (let part = 0; part < parts.length; part++) {
|
|
74
|
+
const coords = parts[part];
|
|
75
|
+
for (let index = 0; index < coords.length; index++) {
|
|
76
|
+
visit(coords[index], { part, ring: 0, index });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (type === 'MultiPolygon') {
|
|
82
|
+
const parts = coordinates;
|
|
83
|
+
for (let part = 0; part < parts.length; part++) {
|
|
84
|
+
visitRings(parts[part], visit, part);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Lists every vertex of an array of rings (including inner rings)
|
|
90
|
+
*/
|
|
91
|
+
function visitRings(rings, visit, part) {
|
|
92
|
+
for (let ring = 0; ring < rings.length; ring++) {
|
|
93
|
+
const coords = rings[ring];
|
|
94
|
+
for (let index = 0; index < coords.length; index++) {
|
|
95
|
+
visit(coords[index], part === undefined ? { ring, index } : { part, ring, index });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Whether the coordinates match exactly (tolerance 0)
|
|
101
|
+
*/
|
|
102
|
+
function isSameCoordinate(a, b) {
|
|
103
|
+
return a[0] === b[0] && a[1] === b[1];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns every vertex reference that matches one of the given coordinates exactly
|
|
107
|
+
*
|
|
108
|
+
* When a single feature has several vertices at the same coordinate (the first and
|
|
109
|
+
* the last one of a closed ring, for instance), all of them are returned.
|
|
110
|
+
*
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
export function findVertexRefsAt(feature, targets) {
|
|
114
|
+
const refs = [];
|
|
115
|
+
if (!VERTEX_MOVABLE_TYPES.has(feature.type))
|
|
116
|
+
return refs;
|
|
117
|
+
forEachVertex(feature, (coord, ref) => {
|
|
118
|
+
if (targets.some((target) => isSameCoordinate(coord, target))) {
|
|
119
|
+
refs.push(ref);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
return refs;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Takes out the coordinates pointed to by the vertex references (duplicates removed)
|
|
126
|
+
*
|
|
127
|
+
* @internal
|
|
128
|
+
*/
|
|
129
|
+
export function resolveVertexCoordinates(feature, refs) {
|
|
130
|
+
const coords = [];
|
|
131
|
+
forEachVertex(feature, (coord, ref) => {
|
|
132
|
+
if (!hasVertexRef(refs, ref))
|
|
133
|
+
return;
|
|
134
|
+
if (coords.some((existing) => isSameCoordinate(existing, coord)))
|
|
135
|
+
return;
|
|
136
|
+
coords.push([coord[0], coord[1]]);
|
|
137
|
+
});
|
|
138
|
+
return coords;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Whether a feature can follow along with shared vertices
|
|
142
|
+
*
|
|
143
|
+
* Features under an effective lock (their own, their group's or their layer's) and
|
|
144
|
+
* hidden features are excluded. The cascade of the shared visible flag is aligned
|
|
145
|
+
* with the test in getOrderedFeatures, and local hiding with the one in
|
|
146
|
+
* getDisplayFeatures.
|
|
147
|
+
*/
|
|
148
|
+
function isFollowCandidate(feature, store) {
|
|
149
|
+
if (!VERTEX_MOVABLE_TYPES.has(feature.type))
|
|
150
|
+
return false;
|
|
151
|
+
if (isFeatureLocked(feature, store))
|
|
152
|
+
return false;
|
|
153
|
+
if (!feature.visible)
|
|
154
|
+
return false;
|
|
155
|
+
if (feature.groupId && !store.getGroup(feature.groupId)?.visible)
|
|
156
|
+
return false;
|
|
157
|
+
if (!store.getLayer(feature.layerId)?.visible)
|
|
158
|
+
return false;
|
|
159
|
+
return !isLocallyHidden(feature, store);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Fixes the targets of the simultaneous movement of shared vertices when the drag
|
|
163
|
+
* starts
|
|
164
|
+
*
|
|
165
|
+
* Candidate features are narrowed down with SpatialIndex.findNear (tolerance 0), and
|
|
166
|
+
* only the features among them that have a vertex matching the coordinate exactly
|
|
167
|
+
* are taken. No further search is made during the drag; the set fixed here keeps
|
|
168
|
+
* being used.
|
|
169
|
+
*
|
|
170
|
+
* @param feature The feature being dragged (the main one)
|
|
171
|
+
* @param vertexRefs The vertex references being dragged
|
|
172
|
+
*
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
export function collectSharedVertexMoves(params) {
|
|
176
|
+
const { store, spatialIndex, feature, vertexRefs, startLngLat } = params;
|
|
177
|
+
const targets = resolveVertexCoordinates(feature, vertexRefs);
|
|
178
|
+
const mainRefs = vertexRefs.map((ref) => ({ ...ref }));
|
|
179
|
+
if (targets.length === 0) {
|
|
180
|
+
return { mainRefs, followers: [] };
|
|
181
|
+
}
|
|
182
|
+
// Narrow down the candidate features with the spatial index (tolerance 0 = a point query)
|
|
183
|
+
const candidateIds = new Set();
|
|
184
|
+
for (const target of targets) {
|
|
185
|
+
for (const id of spatialIndex.findNear(target, 0)) {
|
|
186
|
+
candidateIds.add(id);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Also move the vertices at the same coordinate within the main feature (the closing
|
|
190
|
+
// point of a closed ring, for instance)
|
|
191
|
+
for (const ref of findVertexRefsAt(feature, targets)) {
|
|
192
|
+
if (!hasVertexRef(mainRefs, ref))
|
|
193
|
+
mainRefs.push(ref);
|
|
194
|
+
}
|
|
195
|
+
const followers = [];
|
|
196
|
+
for (const id of candidateIds) {
|
|
197
|
+
if (id === feature.id)
|
|
198
|
+
continue;
|
|
199
|
+
const candidate = store.getFeature(id);
|
|
200
|
+
if (!candidate || !isFollowCandidate(candidate, store))
|
|
201
|
+
continue;
|
|
202
|
+
const refs = findVertexRefsAt(candidate, targets);
|
|
203
|
+
if (refs.length === 0)
|
|
204
|
+
continue;
|
|
205
|
+
const state = startVertexMove(candidate, refs, startLngLat);
|
|
206
|
+
if (state)
|
|
207
|
+
followers.push(state);
|
|
208
|
+
}
|
|
209
|
+
return { mainRefs, followers };
|
|
210
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { BoundingBox, Coordinate, Feature } from '../store/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* A connection from a node of a {@link TraceGraph} to an adjacent node, weighted by its
|
|
4
|
+
* geodesic length.
|
|
5
|
+
*/
|
|
6
|
+
export interface TraceGraphEdge {
|
|
7
|
+
/** The node key this edge connects to */
|
|
8
|
+
to: string;
|
|
9
|
+
/** The haversine length of the edge in meters */
|
|
10
|
+
weight: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A vertex of a {@link TraceGraph}. Vertices at exactly the same coordinate share one node.
|
|
14
|
+
*/
|
|
15
|
+
export interface TraceGraphNode {
|
|
16
|
+
/** The coordinate of the node, `[lng, lat]` in degrees */
|
|
17
|
+
coordinate: Coordinate;
|
|
18
|
+
/** The adjacent nodes */
|
|
19
|
+
edges: TraceGraphEdge[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The undirected graph of the edges near the cursor, built by {@link buildTraceGraph} and
|
|
23
|
+
* searched by {@link findTracePath}.
|
|
24
|
+
*/
|
|
25
|
+
export interface TraceGraph {
|
|
26
|
+
/** The nodes by key (the key is `"lng,lat"`) */
|
|
27
|
+
nodes: Map<string, TraceGraphNode>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* One end of a trace: the snapping target of a click, expressed in coordinates.
|
|
31
|
+
*
|
|
32
|
+
* It holds either node (snapped to a vertex) or segment (snapped to the middle of an
|
|
33
|
+
* edge). An end point with neither (a snap to a guide or to an intersection with no
|
|
34
|
+
* reference) cannot be traced.
|
|
35
|
+
*/
|
|
36
|
+
export interface TraceGraphEndpoint {
|
|
37
|
+
/** The snapped coordinate `[lng, lat]` in degrees (may be in the middle of an edge) */
|
|
38
|
+
coordinate: Coordinate;
|
|
39
|
+
/** When snapped to a vertex, the coordinate of that vertex */
|
|
40
|
+
node?: Coordinate;
|
|
41
|
+
/** When snapped to the middle of an edge, the coordinates of both ends of that edge */
|
|
42
|
+
segment?: {
|
|
43
|
+
start: Coordinate;
|
|
44
|
+
end: Coordinate;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Builds the undirected graph of the edges of features within an extent, for
|
|
49
|
+
* {@link findTracePath}.
|
|
50
|
+
*
|
|
51
|
+
* Every segment of LineString, Polygon (holes included), MultiLineString and MultiPolygon
|
|
52
|
+
* features that touches `bbox` becomes an edge weighted by its haversine length in meters.
|
|
53
|
+
* Vertices at exactly the same coordinate share one node, so a path can cross from one
|
|
54
|
+
* feature to another through a shared vertex; edges that merely cross are not connected.
|
|
55
|
+
* Edges with the same pair of coordinates are folded into one, and edges of length 0 are
|
|
56
|
+
* skipped. Features of any other type contribute nothing. It is a pure
|
|
57
|
+
* function; it looks at neither the Store nor the map.
|
|
58
|
+
*
|
|
59
|
+
* @param features The features to build from (pass only the visible ones)
|
|
60
|
+
* @param bbox The extent in degrees; only the edges that touch it are taken in
|
|
61
|
+
* @returns The graph. It has no nodes when no edge falls in `bbox`
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* import { buildTraceGraph, findTracePath } from '@sakuzu/maplibre-gl-draw';
|
|
66
|
+
*
|
|
67
|
+
* const graph = buildTraceGraph(draw.getAllFeatures(), {
|
|
68
|
+
* minX: 139.7,
|
|
69
|
+
* minY: 35.6,
|
|
70
|
+
* maxX: 139.8,
|
|
71
|
+
* maxY: 35.7,
|
|
72
|
+
* });
|
|
73
|
+
* // The boundary vertices between two vertices of the same parcel
|
|
74
|
+
* const between = findTracePath(
|
|
75
|
+
* graph,
|
|
76
|
+
* { coordinate: [139.71, 35.61], node: [139.71, 35.61] },
|
|
77
|
+
* { coordinate: [139.75, 35.65], node: [139.75, 35.65] },
|
|
78
|
+
* );
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function buildTraceGraph(features: readonly Feature[], bbox: BoundingBox): TraceGraph;
|
|
82
|
+
/**
|
|
83
|
+
* Returns the boundary vertices on the shortest path between two snapped points.
|
|
84
|
+
*
|
|
85
|
+
* The search is Dijkstra over the geodesic lengths of {@link TraceGraph}. An end snapped to
|
|
86
|
+
* the middle of an edge is connected to both ends of that edge with the partial lengths;
|
|
87
|
+
* when both ends lie on the same edge they are connected directly. It is a pure function.
|
|
88
|
+
*
|
|
89
|
+
* @param graph The graph built from the nearby edges by {@link buildTraceGraph}
|
|
90
|
+
* @param from The snapping target of the click confirmed just before
|
|
91
|
+
* @param to The snapping target of this click (or of the cursor)
|
|
92
|
+
* @returns The vertices `[lng, lat]` in between, both ends excluded. An empty array when
|
|
93
|
+
* the two ends are the same node or adjacent. `null` when an end has neither `node` nor
|
|
94
|
+
* `segment`, when an end is not in the graph, and when the two ends are not connected
|
|
95
|
+
*/
|
|
96
|
+
export declare function findTracePath(graph: TraceGraph, from: TraceGraphEndpoint, to: TraceGraphEndpoint): Coordinate[] | null;
|