@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,13 @@
|
|
|
1
|
+
import type { Feature } from '../shared/types/model.js';
|
|
2
|
+
import type { RetainedStyleResolver } from '../view/renderers/retained.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whether the analytic drape draws the polygons and lines of this feature
|
|
5
|
+
*
|
|
6
|
+
* It is paired with `collectDataset` in `view/terrain/drape/pass.ts`. Changing only one of
|
|
7
|
+
* them would show the selection highlight twice or in neither of them.
|
|
8
|
+
*
|
|
9
|
+
* A dashed outline does not go onto the drape (solving the accumulated distance along the outline
|
|
10
|
+
* from the pixels is not implemented, so drawing it as a solid line would change the appearance).
|
|
11
|
+
* For what does not go onto it, the immediate-mode path draws the highlight as before.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isHandedToDrape(feature: Feature, styles: RetainedStyleResolver): boolean;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { SELECTION_HIGHLIGHT_COLOR, SELECTION_HIGHLIGHT_FILL_OPACITY, SELECTION_HIGHLIGHT_RING_EXTRA, SELECTION_HIGHLIGHT_STROKE_EXTRA, } from '../shared/config/selection-highlight.js';
|
|
4
|
+
import { getBoundingBox } from '../shared/utils/feature-bbox.js';
|
|
5
|
+
import { getStyleRuleChannel } from '../view/style-rule.js';
|
|
6
|
+
import { isDrapePaintedDataset } from '../view/terrain/state.js';
|
|
7
|
+
import { boundsIntersect } from './chunk.js';
|
|
8
|
+
import { pointMarkerRadiusPx, worldUnitsPerPixel } from './thinning.js';
|
|
9
|
+
/** Default line width (the same as lineString.stroke.width of feature-style) */
|
|
10
|
+
const DEFAULT_STROKE_WIDTH = 2;
|
|
11
|
+
/** Default radius of a point (half of point.point.size 12 of feature-style) */
|
|
12
|
+
const DEFAULT_POINT_RADIUS = 6;
|
|
13
|
+
/**
|
|
14
|
+
* Overpaints the selected features with the highlight
|
|
15
|
+
*
|
|
16
|
+
* Neither the retained batches nor the reused features are touched. It only overdraws on the
|
|
17
|
+
* same immediate-mode path as fallback, so switching the selection never rebuilds a GPU
|
|
18
|
+
* resource.
|
|
19
|
+
*
|
|
20
|
+
* A point is drawn as "a point of the key color slightly larger than the original → the
|
|
21
|
+
* original point", so that the difference shows as a ring. Lines and polygons are painted over
|
|
22
|
+
* in the key color.
|
|
23
|
+
*
|
|
24
|
+
* While the polygons and lines are handed to the analytic drape, however, their highlight is
|
|
25
|
+
* not drawn here (the drape draws it as ground pixels; `isHandedToDrape`). The immediate-mode
|
|
26
|
+
* path only subdivides along the terrain inside the region of the subdivision (the DEM atlas ∩
|
|
27
|
+
* the view), so drawing a surface the size of a prefecture here would leave everything outside
|
|
28
|
+
* that region as flat triangles and turn into "a red vertical wall" and "a wrong fan-shaped
|
|
29
|
+
* coverage". The test for the hand-over is paired with the drape side (collectDataset in
|
|
30
|
+
* `drape/pass.ts`), so in the band where the feature itself appears the highlight always
|
|
31
|
+
* appears too.
|
|
32
|
+
*
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export function drawSelectionHighlight(input) {
|
|
36
|
+
const { target, projectionData, zoom, bounds, styles } = input;
|
|
37
|
+
if (input.selected.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
const visible = input.selected.filter((feature) => feature.visible && boundsIntersect(getBoundingBox(feature), bounds));
|
|
40
|
+
if (visible.length === 0)
|
|
41
|
+
return;
|
|
42
|
+
target.beginFrame(projectionData, zoom);
|
|
43
|
+
for (const feature of visible) {
|
|
44
|
+
const prepared = input.prepare(feature);
|
|
45
|
+
// The hand-over decision (drapedFills) switches a few frames late, so looking only at it
|
|
46
|
+
// would let the immediate path draw the highlight while the drape is already painting. The
|
|
47
|
+
// immediate path does not subdivide outside the region of the subdivision, so a surface as
|
|
48
|
+
// large as a prefecture or a city becomes a flat plate there, floats off the terrain and
|
|
49
|
+
// raises a vertical wall. Whether it is actually painting is looked at as well
|
|
50
|
+
const draped = input.drapedFills || isDrapePaintedDataset(input.terrain, input.datasetId);
|
|
51
|
+
if (draped && styles && isHandedToDrape(prepared, styles)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
target.processFeature(highlightFeature(prepared), false);
|
|
55
|
+
// To make a point look like a ring, the original point is drawn again over the highlight.
|
|
56
|
+
// For a point drawn by an external renderer the overpaint is skipped and only the halo
|
|
57
|
+
// underneath is left (the picture of the external renderer is drawn above core, so the
|
|
58
|
+
// result is a selection halo behind that picture)
|
|
59
|
+
if (getStyleRuleChannel(prepared.type) === 'point' && !input.isExternalPoint(prepared)) {
|
|
60
|
+
target.processFeature(prepared, false);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
target.endFrame();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Returns the frontmost hit (the feature as stored, without the styles applied, and its row)
|
|
67
|
+
*
|
|
68
|
+
* The candidates are narrowed with the spatial index and tested precisely from the back of the
|
|
69
|
+
* draw order (the front).
|
|
70
|
+
*
|
|
71
|
+
* A point is "grabbable anywhere inside the marker that is drawn". A marker is drawn at the
|
|
72
|
+
* size of the radius + the white outline multiplied by the zoom-dependent factor, and depending
|
|
73
|
+
* on what the host specifies and on the factor it gets far larger than the click tolerance.
|
|
74
|
+
* Deciding by the tolerance alone would miss even a click inside a clearly visible circle (the
|
|
75
|
+
* tolerance passed in is kept as a lower bound).
|
|
76
|
+
*
|
|
77
|
+
* @internal
|
|
78
|
+
*/
|
|
79
|
+
export function hitTestDisplayFeatures(input) {
|
|
80
|
+
const { coordinate, toleranceLngLat, baseStyle, pointDefaults: defaults, scale } = input;
|
|
81
|
+
const degreesPerPixel = worldUnitsPerPixel(input.zoom) * 360;
|
|
82
|
+
// The narrowing of the index is widened to the range the largest marker reaches
|
|
83
|
+
const maxPointRadius = Math.max(pointMarkerRadiusPx(undefined, baseStyle, defaults, scale), input.maxStylePointRadius > 0
|
|
84
|
+
? pointMarkerRadiusPx(input.maxStylePointRadius, baseStyle, defaults, scale)
|
|
85
|
+
: 0);
|
|
86
|
+
const reach = Math.max(toleranceLngLat, maxPointRadius * degreesPerPixel);
|
|
87
|
+
const bounds = {
|
|
88
|
+
minX: coordinate[0] - reach,
|
|
89
|
+
minY: coordinate[1] - reach,
|
|
90
|
+
maxX: coordinate[0] + reach,
|
|
91
|
+
maxY: coordinate[1] + reach,
|
|
92
|
+
};
|
|
93
|
+
const candidates = input.search(bounds);
|
|
94
|
+
for (let i = candidates.length - 1; i >= 0; i--) {
|
|
95
|
+
const row = candidates[i];
|
|
96
|
+
// What has been thinned away and is not visible cannot be grabbed
|
|
97
|
+
if (!input.isDrawn(row))
|
|
98
|
+
continue;
|
|
99
|
+
const feature = input.featureAt(row);
|
|
100
|
+
if (!feature.visible)
|
|
101
|
+
continue;
|
|
102
|
+
const tolerance = getStyleRuleChannel(feature.type) === 'point'
|
|
103
|
+
? Math.max(toleranceLngLat, pointMarkerRadiusPx(feature.style?.pointRadius, baseStyle, defaults, scale) *
|
|
104
|
+
degreesPerPixel)
|
|
105
|
+
: toleranceLngLat;
|
|
106
|
+
if (input.test(feature, coordinate, tolerance))
|
|
107
|
+
return { feature, row };
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Measures the largest point radius given by an individual style (0 when none is given)
|
|
113
|
+
*
|
|
114
|
+
* It is used to decide the range that narrows the hit test candidates. Only the points are
|
|
115
|
+
* walked.
|
|
116
|
+
*
|
|
117
|
+
* @internal
|
|
118
|
+
*/
|
|
119
|
+
export function maxStylePointRadiusOf(features) {
|
|
120
|
+
let max = 0;
|
|
121
|
+
for (const feature of features) {
|
|
122
|
+
if (getStyleRuleChannel(feature.type) !== 'point')
|
|
123
|
+
continue;
|
|
124
|
+
const radius = feature.style?.pointRadius;
|
|
125
|
+
if (radius !== undefined && radius > max)
|
|
126
|
+
max = radius;
|
|
127
|
+
}
|
|
128
|
+
return max;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Checks whether two feature lists have the same set of ids
|
|
132
|
+
*
|
|
133
|
+
* It is used for the diff test of the selection. The order is determined by the draw order, so
|
|
134
|
+
* if the sets are the same the order is the same too.
|
|
135
|
+
*
|
|
136
|
+
* @internal
|
|
137
|
+
*/
|
|
138
|
+
export function sameFeatureIds(a, b) {
|
|
139
|
+
if (a.length !== b.length)
|
|
140
|
+
return false;
|
|
141
|
+
for (let i = 0; i < a.length; i++) {
|
|
142
|
+
if (a[i].id !== b[i].id)
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Whether the analytic drape draws the polygons and lines of this feature
|
|
149
|
+
*
|
|
150
|
+
* It is paired with `collectDataset` in `view/terrain/drape/pass.ts`. Changing only one of
|
|
151
|
+
* them would show the selection highlight twice or in neither of them.
|
|
152
|
+
*
|
|
153
|
+
* A dashed outline does not go onto the drape (solving the accumulated distance along the outline
|
|
154
|
+
* from the pixels is not implemented, so drawing it as a solid line would change the appearance).
|
|
155
|
+
* For what does not go onto it, the immediate-mode path draws the highlight as before.
|
|
156
|
+
*/
|
|
157
|
+
export function isHandedToDrape(feature, styles) {
|
|
158
|
+
if (feature.type === 'Polygon' || feature.type === 'MultiPolygon') {
|
|
159
|
+
const { fillColor, strokeStyle } = styles.getPolygonStyles(feature);
|
|
160
|
+
const hasStroke = strokeStyle.opacity > 0 && strokeStyle.width > 0;
|
|
161
|
+
if (hasStroke && strokeStyle.lineStyle !== 'solid')
|
|
162
|
+
return false;
|
|
163
|
+
return hasStroke || fillColor[3] > 0;
|
|
164
|
+
}
|
|
165
|
+
if (feature.type === 'LineString' ||
|
|
166
|
+
feature.type === 'MultiLineString' ||
|
|
167
|
+
feature.type === 'Freehand') {
|
|
168
|
+
const strokeStyle = styles.getLineStringStrokeStyle(feature);
|
|
169
|
+
if (strokeStyle.lineStyle !== 'solid')
|
|
170
|
+
return false;
|
|
171
|
+
return strokeStyle.opacity > 0 && strokeStyle.width > 0;
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Returns a feature whose style is overwritten for the selection highlight
|
|
177
|
+
*
|
|
178
|
+
* Neither the original feature nor the cache is rewritten; a copy with only the style replaced is
|
|
179
|
+
* made. The painting is split by the channel of the geometry type (the same vocabulary as the
|
|
180
|
+
* rule colors).
|
|
181
|
+
*
|
|
182
|
+
* - Point: a point of the key color with the original radius + 3px (the original point is drawn
|
|
183
|
+
* on top of it to make a ring)
|
|
184
|
+
* - Line: a line of the key color with the original width + 2px
|
|
185
|
+
* - Polygon: a translucent fill of the key color and a frame of the key color with the original
|
|
186
|
+
* width + 2px
|
|
187
|
+
*
|
|
188
|
+
* @internal
|
|
189
|
+
*/
|
|
190
|
+
export function highlightFeature(feature) {
|
|
191
|
+
const style = feature.style;
|
|
192
|
+
const channel = getStyleRuleChannel(feature.type);
|
|
193
|
+
if (channel === 'point') {
|
|
194
|
+
return {
|
|
195
|
+
...feature,
|
|
196
|
+
style: {
|
|
197
|
+
...style,
|
|
198
|
+
pointColor: SELECTION_HIGHLIGHT_COLOR,
|
|
199
|
+
pointRadius: (style?.pointRadius ?? DEFAULT_POINT_RADIUS) + SELECTION_HIGHLIGHT_RING_EXTRA,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const strokeWidth = (style?.strokeWidth ?? DEFAULT_STROKE_WIDTH) + SELECTION_HIGHLIGHT_STROKE_EXTRA;
|
|
204
|
+
if (channel === 'stroke') {
|
|
205
|
+
return {
|
|
206
|
+
...feature,
|
|
207
|
+
style: {
|
|
208
|
+
...style,
|
|
209
|
+
strokeColor: SELECTION_HIGHLIGHT_COLOR,
|
|
210
|
+
strokeOpacity: 1,
|
|
211
|
+
strokeWidth,
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
...feature,
|
|
217
|
+
style: {
|
|
218
|
+
...style,
|
|
219
|
+
fillColor: SELECTION_HIGHLIGHT_COLOR,
|
|
220
|
+
fillOpacity: SELECTION_HIGHLIGHT_FILL_OPACITY,
|
|
221
|
+
strokeColor: SELECTION_HIGHLIGHT_COLOR,
|
|
222
|
+
strokeOpacity: 1,
|
|
223
|
+
strokeWidth,
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { computeFeatureBounds, partitionIntoChunks } from './chunk.js';
|
|
4
|
+
import { chunkTargetSizeFor } from './partition.js';
|
|
5
|
+
import { collectFeatures } from './retained.js';
|
|
6
|
+
import { maxStylePointRadiusOf } from './selection.js';
|
|
7
|
+
import { DisplaySpatialIndex } from './spatial.js';
|
|
8
|
+
import { featureThinningRole } from './thinning.js';
|
|
9
|
+
/**
|
|
10
|
+
* The contents given as an array of features
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export class FeatureArraySource {
|
|
15
|
+
/**
|
|
16
|
+
* @param list The normalized features, in draw order
|
|
17
|
+
*/
|
|
18
|
+
constructor(list) {
|
|
19
|
+
Object.defineProperty(this, "list", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: list
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(this, "length", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "bounds", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: void 0
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(this, "chunks", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: void 0
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(this, "index", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: new DisplaySpatialIndex()
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(this, "maxStylePointRadius", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
configurable: true,
|
|
52
|
+
writable: true,
|
|
53
|
+
value: void 0
|
|
54
|
+
});
|
|
55
|
+
/** The row of each id, built on the first request */
|
|
56
|
+
Object.defineProperty(this, "rowById", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: null
|
|
61
|
+
});
|
|
62
|
+
this.length = list.length;
|
|
63
|
+
// The bboxes are shared by the spatial index and the chunk splitting (not computed twice)
|
|
64
|
+
this.bounds = computeFeatureBounds(list);
|
|
65
|
+
this.index.load(this.bounds);
|
|
66
|
+
this.chunks = partitionIntoChunks(list, chunkTargetSizeFor(list.length), this.bounds);
|
|
67
|
+
this.maxStylePointRadius = maxStylePointRadiusOf(list);
|
|
68
|
+
}
|
|
69
|
+
hasGeometry(row) {
|
|
70
|
+
return !Number.isNaN(this.bounds[row * 4]);
|
|
71
|
+
}
|
|
72
|
+
featureAt(row) {
|
|
73
|
+
return this.list[row];
|
|
74
|
+
}
|
|
75
|
+
idOf(row) {
|
|
76
|
+
return this.list[row].id;
|
|
77
|
+
}
|
|
78
|
+
typeOf(row) {
|
|
79
|
+
return this.hasGeometry(row) ? this.list[row].type : null;
|
|
80
|
+
}
|
|
81
|
+
rowsOfIds(ids) {
|
|
82
|
+
const rows = [];
|
|
83
|
+
if (ids.size === 0)
|
|
84
|
+
return rows;
|
|
85
|
+
for (let row = 0; row < this.list.length; row++) {
|
|
86
|
+
if (ids.has(this.list[row].id))
|
|
87
|
+
rows.push(row);
|
|
88
|
+
}
|
|
89
|
+
return rows;
|
|
90
|
+
}
|
|
91
|
+
rowOfId(id) {
|
|
92
|
+
if (!this.rowById) {
|
|
93
|
+
const map = new Map();
|
|
94
|
+
for (let row = 0; row < this.list.length; row++)
|
|
95
|
+
map.set(this.list[row].id, row);
|
|
96
|
+
this.rowById = map;
|
|
97
|
+
}
|
|
98
|
+
return this.rowById.get(id) ?? -1;
|
|
99
|
+
}
|
|
100
|
+
features() {
|
|
101
|
+
return this.list;
|
|
102
|
+
}
|
|
103
|
+
thinningRole(row) {
|
|
104
|
+
return featureThinningRole(this.list[row]);
|
|
105
|
+
}
|
|
106
|
+
pointOf(row) {
|
|
107
|
+
return this.list[row].coordinates;
|
|
108
|
+
}
|
|
109
|
+
styleRadiusOf(row) {
|
|
110
|
+
return this.list[row].style?.pointRadius;
|
|
111
|
+
}
|
|
112
|
+
collector(rows, context) {
|
|
113
|
+
const list = this.list;
|
|
114
|
+
return collectFeatures(rows.length, (index) => {
|
|
115
|
+
const row = rows[index];
|
|
116
|
+
return context.isDrawn(row) ? context.styler.prepareIfStyled(list[row]) : null;
|
|
117
|
+
}, context);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { buildPackedRTree, searchPackedRTree } from './packed-rtree.js';
|
|
4
|
+
/**
|
|
5
|
+
* Spatial index of a dataset
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class DisplaySpatialIndex {
|
|
10
|
+
constructor() {
|
|
11
|
+
Object.defineProperty(this, "tree", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: null
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** Number of rows stored */
|
|
19
|
+
get size() {
|
|
20
|
+
return this.tree?.numItems ?? 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builds the tree over the bboxes of the rows (the existing contents are discarded)
|
|
24
|
+
*
|
|
25
|
+
* @param bounds `[minX, minY, maxX, maxY]` per row (a NaN row is left out)
|
|
26
|
+
*/
|
|
27
|
+
load(bounds) {
|
|
28
|
+
this.tree = buildPackedRTree(bounds);
|
|
29
|
+
}
|
|
30
|
+
/** Takes a tree built elsewhere (in a Worker, for example) */
|
|
31
|
+
adopt(tree) {
|
|
32
|
+
this.tree = tree;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Returns the rows whose bbox intersects the bounding box, in draw order
|
|
36
|
+
*/
|
|
37
|
+
search(bounds) {
|
|
38
|
+
if (!this.tree)
|
|
39
|
+
return [];
|
|
40
|
+
const rows = searchPackedRTree(this.tree, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);
|
|
41
|
+
rows.sort((a, b) => a - b);
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns the rows whose bbox intersects the bounding box and that `keep` accepts, in draw order
|
|
46
|
+
*
|
|
47
|
+
* The rows are filtered before they are sorted, so a filter that drops most of what is in the
|
|
48
|
+
* range keeps the sort as small as what is kept.
|
|
49
|
+
*/
|
|
50
|
+
searchWhere(bounds, keep) {
|
|
51
|
+
if (!this.tree)
|
|
52
|
+
return new Int32Array(0);
|
|
53
|
+
const hits = searchPackedRTree(this.tree, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);
|
|
54
|
+
const rows = new Int32Array(hits.length);
|
|
55
|
+
let count = 0;
|
|
56
|
+
for (let i = 0; i < hits.length; i++) {
|
|
57
|
+
const row = hits[i];
|
|
58
|
+
if (keep(row))
|
|
59
|
+
rows[count++] = row;
|
|
60
|
+
}
|
|
61
|
+
const kept = count === rows.length ? rows : rows.slice(0, count);
|
|
62
|
+
// A typed array sorts its numbers by value
|
|
63
|
+
return kept.sort();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Empties the index
|
|
67
|
+
*/
|
|
68
|
+
clear() {
|
|
69
|
+
this.tree = null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { StyleRuleCache } from '../view/cache/style-rule.js';
|
|
4
|
+
import { applyRuleColor, getStyleRuleChannel } from '../view/style-rule.js';
|
|
5
|
+
/**
|
|
6
|
+
* The rule and the base style of a dataset, and the features carrying them
|
|
7
|
+
*
|
|
8
|
+
* The features carrying the rule colors are reused per id (so that they are not copied every
|
|
9
|
+
* frame). Whoever changes what they depend on (the rule, the base style, the contents) calls
|
|
10
|
+
* `clear()`.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export class DisplayFeatureStyler {
|
|
15
|
+
constructor(styleRule, baseStyle) {
|
|
16
|
+
Object.defineProperty(this, "styleRule", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true,
|
|
20
|
+
value: void 0
|
|
21
|
+
});
|
|
22
|
+
/** Base style per dataset (per channel) */
|
|
23
|
+
Object.defineProperty(this, "baseStyle", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: void 0
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, "styleCache", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: new StyleRuleCache()
|
|
34
|
+
});
|
|
35
|
+
/** Reuse of the features carrying the rule colors (to avoid copying them every frame) */
|
|
36
|
+
Object.defineProperty(this, "preparedCache", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
writable: true,
|
|
40
|
+
value: new Map()
|
|
41
|
+
});
|
|
42
|
+
this.styleRule = styleRule;
|
|
43
|
+
this.baseStyle = baseStyle;
|
|
44
|
+
}
|
|
45
|
+
/** The base style (undefined when not set) */
|
|
46
|
+
get base() {
|
|
47
|
+
return this.baseStyle;
|
|
48
|
+
}
|
|
49
|
+
/** The style rule (undefined when not set) */
|
|
50
|
+
get rule() {
|
|
51
|
+
return this.styleRule;
|
|
52
|
+
}
|
|
53
|
+
/** Whether a rule or a base style is set (without either, a feature is returned as it is) */
|
|
54
|
+
get isStyled() {
|
|
55
|
+
return Boolean(this.styleRule) || Boolean(this.baseStyle);
|
|
56
|
+
}
|
|
57
|
+
/** Replaces the rule and discards the caches */
|
|
58
|
+
setRule(rule) {
|
|
59
|
+
this.styleRule = rule;
|
|
60
|
+
this.clear();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Replaces the base style and discards the caches
|
|
64
|
+
*
|
|
65
|
+
* The cache of the rule colors does not depend on the base style, but it is discarded together
|
|
66
|
+
* with it, to keep the handling in step with setRule.
|
|
67
|
+
*/
|
|
68
|
+
setBase(style) {
|
|
69
|
+
this.baseStyle = style;
|
|
70
|
+
this.clear();
|
|
71
|
+
}
|
|
72
|
+
/** Discards the evaluation results and the reused features */
|
|
73
|
+
clear() {
|
|
74
|
+
this.styleCache.clear();
|
|
75
|
+
this.preparedCache.clear();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns the feature carrying the rule color and the base style
|
|
79
|
+
*
|
|
80
|
+
* When the individual style has a color for that channel, the rule has no effect
|
|
81
|
+
* (applyRuleColor returns the same reference). The base style goes underneath the rule color
|
|
82
|
+
* and the individual style, so it is spread first and overwritten afterwards. Only when neither
|
|
83
|
+
* the rule nor the base style had any effect is the original feature returned as it is.
|
|
84
|
+
*/
|
|
85
|
+
prepare(feature) {
|
|
86
|
+
const cached = this.preparedCache.get(feature.id);
|
|
87
|
+
if (cached)
|
|
88
|
+
return cached;
|
|
89
|
+
const channel = getStyleRuleChannel(feature.type);
|
|
90
|
+
const ruleColor = this.styleCache.resolve(feature, this.styleRule);
|
|
91
|
+
const style = this.effectiveStyle(feature.style, ruleColor, channel);
|
|
92
|
+
const prepared = style === feature.style ? feature : { ...feature, style };
|
|
93
|
+
this.preparedCache.set(feature.id, prepared);
|
|
94
|
+
return prepared;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The style that `prepare` gives a feature: the individual style over the rule color over the
|
|
98
|
+
* base style of the channel
|
|
99
|
+
*
|
|
100
|
+
* @param style The individual style (undefined for none)
|
|
101
|
+
* @param ruleColor The rule color (null without a rule)
|
|
102
|
+
*/
|
|
103
|
+
effectiveStyle(style, ruleColor, channel) {
|
|
104
|
+
const styled = applyRuleColor(style, ruleColor, channel);
|
|
105
|
+
const base = this.baseStyle?.[channel];
|
|
106
|
+
return base ? { ...base, ...styled } : styled;
|
|
107
|
+
}
|
|
108
|
+
/** Like `prepare`, but returns the feature as it is when nothing is set */
|
|
109
|
+
prepareIfStyled(feature) {
|
|
110
|
+
return this.isStyled ? this.prepare(feature) : feature;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns the array of features carrying the rule colors and the base style
|
|
114
|
+
*
|
|
115
|
+
* The original array is returned as it is when neither the rule nor the base style is set.
|
|
116
|
+
*/
|
|
117
|
+
prepareAll(features) {
|
|
118
|
+
if (!this.isStyled)
|
|
119
|
+
return features;
|
|
120
|
+
const result = new Array(features.length);
|
|
121
|
+
for (let i = 0; i < features.length; i++) {
|
|
122
|
+
result[i] = this.prepare(features[i]);
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The collision thinning of the point markers of a dataset, as the host
|
|
3
|
+
* passes it.
|
|
4
|
+
*
|
|
5
|
+
* Everything can be omitted, and an omitted item takes its default value. While it is
|
|
6
|
+
* enabled, `Point` markers that overlap on screen are not drawn and cannot be hit; lines,
|
|
7
|
+
* polygons and MultiPoint are always drawn. The overlap is tested with the size actually drawn
|
|
8
|
+
* (the radius + the outline + `marginPx`), and the winners are picked greedily from the front
|
|
9
|
+
* of the draw order for each integer zoom band, so panning does not swap them.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const places = draw.addDataset({
|
|
14
|
+
* id: 'places',
|
|
15
|
+
* features,
|
|
16
|
+
* collisionThinning: { enabled: true, fullDisplayZoom: 17, marginPx: 2 },
|
|
17
|
+
* });
|
|
18
|
+
* const { total, visible } = places.getThinningStats(); // "showing 1,200 of 50,000"
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export interface DatasetCollisionThinning {
|
|
22
|
+
/** Whether the thinning is enabled (false by default = everything is drawn as before) */
|
|
23
|
+
enabled?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The zoom at which the thinning stops (17 by default)
|
|
26
|
+
*
|
|
27
|
+
* At or above this zoom the set of winners becomes every feature. It is an escape hatch that
|
|
28
|
+
* avoids "something in the source data can never be seen no matter what", and it can be
|
|
29
|
+
* changed at runtime because it is decided by looking at the real thing.
|
|
30
|
+
*/
|
|
31
|
+
fullDisplayZoom?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Margin added around each marker's footprint, in screen px (2 by default; NaN or a negative
|
|
34
|
+
* value gives 2)
|
|
35
|
+
*/
|
|
36
|
+
marginPx?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The collision thinning in effect, with every default filled in, as
|
|
40
|
+
* {@link Dataset.getCollisionThinning} returns it.
|
|
41
|
+
*/
|
|
42
|
+
export interface ResolvedCollisionThinning {
|
|
43
|
+
/** Whether the thinning is enabled */
|
|
44
|
+
enabled: boolean;
|
|
45
|
+
/** The zoom at or above which every feature is drawn */
|
|
46
|
+
fullDisplayZoom: number;
|
|
47
|
+
/** The margin added around each marker's footprint, in screen px */
|
|
48
|
+
marginPx: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The current result of the collision thinning, as {@link Dataset.getThinningStats}
|
|
52
|
+
* returns it; for a message such as "showing n of N".
|
|
53
|
+
*/
|
|
54
|
+
export interface DatasetThinningStats {
|
|
55
|
+
/** Whether it is enabled as a setting */
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
/** Whether it is actually thinning (the band is below fullDisplayZoom and winners exist) */
|
|
58
|
+
active: boolean;
|
|
59
|
+
/** The number of all the features held */
|
|
60
|
+
total: number;
|
|
61
|
+
/** The number of features drawn (the same as total when nothing is thinned) */
|
|
62
|
+
visible: number;
|
|
63
|
+
/** The zoom band the winners were picked for (null when not computed or disabled) */
|
|
64
|
+
band: number | null;
|
|
65
|
+
}
|