@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,320 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { destinationPoint } from '../../geometry/index.js';
|
|
4
|
+
import { generateCirclePolygon } from '../../shared/math/index.js';
|
|
5
|
+
import { FillShaderManager } from '../renderers/polygon/fill.js';
|
|
6
|
+
/**
|
|
7
|
+
* The dotted pattern: an 8px line and a 6px gap
|
|
8
|
+
*/
|
|
9
|
+
const TENTATIVE_DASH_ARRAY = [8, 6];
|
|
10
|
+
/**
|
|
11
|
+
* The Tentative rendering class
|
|
12
|
+
*
|
|
13
|
+
* Draws the tentative state while drawing (points, lines, polygons)
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export class TentativeRenderer {
|
|
18
|
+
constructor(deps) {
|
|
19
|
+
Object.defineProperty(this, "sdfLineRenderer", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: void 0
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "pointShapeRenderer", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
/** The style of confirmed lines (solid) */
|
|
32
|
+
Object.defineProperty(this, "strokeStyle", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: void 0
|
|
37
|
+
});
|
|
38
|
+
/** The style of unconfirmed lines (dotted) */
|
|
39
|
+
Object.defineProperty(this, "tentativeStrokeStyle", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: void 0
|
|
44
|
+
});
|
|
45
|
+
Object.defineProperty(this, "vertexStyle", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: void 0
|
|
50
|
+
});
|
|
51
|
+
/** The style of a highlighted vertex */
|
|
52
|
+
Object.defineProperty(this, "highlightedVertexStyle", {
|
|
53
|
+
enumerable: true,
|
|
54
|
+
configurable: true,
|
|
55
|
+
writable: true,
|
|
56
|
+
value: void 0
|
|
57
|
+
});
|
|
58
|
+
/** For Circle: the style of the center marker */
|
|
59
|
+
Object.defineProperty(this, "circleCenterMarkerStyle", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: void 0
|
|
64
|
+
});
|
|
65
|
+
/** For Circle: the style of the radius change handle */
|
|
66
|
+
Object.defineProperty(this, "circleRadiusHandleStyle", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
configurable: true,
|
|
69
|
+
writable: true,
|
|
70
|
+
value: void 0
|
|
71
|
+
});
|
|
72
|
+
Object.defineProperty(this, "fillColor", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
configurable: true,
|
|
75
|
+
writable: true,
|
|
76
|
+
value: void 0
|
|
77
|
+
});
|
|
78
|
+
Object.defineProperty(this, "fillShaderManager", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
configurable: true,
|
|
81
|
+
writable: true,
|
|
82
|
+
value: void 0
|
|
83
|
+
});
|
|
84
|
+
this.sdfLineRenderer = deps.sdfLineRenderer;
|
|
85
|
+
this.pointShapeRenderer = deps.pointShapeRenderer;
|
|
86
|
+
this.strokeStyle = deps.tentativeStyle.stroke;
|
|
87
|
+
// The style of unconfirmed lines (the dotted pattern is set to match the specification)
|
|
88
|
+
this.tentativeStrokeStyle = {
|
|
89
|
+
...deps.tentativeStyle.tentativeStroke,
|
|
90
|
+
dashArray: TENTATIVE_DASH_ARRAY,
|
|
91
|
+
};
|
|
92
|
+
this.vertexStyle = deps.tentativeStyle.vertex;
|
|
93
|
+
this.highlightedVertexStyle = deps.tentativeStyle.highlightedVertex;
|
|
94
|
+
this.circleCenterMarkerStyle = deps.tentativeStyle.circleCenterMarker;
|
|
95
|
+
this.circleRadiusHandleStyle = deps.tentativeStyle.circleRadiusHandle;
|
|
96
|
+
// The fill color for Tentative (translucent pink)
|
|
97
|
+
this.fillColor = [1.0, 0.176, 0.333, 0.2];
|
|
98
|
+
this.fillShaderManager = new FillShaderManager(deps.gl, deps.terrain);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Make sure the shader exists
|
|
102
|
+
*/
|
|
103
|
+
ensureShader(shaderData) {
|
|
104
|
+
this.fillShaderManager.ensureShader(shaderData);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Set the uniforms for offset mode
|
|
108
|
+
*/
|
|
109
|
+
setOffsetUniforms(uniforms) {
|
|
110
|
+
this.fillShaderManager.setOffsetUniforms(uniforms);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Draw only the lines and the fill of the Tentative (excluding the vertices)
|
|
114
|
+
*
|
|
115
|
+
* Used by the rendering that follows the layer order. The vertices are drawn separately
|
|
116
|
+
* in the foreground by drawVertices().
|
|
117
|
+
*/
|
|
118
|
+
drawGeometry(tentative, projectionData, zoom) {
|
|
119
|
+
if (tentative.type === 'Point') {
|
|
120
|
+
// A Point is only vertices, so nothing is drawn for the geometry
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
else if (tentative.type === 'LineString') {
|
|
124
|
+
this.drawLineStringGeometry(tentative, projectionData, zoom);
|
|
125
|
+
}
|
|
126
|
+
else if (tentative.type === 'Polygon') {
|
|
127
|
+
this.drawPolygonGeometry(tentative, projectionData, zoom);
|
|
128
|
+
}
|
|
129
|
+
else if (tentative.type === 'Circle') {
|
|
130
|
+
this.drawCircleGeometry(tentative, projectionData, zoom);
|
|
131
|
+
}
|
|
132
|
+
else if (tentative.type === 'Freehand') {
|
|
133
|
+
this.drawFreehandGeometry(tentative, projectionData, zoom);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Draw only the vertices of the Tentative
|
|
138
|
+
*
|
|
139
|
+
* Called after the selection UI so that they are shown in the foreground.
|
|
140
|
+
*/
|
|
141
|
+
drawVertices(tentative, zoom) {
|
|
142
|
+
if (tentative.type === 'Point') {
|
|
143
|
+
const coord = tentative.coordinates;
|
|
144
|
+
this.drawPointShape(coord, this.vertexStyle, zoom);
|
|
145
|
+
}
|
|
146
|
+
else if (tentative.type === 'LineString') {
|
|
147
|
+
this.drawLineStringVertices(tentative, zoom);
|
|
148
|
+
}
|
|
149
|
+
else if (tentative.type === 'Polygon') {
|
|
150
|
+
this.drawPolygonVertices(tentative, zoom);
|
|
151
|
+
}
|
|
152
|
+
else if (tentative.type === 'Circle') {
|
|
153
|
+
this.drawCircleVertices(tentative, zoom);
|
|
154
|
+
}
|
|
155
|
+
else if (tentative.type === 'Freehand') {
|
|
156
|
+
// Freehand is lines only and does not draw vertices (the existing behavior is kept)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Draw a Point shape
|
|
161
|
+
*/
|
|
162
|
+
drawPointShape(coord, style, zoom) {
|
|
163
|
+
this.pointShapeRenderer.draw(coord, style, zoom);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Tentative rendering of a LineString (lines only, no vertices)
|
|
167
|
+
*/
|
|
168
|
+
drawLineStringGeometry(tentative, projectionData, zoom) {
|
|
169
|
+
const coords = tentative.coordinates;
|
|
170
|
+
const confirmedCount = tentative.confirmedCount ?? coords.length;
|
|
171
|
+
// Draw solid lines between the confirmed vertices
|
|
172
|
+
if (confirmedCount >= 2) {
|
|
173
|
+
const confirmedCoords = coords.slice(0, confirmedCount);
|
|
174
|
+
this.sdfLineRenderer.draw(confirmedCoords, this.strokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
175
|
+
}
|
|
176
|
+
// Draw a dotted line from the last confirmed vertex to the cursor position (GPU implementation)
|
|
177
|
+
if (confirmedCount >= 1 && coords.length > confirmedCount) {
|
|
178
|
+
const tentativeCoords = [
|
|
179
|
+
coords[confirmedCount - 1],
|
|
180
|
+
coords[coords.length - 1],
|
|
181
|
+
];
|
|
182
|
+
this.sdfLineRenderer.draw(tentativeCoords, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Tentative rendering of the vertices of a LineString
|
|
187
|
+
*/
|
|
188
|
+
drawLineStringVertices(tentative, zoom) {
|
|
189
|
+
const coords = tentative.coordinates;
|
|
190
|
+
const highlightedIndex = tentative.highlightedVertexIndex;
|
|
191
|
+
// Draw the vertices (the highlighted one has a different style)
|
|
192
|
+
for (let i = 0; i < coords.length; i++) {
|
|
193
|
+
const style = i === highlightedIndex ? this.highlightedVertexStyle : this.vertexStyle;
|
|
194
|
+
this.drawPointShape(coords[i], style, zoom);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Tentative rendering of a Polygon (lines and fill only, no vertices)
|
|
199
|
+
*/
|
|
200
|
+
drawPolygonGeometry(tentative, projectionData, zoom) {
|
|
201
|
+
const rings = tentative.coordinates;
|
|
202
|
+
const outerRing = rings[0];
|
|
203
|
+
if (!outerRing || outerRing.length < 2) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// confirmedCount is the number of coordinates before closing (outerRing is a closed
|
|
207
|
+
// ring, so the first point is appended at the end)
|
|
208
|
+
const confirmedCount = tentative.confirmedCount ?? outerRing.length - 1;
|
|
209
|
+
// Fill from 3 points or more (4 points or more when closed)
|
|
210
|
+
if (outerRing.length >= 4) {
|
|
211
|
+
this.fillShaderManager.drawPolygon(outerRing, this.fillColor, projectionData, zoom);
|
|
212
|
+
}
|
|
213
|
+
// Draw solid lines between the confirmed vertices (when there are 2 or more of them)
|
|
214
|
+
if (confirmedCount >= 2) {
|
|
215
|
+
const confirmedCoords = outerRing.slice(0, confirmedCount);
|
|
216
|
+
this.sdfLineRenderer.draw(confirmedCoords, this.strokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
217
|
+
}
|
|
218
|
+
// Draw the unconfirmed lines dotted (GPU implementation)
|
|
219
|
+
// The last confirmed vertex (confirmedCount-1) -> the cursor position
|
|
220
|
+
// (confirmedCount) -> the first vertex (0)
|
|
221
|
+
if (confirmedCount >= 1 && outerRing.length > confirmedCount) {
|
|
222
|
+
// From the last confirmed vertex to the cursor position
|
|
223
|
+
const lastConfirmedToMouse = [
|
|
224
|
+
outerRing[confirmedCount - 1],
|
|
225
|
+
outerRing[confirmedCount],
|
|
226
|
+
];
|
|
227
|
+
this.sdfLineRenderer.draw(lastConfirmedToMouse, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
228
|
+
// The closing line from the cursor position to the first vertex
|
|
229
|
+
const mouseToFirst = [
|
|
230
|
+
outerRing[confirmedCount],
|
|
231
|
+
outerRing[0],
|
|
232
|
+
];
|
|
233
|
+
this.sdfLineRenderer.draw(mouseToFirst, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Tentative rendering of the vertices of a Polygon
|
|
238
|
+
*/
|
|
239
|
+
drawPolygonVertices(tentative, zoom) {
|
|
240
|
+
const rings = tentative.coordinates;
|
|
241
|
+
const outerRing = rings[0];
|
|
242
|
+
if (!outerRing || outerRing.length < 1) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// Draw the vertices (the closing point duplicates the first vertex, so it is excluded;
|
|
246
|
+
// the highlighted one has a different style)
|
|
247
|
+
const uniqueVertexCount = outerRing.length > 1 ? outerRing.length - 1 : outerRing.length;
|
|
248
|
+
const highlightedIndex = tentative.highlightedVertexIndex;
|
|
249
|
+
for (let i = 0; i < uniqueVertexCount; i++) {
|
|
250
|
+
const style = i === highlightedIndex ? this.highlightedVertexStyle : this.vertexStyle;
|
|
251
|
+
this.drawPointShape(outerRing[i], style, zoom);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Tentative rendering of a Circle (lines and fill only, no vertices)
|
|
256
|
+
*/
|
|
257
|
+
drawCircleGeometry(tentative, projectionData, zoom) {
|
|
258
|
+
const center = tentative.coordinates;
|
|
259
|
+
const radiusMeters = tentative.radiusMeters ?? 0;
|
|
260
|
+
const radiusHandleAngle = tentative.radiusHandleAngle ?? 135;
|
|
261
|
+
// The circle and the radius line are drawn only when the radius is greater than 0
|
|
262
|
+
if (radiusMeters > 0) {
|
|
263
|
+
// The preview of the circle (the fill)
|
|
264
|
+
const circleCoords = generateCirclePolygon(center, radiusMeters);
|
|
265
|
+
if (circleCoords.length >= 4) {
|
|
266
|
+
this.fillShaderManager.drawPolygon(circleCoords, this.fillColor, projectionData, zoom);
|
|
267
|
+
}
|
|
268
|
+
// The stroke of the circle
|
|
269
|
+
this.sdfLineRenderer.draw(circleCoords, this.strokeStyle, { widthUnit: 'pixels', closed: true }, zoom, projectionData);
|
|
270
|
+
// Compute the position of the radius change handle (on the geodesic outline)
|
|
271
|
+
const handlePosition = destinationPoint(center, radiusMeters, radiusHandleAngle);
|
|
272
|
+
// Draw the radius line (dotted) (GPU implementation)
|
|
273
|
+
const radiusLine = [
|
|
274
|
+
center,
|
|
275
|
+
handlePosition,
|
|
276
|
+
];
|
|
277
|
+
this.sdfLineRenderer.draw(radiusLine, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Tentative rendering of the vertices of a Circle
|
|
282
|
+
*/
|
|
283
|
+
drawCircleVertices(tentative, zoom) {
|
|
284
|
+
const center = tentative.coordinates;
|
|
285
|
+
const radiusMeters = tentative.radiusMeters ?? 0;
|
|
286
|
+
const radiusHandleAngle = tentative.radiusHandleAngle ?? 135;
|
|
287
|
+
if (radiusMeters > 0) {
|
|
288
|
+
// Compute the position of the radius change handle (on the geodesic outline)
|
|
289
|
+
const handlePosition = destinationPoint(center, radiusMeters, radiusHandleAngle);
|
|
290
|
+
// Draw the center marker (shown below the radius change handle)
|
|
291
|
+
this.drawPointShape(center, this.circleCenterMarkerStyle, zoom);
|
|
292
|
+
// Draw the radius change handle (shown above the center marker)
|
|
293
|
+
this.drawPointShape(handlePosition, this.circleRadiusHandleStyle, zoom);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// When the radius is 0, only the radius change handle is shown at the center position
|
|
297
|
+
this.drawPointShape(center, this.circleCenterMarkerStyle, zoom);
|
|
298
|
+
this.drawPointShape(center, this.circleRadiusHandleStyle, zoom);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Tentative rendering of a Freehand (lines only)
|
|
303
|
+
*
|
|
304
|
+
* Freehand does not draw vertices, so geometry and tentative are the same
|
|
305
|
+
*/
|
|
306
|
+
drawFreehandGeometry(tentative, projectionData, zoom) {
|
|
307
|
+
const coords = tentative.coordinates;
|
|
308
|
+
if (coords.length < 2) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
// Draw the line
|
|
312
|
+
this.sdfLineRenderer.draw(coords, this.strokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Release the resources
|
|
316
|
+
*/
|
|
317
|
+
dispose() {
|
|
318
|
+
this.fillShaderManager.dispose();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewportFilter
|
|
3
|
+
*
|
|
4
|
+
* Filters down to only the features inside the viewport.
|
|
5
|
+
* It uses an expanded viewport and the SpatialIndex as a performance optimization.
|
|
6
|
+
*/
|
|
7
|
+
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
8
|
+
import type { SpatialIndex } from '../store/spatial/spatial-index.js';
|
|
9
|
+
import type { BoundingBox } from '../store/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* The factor by which the render loop widens the viewport for rendering and culling: 2.
|
|
12
|
+
*
|
|
13
|
+
* To prevent flicker while panning and zooming, rendering and culling use the range
|
|
14
|
+
* obtained by widening the real viewport by this factor.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_VIEWPORT_EXPANSION_FACTOR = 2;
|
|
17
|
+
/**
|
|
18
|
+
* Dependencies of ViewportFilter
|
|
19
|
+
*/
|
|
20
|
+
export interface ViewportFilterDeps {
|
|
21
|
+
map: MapLibreMap;
|
|
22
|
+
spatialIndex: SpatialIndex;
|
|
23
|
+
}
|
|
24
|
+
export { nearestLongitude, wrapLongitude } from '../shared/math/longitude.js';
|
|
25
|
+
/**
|
|
26
|
+
* One copy of the world that a view covers
|
|
27
|
+
*
|
|
28
|
+
* `lngShift` is how far the stored longitudes are moved to be drawn there (0 for the stored
|
|
29
|
+
* copy, 360 for the copy east of the antimeridian, -360 for the copy west of it), and
|
|
30
|
+
* `minX` / `maxX` is the view seen from that copy, in stored longitudes.
|
|
31
|
+
*/
|
|
32
|
+
export interface LongitudeCopy {
|
|
33
|
+
readonly lngShift: number;
|
|
34
|
+
readonly minX: number;
|
|
35
|
+
readonly maxX: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Splits an unwrapped longitude range into the copies of the world it covers
|
|
39
|
+
*
|
|
40
|
+
* The features are stored with longitudes in [-180, 180], while the view of the map is a
|
|
41
|
+
* continuous range that can run past the antimeridian (170 to 190, for example). Such a view
|
|
42
|
+
* covers two copies: the stored copy, and the copy moved by 360 degrees, which shows the
|
|
43
|
+
* stored longitudes -190 to -170 (that is, -180 to -170). Each copy is the whole view moved
|
|
44
|
+
* back by its shift, so a longitude falls in the view of at most one copy (the view is less
|
|
45
|
+
* than 360 degrees wide) and nothing is drawn twice; a longitude stored beyond ±180 is still
|
|
46
|
+
* found on the copy that shows it. A range 360 degrees wide or more is the regime of world
|
|
47
|
+
* copies, which are not replicated: it gives the stored copy, whole.
|
|
48
|
+
*
|
|
49
|
+
* @param west The west edge (unwrapped)
|
|
50
|
+
* @param east The east edge (unwrapped, at least west)
|
|
51
|
+
* @returns One or two copies, from the westmost shift
|
|
52
|
+
*/
|
|
53
|
+
export declare function splitLongitudeCopies(west: number, east: number): LongitudeCopy[];
|
|
54
|
+
/**
|
|
55
|
+
* Splits an unwrapped longitude range into the ranges of stored longitudes it shows
|
|
56
|
+
*
|
|
57
|
+
* The ranges of `splitLongitudeCopies`, without the shift: the narrowing down by the
|
|
58
|
+
* spatial index queries each of them.
|
|
59
|
+
*
|
|
60
|
+
* @param west The west edge (unwrapped)
|
|
61
|
+
* @param east The east edge (unwrapped, at least west)
|
|
62
|
+
* @returns One or two ranges `[west, east]` (west <= east)
|
|
63
|
+
*/
|
|
64
|
+
export declare function splitLongitudeRange(west: number, east: number): Array<[number, number]>;
|
|
65
|
+
/**
|
|
66
|
+
* The part of the view on one copy of the world (see `splitLongitudeCopies`)
|
|
67
|
+
*/
|
|
68
|
+
export interface ViewportCopy {
|
|
69
|
+
/** How far the stored longitudes are moved to be drawn on this copy */
|
|
70
|
+
readonly lngShift: number;
|
|
71
|
+
/** The part of the view on this copy, in stored longitudes */
|
|
72
|
+
readonly bounds: BoundingBox;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Computes the copies of the world the current viewport covers, expanded
|
|
76
|
+
*
|
|
77
|
+
* Away from the antimeridian this is the stored copy alone. A view across it gives two:
|
|
78
|
+
* the rendering draws the features of each copy with that copy's shift. When the expanded
|
|
79
|
+
* view is 360 degrees wide or more, the longitudes of the view itself are used; when those are
|
|
80
|
+
* still too wide, it is the regime of world copies and the stored copy is drawn alone.
|
|
81
|
+
*
|
|
82
|
+
* The latitudes keep the expansion in every case. On the globe the whole sphere is often in
|
|
83
|
+
* view, so the longitudes span 360 degrees, and the bounds maplibre reports fall short of the
|
|
84
|
+
* edge of the sphere by a degree or two: without the margin the points between the bounds and
|
|
85
|
+
* the edge were culled and vanished, while a line reaching there was kept by the rest of its
|
|
86
|
+
* box.
|
|
87
|
+
*
|
|
88
|
+
* @param map The MapLibre Map
|
|
89
|
+
* @param expansionFactor The expansion factor
|
|
90
|
+
*/
|
|
91
|
+
export declare function getViewportCopies(map: MapLibreMap, expansionFactor: number): ViewportCopy[];
|
|
92
|
+
/**
|
|
93
|
+
* Computes the ranges of the current viewport, expanded (one, or two across the antimeridian)
|
|
94
|
+
*
|
|
95
|
+
* The narrowing down by the spatial index queries every range, so the features on both sides
|
|
96
|
+
* of the antimeridian are found.
|
|
97
|
+
*
|
|
98
|
+
* @param map The MapLibre Map
|
|
99
|
+
* @param expansionFactor The expansion factor
|
|
100
|
+
*/
|
|
101
|
+
export declare function getExpandedViewportRanges(map: MapLibreMap, expansionFactor: number): BoundingBox[];
|
|
102
|
+
/**
|
|
103
|
+
* Returns the current viewport of a map widened by a factor, as one range in degrees.
|
|
104
|
+
*
|
|
105
|
+
* This gathers the way the render loop obtains the viewport into one place, so that
|
|
106
|
+
* the narrowing down of features (ViewportFilter) and the culling of
|
|
107
|
+
* datasets look at the same range.
|
|
108
|
+
*
|
|
109
|
+
* A single bbox cannot hold the two ranges of a view across the antimeridian, so it
|
|
110
|
+
* covers every longitude in that case (the thinning keeps everything in the latitude
|
|
111
|
+
* band; nothing on either side of the line is dropped). `getExpandedViewportRanges`
|
|
112
|
+
* gives the exact ranges.
|
|
113
|
+
*
|
|
114
|
+
* @param map The MapLibre Map
|
|
115
|
+
* @param expansionFactor The factor applied to the width and height of the viewport (1 = the
|
|
116
|
+
* viewport itself)
|
|
117
|
+
* @returns The range in degrees (`minX` / `maxX` longitudes, `minY` / `maxY` latitudes)
|
|
118
|
+
*/
|
|
119
|
+
export declare function getExpandedViewportBounds(map: MapLibreMap, expansionFactor: number): BoundingBox;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { LngLatBounds as LngLatBoundsClass } from 'maplibre-gl';
|
|
4
|
+
/**
|
|
5
|
+
* The factor by which the render loop widens the viewport for rendering and culling: 2.
|
|
6
|
+
*
|
|
7
|
+
* To prevent flicker while panning and zooming, rendering and culling use the range
|
|
8
|
+
* obtained by widening the real viewport by this factor.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_VIEWPORT_EXPANSION_FACTOR = 2.0;
|
|
11
|
+
/**
|
|
12
|
+
* Expands LngLatBounds by the given factor
|
|
13
|
+
*
|
|
14
|
+
* To prevent flicker while panning and zooming, the viewport is expanded so that
|
|
15
|
+
* off-screen features are included in the render set in advance.
|
|
16
|
+
*
|
|
17
|
+
* Only the latitude is clamped (to -90..90). The longitude keeps the unwrapped values
|
|
18
|
+
* that maplibre returns: a view across the antimeridian has an east edge above 180 (or a
|
|
19
|
+
* west edge below -180), and clamping it would cut the other side of the line off.
|
|
20
|
+
* `splitLongitudeRange` turns the result into ranges of [-180, 180].
|
|
21
|
+
*
|
|
22
|
+
* @param bounds The original bounding box
|
|
23
|
+
* @param factor The expansion factor (2.0 = expand to twice the size)
|
|
24
|
+
* @returns The expanded bounding box
|
|
25
|
+
*
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export function expandBounds(bounds, factor) {
|
|
29
|
+
const sw = bounds.getSouthWest();
|
|
30
|
+
const ne = bounds.getNorthEast();
|
|
31
|
+
const width = ne.lng - sw.lng;
|
|
32
|
+
const height = ne.lat - sw.lat;
|
|
33
|
+
const widthPadding = (width * (factor - 1)) / 2;
|
|
34
|
+
const heightPadding = (height * (factor - 1)) / 2;
|
|
35
|
+
const clampLat = (lat) => Math.max(-90, Math.min(90, lat));
|
|
36
|
+
return new LngLatBoundsClass([sw.lng - widthPadding, clampLat(sw.lat - heightPadding)], [ne.lng + widthPadding, clampLat(ne.lat + heightPadding)]);
|
|
37
|
+
}
|
|
38
|
+
// The longitude helpers are pure math, defined in shared/ (dispatcher/ and snapping/ use
|
|
39
|
+
// them too); re-exported here for the existing imports
|
|
40
|
+
export { nearestLongitude, wrapLongitude } from '../shared/math/longitude.js';
|
|
41
|
+
/**
|
|
42
|
+
* Splits an unwrapped longitude range into the copies of the world it covers
|
|
43
|
+
*
|
|
44
|
+
* The features are stored with longitudes in [-180, 180], while the view of the map is a
|
|
45
|
+
* continuous range that can run past the antimeridian (170 to 190, for example). Such a view
|
|
46
|
+
* covers two copies: the stored copy, and the copy moved by 360 degrees, which shows the
|
|
47
|
+
* stored longitudes -190 to -170 (that is, -180 to -170). Each copy is the whole view moved
|
|
48
|
+
* back by its shift, so a longitude falls in the view of at most one copy (the view is less
|
|
49
|
+
* than 360 degrees wide) and nothing is drawn twice; a longitude stored beyond ±180 is still
|
|
50
|
+
* found on the copy that shows it. A range 360 degrees wide or more is the regime of world
|
|
51
|
+
* copies, which are not replicated: it gives the stored copy, whole.
|
|
52
|
+
*
|
|
53
|
+
* @param west The west edge (unwrapped)
|
|
54
|
+
* @param east The east edge (unwrapped, at least west)
|
|
55
|
+
* @returns One or two copies, from the westmost shift
|
|
56
|
+
*/
|
|
57
|
+
export function splitLongitudeCopies(west, east) {
|
|
58
|
+
if (!(east - west < 360))
|
|
59
|
+
return [{ lngShift: 0, minX: -180, maxX: 180 }];
|
|
60
|
+
const copies = [];
|
|
61
|
+
const first = Math.ceil((west - 180) / 360);
|
|
62
|
+
const last = Math.floor((east + 180) / 360);
|
|
63
|
+
for (let turn = first; turn <= last; turn++) {
|
|
64
|
+
// (+ 0 turns the -0 of Math.ceil into 0)
|
|
65
|
+
const shift = turn * 360 + 0;
|
|
66
|
+
const minX = west - shift;
|
|
67
|
+
const maxX = east - shift;
|
|
68
|
+
// A copy whose view only touches the stored range at its edge adds nothing
|
|
69
|
+
if (Math.min(maxX, 180) > Math.max(minX, -180) || (copies.length === 0 && turn === last)) {
|
|
70
|
+
copies.push({ lngShift: shift, minX, maxX });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return copies;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Splits an unwrapped longitude range into the ranges of stored longitudes it shows
|
|
77
|
+
*
|
|
78
|
+
* The ranges of `splitLongitudeCopies`, without the shift: the narrowing down by the
|
|
79
|
+
* spatial index queries each of them.
|
|
80
|
+
*
|
|
81
|
+
* @param west The west edge (unwrapped)
|
|
82
|
+
* @param east The east edge (unwrapped, at least west)
|
|
83
|
+
* @returns One or two ranges `[west, east]` (west <= east)
|
|
84
|
+
*/
|
|
85
|
+
export function splitLongitudeRange(west, east) {
|
|
86
|
+
return splitLongitudeCopies(west, east).map((copy) => [copy.minX, copy.maxX]);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Computes the copies of the world the current viewport covers, expanded
|
|
90
|
+
*
|
|
91
|
+
* Away from the antimeridian this is the stored copy alone. A view across it gives two:
|
|
92
|
+
* the rendering draws the features of each copy with that copy's shift. When the expanded
|
|
93
|
+
* view is 360 degrees wide or more, the longitudes of the view itself are used; when those are
|
|
94
|
+
* still too wide, it is the regime of world copies and the stored copy is drawn alone.
|
|
95
|
+
*
|
|
96
|
+
* The latitudes keep the expansion in every case. On the globe the whole sphere is often in
|
|
97
|
+
* view, so the longitudes span 360 degrees, and the bounds maplibre reports fall short of the
|
|
98
|
+
* edge of the sphere by a degree or two: without the margin the points between the bounds and
|
|
99
|
+
* the edge were culled and vanished, while a line reaching there was kept by the rest of its
|
|
100
|
+
* box.
|
|
101
|
+
*
|
|
102
|
+
* @param map The MapLibre Map
|
|
103
|
+
* @param expansionFactor The expansion factor
|
|
104
|
+
*/
|
|
105
|
+
export function getViewportCopies(map, expansionFactor) {
|
|
106
|
+
const view = map.getBounds();
|
|
107
|
+
const expanded = expandBounds(view, expansionFactor);
|
|
108
|
+
const tooWide = !(expanded.getEast() - expanded.getWest() < 360);
|
|
109
|
+
const west = tooWide ? view.getWest() : expanded.getWest();
|
|
110
|
+
const east = tooWide ? view.getEast() : expanded.getEast();
|
|
111
|
+
const minY = expanded.getSouth();
|
|
112
|
+
const maxY = expanded.getNorth();
|
|
113
|
+
return splitLongitudeCopies(west, east).map((copy) => ({
|
|
114
|
+
lngShift: copy.lngShift,
|
|
115
|
+
bounds: { minX: copy.minX, minY, maxX: copy.maxX, maxY },
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Computes the ranges of the current viewport, expanded (one, or two across the antimeridian)
|
|
120
|
+
*
|
|
121
|
+
* The narrowing down by the spatial index queries every range, so the features on both sides
|
|
122
|
+
* of the antimeridian are found.
|
|
123
|
+
*
|
|
124
|
+
* @param map The MapLibre Map
|
|
125
|
+
* @param expansionFactor The expansion factor
|
|
126
|
+
*/
|
|
127
|
+
export function getExpandedViewportRanges(map, expansionFactor) {
|
|
128
|
+
return getViewportCopies(map, expansionFactor).map((copy) => copy.bounds);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Returns the current viewport of a map widened by a factor, as one range in degrees.
|
|
132
|
+
*
|
|
133
|
+
* This gathers the way the render loop obtains the viewport into one place, so that
|
|
134
|
+
* the narrowing down of features (ViewportFilter) and the culling of
|
|
135
|
+
* datasets look at the same range.
|
|
136
|
+
*
|
|
137
|
+
* A single bbox cannot hold the two ranges of a view across the antimeridian, so it
|
|
138
|
+
* covers every longitude in that case (the thinning keeps everything in the latitude
|
|
139
|
+
* band; nothing on either side of the line is dropped). `getExpandedViewportRanges`
|
|
140
|
+
* gives the exact ranges.
|
|
141
|
+
*
|
|
142
|
+
* @param map The MapLibre Map
|
|
143
|
+
* @param expansionFactor The factor applied to the width and height of the viewport (1 = the
|
|
144
|
+
* viewport itself)
|
|
145
|
+
* @returns The range in degrees (`minX` / `maxX` longitudes, `minY` / `maxY` latitudes)
|
|
146
|
+
*/
|
|
147
|
+
export function getExpandedViewportBounds(map, expansionFactor) {
|
|
148
|
+
return hullOf(getExpandedViewportRanges(map, expansionFactor));
|
|
149
|
+
}
|
|
150
|
+
/** The bbox of one or two ranges (two ranges together cover every stored longitude) */
|
|
151
|
+
function hullOf(ranges) {
|
|
152
|
+
if (ranges.length === 1)
|
|
153
|
+
return ranges[0];
|
|
154
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
155
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
156
|
+
for (const range of ranges) {
|
|
157
|
+
minX = Math.min(minX, range.minX);
|
|
158
|
+
maxX = Math.max(maxX, range.maxX);
|
|
159
|
+
}
|
|
160
|
+
return { minX, minY: ranges[0].minY, maxX, maxY: ranges[0].maxY };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* ViewportFilter
|
|
164
|
+
*
|
|
165
|
+
* The class that filters features down to those inside the viewport.
|
|
166
|
+
*
|
|
167
|
+
* @internal
|
|
168
|
+
*/
|
|
169
|
+
export class ViewportFilter {
|
|
170
|
+
/**
|
|
171
|
+
* @param deps The dependencies
|
|
172
|
+
* @param expansionFactor The viewport expansion factor (default: 2.0)
|
|
173
|
+
*/
|
|
174
|
+
constructor(deps, expansionFactor = DEFAULT_VIEWPORT_EXPANSION_FACTOR) {
|
|
175
|
+
Object.defineProperty(this, "map", {
|
|
176
|
+
enumerable: true,
|
|
177
|
+
configurable: true,
|
|
178
|
+
writable: true,
|
|
179
|
+
value: void 0
|
|
180
|
+
});
|
|
181
|
+
Object.defineProperty(this, "spatialIndex", {
|
|
182
|
+
enumerable: true,
|
|
183
|
+
configurable: true,
|
|
184
|
+
writable: true,
|
|
185
|
+
value: void 0
|
|
186
|
+
});
|
|
187
|
+
Object.defineProperty(this, "expansionFactor", {
|
|
188
|
+
enumerable: true,
|
|
189
|
+
configurable: true,
|
|
190
|
+
writable: true,
|
|
191
|
+
value: void 0
|
|
192
|
+
});
|
|
193
|
+
this.map = deps.map;
|
|
194
|
+
this.spatialIndex = deps.spatialIndex;
|
|
195
|
+
this.expansionFactor = expansionFactor;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Gets the Set of feature IDs that exist inside the current viewport
|
|
199
|
+
*
|
|
200
|
+
* @returns The Set of feature IDs inside the viewport
|
|
201
|
+
*/
|
|
202
|
+
getVisibleIds() {
|
|
203
|
+
// Across the antimeridian the view is two ranges, and each is queried
|
|
204
|
+
const ids = new Set();
|
|
205
|
+
for (const range of getExpandedViewportRanges(this.map, this.expansionFactor)) {
|
|
206
|
+
for (const id of this.spatialIndex.findInBounds(range))
|
|
207
|
+
ids.add(id);
|
|
208
|
+
}
|
|
209
|
+
return ids;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Gets the copies of the world the current expanded viewport covers
|
|
213
|
+
*
|
|
214
|
+
* One copy (the stored one) away from the antimeridian, two across it
|
|
215
|
+
* (see getViewportCopies).
|
|
216
|
+
*/
|
|
217
|
+
getCopies() {
|
|
218
|
+
return getViewportCopies(this.map, this.expansionFactor);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Gets the Set of feature IDs inside a range of stored longitudes (one copy of the view)
|
|
222
|
+
*/
|
|
223
|
+
getVisibleIdsIn(bounds) {
|
|
224
|
+
return new Set(this.spatialIndex.findInBounds(bounds));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Gets the bbox of the current expanded viewport
|
|
228
|
+
*
|
|
229
|
+
* Across the antimeridian it covers every longitude (see getExpandedViewportBounds).
|
|
230
|
+
*/
|
|
231
|
+
getBounds() {
|
|
232
|
+
return getExpandedViewportBounds(this.map, this.expansionFactor);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Filters an array of features down to those inside the viewport
|
|
236
|
+
*
|
|
237
|
+
* The filtering preserves the draw order.
|
|
238
|
+
*
|
|
239
|
+
* @param features The array of features to filter
|
|
240
|
+
* @returns The array of features inside the viewport
|
|
241
|
+
*/
|
|
242
|
+
filter(features) {
|
|
243
|
+
const visibleIds = this.getVisibleIds();
|
|
244
|
+
return features.filter((f) => visibleIds.has(f.id));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Creates a ViewportFilter
|
|
249
|
+
*
|
|
250
|
+
* @internal
|
|
251
|
+
*/
|
|
252
|
+
export function createViewportFilter(deps, expansionFactor) {
|
|
253
|
+
return new ViewportFilter(deps, expansionFactor);
|
|
254
|
+
}
|