@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,673 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { destinationPoint } from '../../geometry/index.js';
|
|
4
|
+
import { mercatorMidpoint } from '../../shared/math/globe-subdivision.js';
|
|
5
|
+
import { applyMarginToBoundingBox, clampLatitude } from '../../shared/math/index.js';
|
|
6
|
+
import { getCircleRadius, getRadiusHandleAngle } from '../../shared/utils/property.js';
|
|
7
|
+
import { hasVertexRef, isSameVertexRef } from '../../shared/utils/vertex-ref.js';
|
|
8
|
+
import { includeRequiredVertexRefs, resolveMidpointCoordinate, resolveVertexCoordinate, } from './handle-thinning.js';
|
|
9
|
+
// supportsVertexEditing is a predicate on the feature type, defined in shared/ (the handle
|
|
10
|
+
// thinning and the modes read it too); re-exported here for the existing imports
|
|
11
|
+
export { supportsVertexEditing } from '../../shared/utils/coordinates.js';
|
|
12
|
+
/**
|
|
13
|
+
* Computes the positions of the resize handles
|
|
14
|
+
* Specification: show resize handles only at the four corners of the bounding box
|
|
15
|
+
*
|
|
16
|
+
* @param bbox Bounding box
|
|
17
|
+
* @param additionalHandles Additional handles (edge-center handles and the like)
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export function computeResizeHandles(bbox, additionalHandles) {
|
|
22
|
+
const { topLeft, topRight, bottomRight, bottomLeft } = bbox;
|
|
23
|
+
const handles = [
|
|
24
|
+
{ type: 'resize-nw', position: topLeft },
|
|
25
|
+
{ type: 'resize-ne', position: topRight },
|
|
26
|
+
{ type: 'resize-se', position: bottomRight },
|
|
27
|
+
{ type: 'resize-sw', position: bottomLeft },
|
|
28
|
+
];
|
|
29
|
+
// Append the additional handles if there are any
|
|
30
|
+
if (additionalHandles && additionalHandles.length > 0) {
|
|
31
|
+
handles.push(...additionalHandles);
|
|
32
|
+
}
|
|
33
|
+
return handles;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Computes the position of the rotate handle
|
|
37
|
+
*
|
|
38
|
+
* Supports an OBB (rotated bounding box).
|
|
39
|
+
* Offsets in the direction perpendicular to the top edge.
|
|
40
|
+
*
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
export function computeRotateHandle(bbox, distancePixels, zoom) {
|
|
44
|
+
// Midpoint of the top edge, on the edge as drawn (a plain average on a parallel)
|
|
45
|
+
const topCenter = mercatorMidpoint(bbox.topLeft, bbox.topRight);
|
|
46
|
+
// Convert the pixel distance to degrees (approximation)
|
|
47
|
+
const pixelsPerDegree = (256 * 2 ** zoom) / 360;
|
|
48
|
+
const degreesOffset = distancePixels / pixelsPerDegree;
|
|
49
|
+
// Edge vector of the top edge (topLeft -> topRight)
|
|
50
|
+
const edgeDx = bbox.topRight[0] - bbox.topLeft[0];
|
|
51
|
+
const edgeDy = bbox.topRight[1] - bbox.topLeft[1];
|
|
52
|
+
// Latitude correction: in geographic coordinates longitude and latitude have different
|
|
53
|
+
// scales, so a latitude correction is required to compute the correct perpendicular vector
|
|
54
|
+
const latRad = (topCenter[1] * Math.PI) / 180;
|
|
55
|
+
const latCos = Math.cos(latRad);
|
|
56
|
+
// Edge vector in the normalized space (latCos applied along the longitude axis)
|
|
57
|
+
const normEdgeDx = edgeDx * latCos;
|
|
58
|
+
const normEdgeDy = edgeDy;
|
|
59
|
+
// Length of the edge in the normalized space
|
|
60
|
+
const normEdgeLength = Math.sqrt(normEdgeDx * normEdgeDx + normEdgeDy * normEdgeDy);
|
|
61
|
+
// When the edge is 0 (a single point and the like), default to the upward direction
|
|
62
|
+
if (normEdgeLength === 0) {
|
|
63
|
+
return {
|
|
64
|
+
type: 'rotate',
|
|
65
|
+
// Clamped because at low zoom levels the latitude can fall outside the valid range
|
|
66
|
+
position: [topCenter[0], clampLatitude(topCenter[1] + degreesOffset)],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Unit edge vector in the normalized space
|
|
70
|
+
const normUnitDx = normEdgeDx / normEdgeLength;
|
|
71
|
+
const normUnitDy = normEdgeDy / normEdgeLength;
|
|
72
|
+
// Perpendicular vector in the normalized space (90 degrees counterclockwise = upward)
|
|
73
|
+
// In 2D the perpendicular of (dx, dy) is (-dy, dx)
|
|
74
|
+
const normPerpX = -normUnitDy;
|
|
75
|
+
const normPerpY = normUnitDx;
|
|
76
|
+
// Convert back to geographic coordinates (divide by latCos along the longitude axis)
|
|
77
|
+
const perpX = normPerpX / latCos;
|
|
78
|
+
const perpY = normPerpY;
|
|
79
|
+
return {
|
|
80
|
+
type: 'rotate',
|
|
81
|
+
// Clamped because at low zoom levels the latitude can fall outside the valid range
|
|
82
|
+
position: [
|
|
83
|
+
topCenter[0] + perpX * degreesOffset,
|
|
84
|
+
clampLatitude(topCenter[1] + perpY * degreesOffset),
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Collects the vertex handles of a line (a single coordinate sequence)
|
|
90
|
+
*
|
|
91
|
+
* Passing part includes the part number in the VertexRef (for the Multi types).
|
|
92
|
+
* For single geometries part is omitted and `{ ring, index }` is returned as before.
|
|
93
|
+
*/
|
|
94
|
+
function collectLineVertexHandles(coords, handles, part) {
|
|
95
|
+
for (let i = 0; i < coords.length; i++) {
|
|
96
|
+
handles.push({
|
|
97
|
+
type: 'vertex',
|
|
98
|
+
position: coords[i],
|
|
99
|
+
vertexRef: part === undefined ? { ring: 0, index: i } : { part, ring: 0, index: i },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Collects the vertex handles of a polygon (an array of rings)
|
|
105
|
+
*
|
|
106
|
+
* The last entry of a closed ring is a duplicate of the first one (the closing point),
|
|
107
|
+
* so no handle is emitted for it.
|
|
108
|
+
*/
|
|
109
|
+
function collectPolygonVertexHandles(rings, handles, part) {
|
|
110
|
+
for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
|
|
111
|
+
const ring = rings[ringIndex];
|
|
112
|
+
if (ring.length === 0)
|
|
113
|
+
continue;
|
|
114
|
+
// The last point is the same as the first one, so it is excluded
|
|
115
|
+
const length = ring[0][0] === ring[ring.length - 1][0] && ring[0][1] === ring[ring.length - 1][1]
|
|
116
|
+
? ring.length - 1
|
|
117
|
+
: ring.length;
|
|
118
|
+
for (let i = 0; i < length; i++) {
|
|
119
|
+
handles.push({
|
|
120
|
+
type: 'vertex',
|
|
121
|
+
position: ring[i],
|
|
122
|
+
vertexRef: part === undefined ? { ring: ringIndex, index: i } : { part, ring: ringIndex, index: i },
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Builds handle information from the set of handles to display (vertex references)
|
|
129
|
+
*
|
|
130
|
+
* The path used while thinning. Because the positions are looked up again from a set that
|
|
131
|
+
* holds no coordinates, the same set can be reused even after the vertices move. References
|
|
132
|
+
* that cannot be resolved (the coordinate is gone and the like) are discarded.
|
|
133
|
+
*/
|
|
134
|
+
function buildHandlesFromRefs(feature, refs, type, resolve) {
|
|
135
|
+
const handles = [];
|
|
136
|
+
for (const ref of refs) {
|
|
137
|
+
const position = resolve(feature, ref);
|
|
138
|
+
if (!position)
|
|
139
|
+
continue;
|
|
140
|
+
handles.push({ type, position, vertexRef: ref });
|
|
141
|
+
}
|
|
142
|
+
return handles;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Computes the positions of the vertex handles
|
|
146
|
+
*
|
|
147
|
+
* For a Polygon, not only the outer ring (ring 0) but also the vertices of the inner rings
|
|
148
|
+
* (holes) are covered.
|
|
149
|
+
*
|
|
150
|
+
* The Multi types (MultiPoint / MultiLineString / MultiPolygon) are scanned across all
|
|
151
|
+
* parts and returned with the part number included in the VertexRef. For a MultiPoint each
|
|
152
|
+
* coordinate is one part, so the vertex reference becomes `{ part: i, ring: 0, index: 0 }`.
|
|
153
|
+
*
|
|
154
|
+
* @param visibleSet The display set thinned by screen density. When passed, not all vertices
|
|
155
|
+
* are enumerated; only the vertices contained in the set are returned (when omitted, all
|
|
156
|
+
* vertices are returned as before)
|
|
157
|
+
*
|
|
158
|
+
* @internal
|
|
159
|
+
*/
|
|
160
|
+
export function computeVertexHandles(feature, visibleSet) {
|
|
161
|
+
if (visibleSet) {
|
|
162
|
+
return buildHandlesFromRefs(feature, visibleSet.vertexRefs, 'vertex', resolveVertexCoordinate);
|
|
163
|
+
}
|
|
164
|
+
const handles = [];
|
|
165
|
+
if (feature.type === 'Point') {
|
|
166
|
+
// A Point is a single vertex
|
|
167
|
+
const coord = feature.coordinates;
|
|
168
|
+
handles.push({ type: 'vertex', position: coord, vertexRef: { ring: 0, index: 0 } });
|
|
169
|
+
}
|
|
170
|
+
else if (feature.type === 'LineString') {
|
|
171
|
+
collectLineVertexHandles(feature.coordinates, handles);
|
|
172
|
+
}
|
|
173
|
+
else if (feature.type === 'Polygon') {
|
|
174
|
+
collectPolygonVertexHandles(feature.coordinates, handles);
|
|
175
|
+
}
|
|
176
|
+
else if (feature.type === 'MultiPoint') {
|
|
177
|
+
// Each coordinate is one part. ring / index are always 0
|
|
178
|
+
const points = feature.coordinates;
|
|
179
|
+
for (let part = 0; part < points.length; part++) {
|
|
180
|
+
handles.push({
|
|
181
|
+
type: 'vertex',
|
|
182
|
+
position: points[part],
|
|
183
|
+
vertexRef: { part, ring: 0, index: 0 },
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (feature.type === 'MultiLineString') {
|
|
188
|
+
const parts = feature.coordinates;
|
|
189
|
+
for (let part = 0; part < parts.length; part++) {
|
|
190
|
+
collectLineVertexHandles(parts[part], handles, part);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (feature.type === 'MultiPolygon') {
|
|
194
|
+
const parts = feature.coordinates;
|
|
195
|
+
for (let part = 0; part < parts.length; part++) {
|
|
196
|
+
collectPolygonVertexHandles(parts[part], handles, part);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return handles;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Computes the position of the radius handle for a Circle
|
|
203
|
+
*
|
|
204
|
+
* The handle is laid out with the same geodesic direct problem as the circle's outline, so it
|
|
205
|
+
* sits on the outline at any latitude and radius.
|
|
206
|
+
*/
|
|
207
|
+
export function computeCircleRadiusHandle(feature) {
|
|
208
|
+
if (feature.type !== 'Circle') {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const center = feature.coordinates;
|
|
212
|
+
const radiusMeters = getCircleRadius(feature);
|
|
213
|
+
const radiusHandleAngle = getRadiusHandleAngle(feature);
|
|
214
|
+
if (!radiusMeters || radiusMeters <= 0) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
const handlePosition = destinationPoint(center, radiusMeters, radiusHandleAngle);
|
|
218
|
+
return {
|
|
219
|
+
type: 'radius',
|
|
220
|
+
position: handlePosition,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Computes the position of the center marker for a Circle
|
|
225
|
+
*/
|
|
226
|
+
export function computeCircleCenterHandle(feature) {
|
|
227
|
+
if (feature.type !== 'Circle') {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const center = feature.coordinates;
|
|
231
|
+
return {
|
|
232
|
+
type: 'center',
|
|
233
|
+
position: center,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Collects the midpoint handles of a line (a single coordinate sequence)
|
|
238
|
+
*/
|
|
239
|
+
function collectLineMidpointHandles(coords, handles, part) {
|
|
240
|
+
for (let i = 0; i < coords.length - 1; i++) {
|
|
241
|
+
const midpoint = mercatorMidpoint(coords[i], coords[i + 1]);
|
|
242
|
+
handles.push({
|
|
243
|
+
type: 'midpoint',
|
|
244
|
+
position: midpoint,
|
|
245
|
+
vertexRef: part === undefined ? { ring: 0, index: i } : { part, ring: 0, index: i },
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Collects the midpoint handles of a polygon (an array of rings)
|
|
251
|
+
*/
|
|
252
|
+
function collectPolygonMidpointHandles(rings, handles, part) {
|
|
253
|
+
for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
|
|
254
|
+
const ring = rings[ringIndex];
|
|
255
|
+
for (let i = 0; i < ring.length - 1; i++) {
|
|
256
|
+
const midpoint = mercatorMidpoint(ring[i], ring[i + 1]);
|
|
257
|
+
handles.push({
|
|
258
|
+
type: 'midpoint',
|
|
259
|
+
position: midpoint,
|
|
260
|
+
vertexRef: part === undefined ? { ring: ringIndex, index: i } : { part, ring: ringIndex, index: i },
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Computes the positions of the midpoint handles
|
|
267
|
+
*
|
|
268
|
+
* For a Polygon, not only the outer ring (ring 0) but also the edges of the inner rings
|
|
269
|
+
* (holes) are covered.
|
|
270
|
+
*
|
|
271
|
+
* The Multi types are scanned across all parts. A MultiPoint has no edges, so no midpoint
|
|
272
|
+
* handles are emitted for it (vertex handles only).
|
|
273
|
+
*
|
|
274
|
+
* @param visibleSet The display set thinned by screen density. When passed, not all edges
|
|
275
|
+
* are enumerated; only the edges contained in the set are returned (when omitted, all
|
|
276
|
+
* edges are returned as before)
|
|
277
|
+
*
|
|
278
|
+
* @internal
|
|
279
|
+
*/
|
|
280
|
+
export function computeMidpointHandles(feature, visibleSet) {
|
|
281
|
+
if (visibleSet) {
|
|
282
|
+
return buildHandlesFromRefs(feature, visibleSet.midpointRefs, 'midpoint', resolveMidpointCoordinate);
|
|
283
|
+
}
|
|
284
|
+
const handles = [];
|
|
285
|
+
if (feature.type === 'LineString') {
|
|
286
|
+
collectLineMidpointHandles(feature.coordinates, handles);
|
|
287
|
+
}
|
|
288
|
+
else if (feature.type === 'Polygon') {
|
|
289
|
+
collectPolygonMidpointHandles(feature.coordinates, handles);
|
|
290
|
+
}
|
|
291
|
+
else if (feature.type === 'MultiLineString') {
|
|
292
|
+
const parts = feature.coordinates;
|
|
293
|
+
for (let part = 0; part < parts.length; part++) {
|
|
294
|
+
collectLineMidpointHandles(parts[part], handles, part);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else if (feature.type === 'MultiPolygon') {
|
|
298
|
+
const parts = feature.coordinates;
|
|
299
|
+
for (let part = 0; part < parts.length; part++) {
|
|
300
|
+
collectPolygonMidpointHandles(parts[part], handles, part);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return handles;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* SelectionHandlesRenderer
|
|
307
|
+
*
|
|
308
|
+
* The renderer that draws the selection handles
|
|
309
|
+
*
|
|
310
|
+
* @internal
|
|
311
|
+
*/
|
|
312
|
+
export class SelectionHandlesRenderer {
|
|
313
|
+
constructor(strokeRenderer, pointRenderer, config) {
|
|
314
|
+
Object.defineProperty(this, "strokeRenderer", {
|
|
315
|
+
enumerable: true,
|
|
316
|
+
configurable: true,
|
|
317
|
+
writable: true,
|
|
318
|
+
value: void 0
|
|
319
|
+
});
|
|
320
|
+
Object.defineProperty(this, "pointRenderer", {
|
|
321
|
+
enumerable: true,
|
|
322
|
+
configurable: true,
|
|
323
|
+
writable: true,
|
|
324
|
+
value: void 0
|
|
325
|
+
});
|
|
326
|
+
Object.defineProperty(this, "config", {
|
|
327
|
+
enumerable: true,
|
|
328
|
+
configurable: true,
|
|
329
|
+
writable: true,
|
|
330
|
+
value: void 0
|
|
331
|
+
});
|
|
332
|
+
Object.defineProperty(this, "transform", {
|
|
333
|
+
enumerable: true,
|
|
334
|
+
configurable: true,
|
|
335
|
+
writable: true,
|
|
336
|
+
value: null
|
|
337
|
+
});
|
|
338
|
+
Object.defineProperty(this, "projectionData", {
|
|
339
|
+
enumerable: true,
|
|
340
|
+
configurable: true,
|
|
341
|
+
writable: true,
|
|
342
|
+
value: null
|
|
343
|
+
});
|
|
344
|
+
Object.defineProperty(this, "pointInstanceRenderer", {
|
|
345
|
+
enumerable: true,
|
|
346
|
+
configurable: true,
|
|
347
|
+
writable: true,
|
|
348
|
+
value: null
|
|
349
|
+
});
|
|
350
|
+
this.strokeRenderer = strokeRenderer;
|
|
351
|
+
this.pointRenderer = pointRenderer;
|
|
352
|
+
this.config = config;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Sets the coordinate transform
|
|
356
|
+
*/
|
|
357
|
+
setTransform(transform) {
|
|
358
|
+
this.transform = transform;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Sets the ProjectionData
|
|
362
|
+
*/
|
|
363
|
+
setProjectionData(projectionData) {
|
|
364
|
+
this.projectionData = projectionData;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Sets the PointInstanceRenderer
|
|
368
|
+
*/
|
|
369
|
+
setPointInstanceRenderer(renderer) {
|
|
370
|
+
this.pointInstanceRenderer = renderer;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Draws the resize handles
|
|
374
|
+
* Draws them at the four corners of the bbox after the margin is applied (additional
|
|
375
|
+
* handles can also be drawn)
|
|
376
|
+
*
|
|
377
|
+
* @param bbox Bounding box
|
|
378
|
+
* @param zoom Zoom level
|
|
379
|
+
* @param getAdditionalHandles Callback that computes the additional handles (it receives
|
|
380
|
+
* the bbox after the margin is applied)
|
|
381
|
+
*/
|
|
382
|
+
drawResizeHandles(bbox, zoom, getAdditionalHandles) {
|
|
383
|
+
// Compute the bbox with the margin applied
|
|
384
|
+
let marginedBbox = bbox;
|
|
385
|
+
if (this.transform) {
|
|
386
|
+
const margin = this.config.boundingBox.margin;
|
|
387
|
+
marginedBbox = {
|
|
388
|
+
...applyMarginToBoundingBox(bbox, margin, this.transform, zoom),
|
|
389
|
+
center: bbox.center,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// If a callback is given, call it with the bbox after the margin is applied
|
|
393
|
+
const additionalHandles = getAdditionalHandles?.(marginedBbox);
|
|
394
|
+
const handles = computeResizeHandles(marginedBbox, additionalHandles);
|
|
395
|
+
// Each handle sits on the ground elevation of its own point. Hit testing (anchor
|
|
396
|
+
// projection) uses the same elevation, so the drawn position and the grabbable position
|
|
397
|
+
// match structurally. Putting them all at a single height to match the selection box
|
|
398
|
+
// would shift only the rendering and make them ungrabbable
|
|
399
|
+
for (const handle of handles) {
|
|
400
|
+
this.pointRenderer.draw(handle.position, this.config.resizeHandle.point, zoom);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Draws the rotate handle
|
|
405
|
+
* Draws it at a position offset upward from the midpoint of the top edge of the bbox
|
|
406
|
+
* after the margin is applied
|
|
407
|
+
*/
|
|
408
|
+
drawRotateHandle(bbox, zoom) {
|
|
409
|
+
// Compute the bbox with the margin applied
|
|
410
|
+
let marginedBbox = bbox;
|
|
411
|
+
if (this.transform) {
|
|
412
|
+
const margin = this.config.boundingBox.margin;
|
|
413
|
+
marginedBbox = {
|
|
414
|
+
...applyMarginToBoundingBox(bbox, margin, this.transform, zoom),
|
|
415
|
+
center: bbox.center,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
const handle = computeRotateHandle(marginedBbox, this.config.rotateHandle.distance, zoom);
|
|
419
|
+
// Draw the connector line (from the midpoint of the top edge after the margin is applied)
|
|
420
|
+
const topCenter = mercatorMidpoint(marginedBbox.topLeft, marginedBbox.topRight);
|
|
421
|
+
this.strokeRenderer.draw([topCenter, handle.position], this.config.rotateHandle.connector,
|
|
422
|
+
// The connector line follows the ground as well (same elevation source as the box
|
|
423
|
+
// and the handles)
|
|
424
|
+
{ widthUnit: 'pixels', closed: false, followTerrain: true }, zoom, this.projectionData ?? undefined);
|
|
425
|
+
// Draw the handle (put on the ground elevation of each point so that it matches the
|
|
426
|
+
// grabbable position)
|
|
427
|
+
this.pointRenderer.draw(handle.position, this.config.rotateHandle.point, zoom);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Draws the vertex handles
|
|
431
|
+
* @param feature Target feature
|
|
432
|
+
* @param zoom Zoom level
|
|
433
|
+
* @param options Options
|
|
434
|
+
* - activeVertex: when specified, only that vertex and the selected vertices are drawn
|
|
435
|
+
* - selectedVertices: references of the selected vertices (for highlighting)
|
|
436
|
+
* - visibleSet: the display set thinned by screen density (when omitted, all vertices)
|
|
437
|
+
*/
|
|
438
|
+
drawVertexHandles(feature, zoom, options) {
|
|
439
|
+
const activeVertex = options?.activeVertex;
|
|
440
|
+
const selectedVertices = options?.selectedVertices ?? [];
|
|
441
|
+
// Even while thinning, the selected and the in-operation vertices are always drawn
|
|
442
|
+
// (if a recomputation hid such a vertex it would look like "it disappeared even though
|
|
443
|
+
// I selected it")
|
|
444
|
+
const visibleSet = options?.visibleSet
|
|
445
|
+
? includeRequiredVertexRefs(options.visibleSet, activeVertex ? [...selectedVertices, activeVertex] : selectedVertices)
|
|
446
|
+
: options?.visibleSet;
|
|
447
|
+
const handles = computeVertexHandles(feature, visibleSet);
|
|
448
|
+
// Draw individually when activeVertex is specified or when instancing is unavailable
|
|
449
|
+
if (activeVertex !== undefined || !this.pointInstanceRenderer || handles.length < 2) {
|
|
450
|
+
for (const handle of handles) {
|
|
451
|
+
const isSelected = hasVertexRef(selectedVertices, handle.vertexRef);
|
|
452
|
+
// When activeVertex is specified, draw only that vertex and the selected vertices
|
|
453
|
+
if (activeVertex !== undefined) {
|
|
454
|
+
const isActive = isSameVertexRef(handle.vertexRef, activeVertex);
|
|
455
|
+
if (!isActive && !isSelected) {
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const style = isSelected
|
|
460
|
+
? this.config.vertexHandle.selected
|
|
461
|
+
: this.config.vertexHandle.point;
|
|
462
|
+
this.pointRenderer.draw(handle.position, style, zoom);
|
|
463
|
+
}
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
// Separate the unselected vertices from the selected ones
|
|
467
|
+
const normalHandles = handles.filter((h) => !hasVertexRef(selectedVertices, h.vertexRef));
|
|
468
|
+
const selectedHandles = handles.filter((h) => hasVertexRef(selectedVertices, h.vertexRef));
|
|
469
|
+
// Draw the normal vertices
|
|
470
|
+
if (normalHandles.length > 0) {
|
|
471
|
+
const style = this.config.vertexHandle.point;
|
|
472
|
+
const points = normalHandles.map((h) => ({
|
|
473
|
+
coord: h.position,
|
|
474
|
+
fillColor: [
|
|
475
|
+
style.fillColor[0],
|
|
476
|
+
style.fillColor[1],
|
|
477
|
+
style.fillColor[2],
|
|
478
|
+
style.fillColor[3] * style.fillOpacity,
|
|
479
|
+
],
|
|
480
|
+
fillSize: style.size / 2, // diameter -> radius
|
|
481
|
+
strokeColor: [
|
|
482
|
+
style.strokeColor[0],
|
|
483
|
+
style.strokeColor[1],
|
|
484
|
+
style.strokeColor[2],
|
|
485
|
+
style.strokeColor[3] * style.strokeOpacity,
|
|
486
|
+
],
|
|
487
|
+
strokeWidth: style.strokeWidth,
|
|
488
|
+
}));
|
|
489
|
+
this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
|
|
490
|
+
}
|
|
491
|
+
// Draw the selected vertices (highlight style)
|
|
492
|
+
if (selectedHandles.length > 0) {
|
|
493
|
+
const style = this.config.vertexHandle.selected;
|
|
494
|
+
const points = selectedHandles.map((h) => ({
|
|
495
|
+
coord: h.position,
|
|
496
|
+
fillColor: [
|
|
497
|
+
style.fillColor[0],
|
|
498
|
+
style.fillColor[1],
|
|
499
|
+
style.fillColor[2],
|
|
500
|
+
style.fillColor[3] * style.fillOpacity,
|
|
501
|
+
],
|
|
502
|
+
fillSize: style.size / 2, // diameter -> radius
|
|
503
|
+
strokeColor: [
|
|
504
|
+
style.strokeColor[0],
|
|
505
|
+
style.strokeColor[1],
|
|
506
|
+
style.strokeColor[2],
|
|
507
|
+
style.strokeColor[3] * style.strokeOpacity,
|
|
508
|
+
],
|
|
509
|
+
strokeWidth: style.strokeWidth,
|
|
510
|
+
}));
|
|
511
|
+
this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Draws the vertices that follow along when shared vertices are moved together
|
|
516
|
+
*
|
|
517
|
+
* The target is another feature that is not necessarily selected, so this has an entry
|
|
518
|
+
* point independent of the selection UI (drawAllHandles). Only the passed vertex
|
|
519
|
+
* references are drawn in the following style; no other vertices are drawn.
|
|
520
|
+
*
|
|
521
|
+
* computeVertexHandles emits no handle for the closing point (the last entry) of a closed
|
|
522
|
+
* ring, so even when it is included in the references only one handle is drawn, as the
|
|
523
|
+
* first vertex.
|
|
524
|
+
*/
|
|
525
|
+
drawFollowedVertexHandles(feature, followedVertices, zoom) {
|
|
526
|
+
if (followedVertices.length === 0)
|
|
527
|
+
return;
|
|
528
|
+
const handles = computeVertexHandles(feature).filter((h) => hasVertexRef(followedVertices, h.vertexRef));
|
|
529
|
+
this.drawHandlesWithStyle(handles, this.config.vertexHandle.followed, zoom);
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Draws a group of handles with a single style
|
|
533
|
+
*
|
|
534
|
+
* When there are two or more of them and instancing is available, they are drawn together.
|
|
535
|
+
*/
|
|
536
|
+
drawHandlesWithStyle(handles, style, zoom) {
|
|
537
|
+
if (handles.length === 0)
|
|
538
|
+
return;
|
|
539
|
+
if (!this.pointInstanceRenderer || handles.length < 2) {
|
|
540
|
+
for (const handle of handles) {
|
|
541
|
+
this.pointRenderer.draw(handle.position, style, zoom);
|
|
542
|
+
}
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
const points = handles.map((h) => ({
|
|
546
|
+
coord: h.position,
|
|
547
|
+
fillColor: [
|
|
548
|
+
style.fillColor[0],
|
|
549
|
+
style.fillColor[1],
|
|
550
|
+
style.fillColor[2],
|
|
551
|
+
style.fillColor[3] * style.fillOpacity,
|
|
552
|
+
],
|
|
553
|
+
fillSize: style.size / 2, // diameter -> radius
|
|
554
|
+
strokeColor: [
|
|
555
|
+
style.strokeColor[0],
|
|
556
|
+
style.strokeColor[1],
|
|
557
|
+
style.strokeColor[2],
|
|
558
|
+
style.strokeColor[3] * style.strokeOpacity,
|
|
559
|
+
],
|
|
560
|
+
strokeWidth: style.strokeWidth,
|
|
561
|
+
}));
|
|
562
|
+
this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Draws the midpoint handles
|
|
566
|
+
*
|
|
567
|
+
* @param visibleSet The display set thinned by screen density (when omitted, all edges)
|
|
568
|
+
*/
|
|
569
|
+
drawMidpointHandles(feature, zoom, visibleSet) {
|
|
570
|
+
const handles = computeMidpointHandles(feature, visibleSet);
|
|
571
|
+
// Draw individually when instancing is unavailable
|
|
572
|
+
if (!this.pointInstanceRenderer || handles.length < 2) {
|
|
573
|
+
for (const handle of handles) {
|
|
574
|
+
this.pointRenderer.draw(handle.position, this.config.midpointHandle.point, zoom);
|
|
575
|
+
}
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
// Use instanced rendering
|
|
579
|
+
const style = this.config.midpointHandle.point;
|
|
580
|
+
const points = handles.map((h) => ({
|
|
581
|
+
coord: h.position,
|
|
582
|
+
fillColor: [
|
|
583
|
+
style.fillColor[0],
|
|
584
|
+
style.fillColor[1],
|
|
585
|
+
style.fillColor[2],
|
|
586
|
+
style.fillColor[3] * style.fillOpacity,
|
|
587
|
+
],
|
|
588
|
+
fillSize: style.size / 2, // diameter -> radius
|
|
589
|
+
strokeColor: [
|
|
590
|
+
style.strokeColor[0],
|
|
591
|
+
style.strokeColor[1],
|
|
592
|
+
style.strokeColor[2],
|
|
593
|
+
style.strokeColor[3] * style.strokeOpacity,
|
|
594
|
+
],
|
|
595
|
+
strokeWidth: style.strokeWidth,
|
|
596
|
+
}));
|
|
597
|
+
this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Draws all handles
|
|
601
|
+
*/
|
|
602
|
+
drawAllHandles(feature, bbox, options, zoom) {
|
|
603
|
+
if (options.showResize) {
|
|
604
|
+
this.drawResizeHandles(bbox, zoom, options.getAdditionalResizeHandles);
|
|
605
|
+
}
|
|
606
|
+
if (options.showRotate) {
|
|
607
|
+
this.drawRotateHandle(bbox, zoom);
|
|
608
|
+
}
|
|
609
|
+
if (options.showVertex) {
|
|
610
|
+
this.drawVertexHandles(feature, zoom, {
|
|
611
|
+
activeVertex: options.activeVertex,
|
|
612
|
+
selectedVertices: options.selectedVertices,
|
|
613
|
+
visibleSet: options.visibleSet,
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
if (options.showMidpoint) {
|
|
617
|
+
this.drawMidpointHandles(feature, zoom, options.visibleSet);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Draws the radius handle for a Circle
|
|
622
|
+
*/
|
|
623
|
+
drawCircleRadiusHandle(feature, zoom) {
|
|
624
|
+
const handle = computeCircleRadiusHandle(feature);
|
|
625
|
+
if (!handle)
|
|
626
|
+
return;
|
|
627
|
+
this.pointRenderer.draw(handle.position, this.config.radiusHandle.point, zoom);
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Draws the center marker for a Circle
|
|
631
|
+
*/
|
|
632
|
+
drawCircleCenterMarker(feature, zoom) {
|
|
633
|
+
const handle = computeCircleCenterHandle(feature);
|
|
634
|
+
if (!handle)
|
|
635
|
+
return;
|
|
636
|
+
this.pointRenderer.draw(handle.position, this.config.centerMarker.point, zoom);
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Draws the radius line for a Circle (the dotted line from the center to the radius handle)
|
|
640
|
+
*/
|
|
641
|
+
drawCircleRadiusLine(feature, zoom) {
|
|
642
|
+
const centerHandle = computeCircleCenterHandle(feature);
|
|
643
|
+
const radiusHandle = computeCircleRadiusHandle(feature);
|
|
644
|
+
if (!centerHandle || !radiusHandle)
|
|
645
|
+
return;
|
|
646
|
+
this.strokeRenderer.draw([centerHandle.position, radiusHandle.position], this.config.radiusLine.stroke, { widthUnit: 'pixels', closed: false }, zoom, this.projectionData ?? undefined);
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Draws all selection handles for a Circle
|
|
650
|
+
* (the radius handle, the center marker and the radius line)
|
|
651
|
+
*/
|
|
652
|
+
drawCircleHandles(feature, bbox, options, zoom) {
|
|
653
|
+
if (options.showResize) {
|
|
654
|
+
this.drawResizeHandles(bbox, zoom);
|
|
655
|
+
}
|
|
656
|
+
// Draw the radius line first (so that it goes under the handles)
|
|
657
|
+
if (options.showRadiusLine) {
|
|
658
|
+
this.drawCircleRadiusLine(feature, zoom);
|
|
659
|
+
}
|
|
660
|
+
if (options.showCenterMarker) {
|
|
661
|
+
this.drawCircleCenterMarker(feature, zoom);
|
|
662
|
+
}
|
|
663
|
+
if (options.showRadiusHandle) {
|
|
664
|
+
this.drawCircleRadiusHandle(feature, zoom);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Updates the configuration
|
|
669
|
+
*/
|
|
670
|
+
updateConfig(config) {
|
|
671
|
+
this.config = config;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectionHelper
|
|
3
|
+
*
|
|
4
|
+
* Helper functions for obtaining the selected features and computing the bounding box.
|
|
5
|
+
*/
|
|
6
|
+
import type { Store } from '../../store/store.js';
|
|
7
|
+
/**
|
|
8
|
+
* Returns the ids of the features the current selection covers, resolving a group or layer
|
|
9
|
+
* selection into its member features.
|
|
10
|
+
*
|
|
11
|
+
* The SSoT of the selection carries a kind (feature / group / layer). Selection display and
|
|
12
|
+
* manipulation on the map happen per feature, so a group / layer selection is resolved into
|
|
13
|
+
* the feature IDs of its members. This makes it "the SSoT holds a group/layer selection ->
|
|
14
|
+
* the map selects those members", so the display follows the SSoT (feature stays as is).
|
|
15
|
+
*
|
|
16
|
+
* @param store The Store to read the selection from
|
|
17
|
+
* @returns The feature ids. An empty array when nothing is selected
|
|
18
|
+
*/
|
|
19
|
+
export declare function getSelectedFeatureIds(store: Store): string[];
|