@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,255 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { getMetersPerPixel, metersToDegreesLat, metersToDegreesLng, } from '../../shared/math/index.js';
|
|
4
|
+
import { getTileSize } from '../../shared/utils/map.js';
|
|
5
|
+
import { getImageProperties } from '../../shared/utils/property.js';
|
|
6
|
+
import { computeQuadVertices } from '../shaders/quad.js';
|
|
7
|
+
/**
|
|
8
|
+
* The default image style
|
|
9
|
+
* width/height: 0 = use the original size
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_IMAGE_STYLE = {
|
|
12
|
+
width: 0,
|
|
13
|
+
height: 0,
|
|
14
|
+
rotation: 0,
|
|
15
|
+
opacity: 1.0,
|
|
16
|
+
imageOpacity: 1,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* ImageRenderer
|
|
20
|
+
*
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
export class ImageRenderer {
|
|
24
|
+
constructor(map, _gl, textureCache, quadShader, getFileData, onError) {
|
|
25
|
+
Object.defineProperty(this, "map", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: void 0
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(this, "textureCache", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: void 0
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(this, "quadShader", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: void 0
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(this, "getFileData", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
configurable: true,
|
|
46
|
+
writable: true,
|
|
47
|
+
value: void 0
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(this, "onError", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
configurable: true,
|
|
52
|
+
writable: true,
|
|
53
|
+
value: void 0
|
|
54
|
+
});
|
|
55
|
+
/** Features drawn while their image was decoding, by dataURL (reported if it fails) */
|
|
56
|
+
Object.defineProperty(this, "waitingFeatures", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: new Map()
|
|
61
|
+
});
|
|
62
|
+
/** The dataURL each feature was last reported for, by feature ID */
|
|
63
|
+
Object.defineProperty(this, "reportedFailures", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: new Map()
|
|
68
|
+
});
|
|
69
|
+
this.map = map;
|
|
70
|
+
this.textureCache = textureCache;
|
|
71
|
+
this.quadShader = quadShader;
|
|
72
|
+
this.getFileData = getFileData;
|
|
73
|
+
this.onError = onError;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get the tile size
|
|
77
|
+
*/
|
|
78
|
+
getMapTileSize() {
|
|
79
|
+
return getTileSize(this.map);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Draw an image feature
|
|
83
|
+
*
|
|
84
|
+
* @param feature The image feature
|
|
85
|
+
* @param projectionData MapLibre's ProjectionData
|
|
86
|
+
* @param zoom The current zoom level
|
|
87
|
+
* @param onNeedRedraw Callback for when a redraw is needed
|
|
88
|
+
* @param opacityFactor Multiplied into the opacity of the image (the opacity of its layer)
|
|
89
|
+
*/
|
|
90
|
+
draw(feature, projectionData, zoom, onNeedRedraw, opacityFactor = 1) {
|
|
91
|
+
if (feature.type !== 'Image')
|
|
92
|
+
return;
|
|
93
|
+
const properties = getImageProperties(feature);
|
|
94
|
+
if (!properties.imageFileId)
|
|
95
|
+
return;
|
|
96
|
+
// Obtain the FileData from the Store
|
|
97
|
+
const fileData = this.getFileData(properties.imageFileId);
|
|
98
|
+
// No FileData yet: a transient state (in a shared document the feature can arrive before
|
|
99
|
+
// its file), so the feature is drawn without its image and nothing is logged.
|
|
100
|
+
if (!fileData)
|
|
101
|
+
return;
|
|
102
|
+
const coord = feature.coordinates;
|
|
103
|
+
const latitude = coord[1];
|
|
104
|
+
const style = this.getImageStyle(feature.style);
|
|
105
|
+
// The texture is keyed by the dataURL. While the image is decoding nothing is drawn; the
|
|
106
|
+
// decode (shared per dataURL) requests a redraw when it finishes, and that frame uploads it
|
|
107
|
+
const imageFileId = properties.imageFileId;
|
|
108
|
+
const src = fileData.dataURL;
|
|
109
|
+
const textureInfo = this.textureCache.acquireImageTexture(src, () => {
|
|
110
|
+
this.waitingFeatures.delete(src);
|
|
111
|
+
onNeedRedraw?.();
|
|
112
|
+
}, (error) => {
|
|
113
|
+
console.error(`Failed to load image: ${imageFileId}`, error);
|
|
114
|
+
this.reportFailure(src, error);
|
|
115
|
+
});
|
|
116
|
+
if (!textureInfo) {
|
|
117
|
+
this.noteMissingImage(feature.id, src);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Determine the size (use the size stored in ImageProperties)
|
|
121
|
+
const imageWidth = properties.imageWidth || textureInfo.width;
|
|
122
|
+
const imageHeight = properties.imageHeight || textureInfo.height;
|
|
123
|
+
// Use the size specified by the style, or the original size
|
|
124
|
+
const displayWidth = style.width || imageWidth;
|
|
125
|
+
const displayHeight = style.height || imageHeight;
|
|
126
|
+
// Scale relative to how it is displayed at createdZoom
|
|
127
|
+
// At createdZoom the image is displayed at its original pixel size
|
|
128
|
+
const createdZoom = properties.createdZoom || zoom;
|
|
129
|
+
const scale = properties.scale || 1;
|
|
130
|
+
// Pixel -> meter conversion at createdZoom
|
|
131
|
+
const tileSize = this.getMapTileSize();
|
|
132
|
+
const metersPerPixel = getMetersPerPixel(latitude, createdZoom, tileSize);
|
|
133
|
+
const widthMeters = displayWidth * scale * metersPerPixel;
|
|
134
|
+
const heightMeters = displayHeight * scale * metersPerPixel;
|
|
135
|
+
// Convert meters -> degrees
|
|
136
|
+
const widthDeg = metersToDegreesLng(widthMeters, latitude);
|
|
137
|
+
const heightDeg = metersToDegreesLat(heightMeters);
|
|
138
|
+
// Rotation angle (degrees -> radians)
|
|
139
|
+
const rotationRad = (((style.rotation || 0) + (properties.rotation || 0)) * Math.PI) / 180;
|
|
140
|
+
// Compute the quad vertices
|
|
141
|
+
const vertices = computeQuadVertices(coord[0], coord[1], widthDeg, heightDeg, rotationRad);
|
|
142
|
+
// Draw (imageOpacity takes precedence; otherwise opacity is used)
|
|
143
|
+
const opacity = (style.imageOpacity ?? style.opacity ?? 1.0) * opacityFactor;
|
|
144
|
+
this.quadShader.draw(vertices, textureInfo.texture, opacity, projectionData, zoom);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Merge the image style
|
|
148
|
+
*/
|
|
149
|
+
/**
|
|
150
|
+
* Records a feature whose image is not drawn: reports it at once when the image has failed,
|
|
151
|
+
* otherwise waits for the decode (the cache tells only the caller that started it)
|
|
152
|
+
*/
|
|
153
|
+
noteMissingImage(featureId, src) {
|
|
154
|
+
const error = this.textureCache.getImageError(src);
|
|
155
|
+
if (error) {
|
|
156
|
+
this.reportFeature(featureId, src, error);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
let waiting = this.waitingFeatures.get(src);
|
|
160
|
+
if (!waiting) {
|
|
161
|
+
waiting = new Set();
|
|
162
|
+
this.waitingFeatures.set(src, waiting);
|
|
163
|
+
}
|
|
164
|
+
waiting.add(featureId);
|
|
165
|
+
}
|
|
166
|
+
/** Reports every feature that was waiting for an image that failed */
|
|
167
|
+
reportFailure(src, error) {
|
|
168
|
+
const waiting = this.waitingFeatures.get(src);
|
|
169
|
+
this.waitingFeatures.delete(src);
|
|
170
|
+
for (const featureId of waiting ?? [])
|
|
171
|
+
this.reportFeature(featureId, src, error);
|
|
172
|
+
}
|
|
173
|
+
/** Reports a feature once per image */
|
|
174
|
+
reportFeature(featureId, src, error) {
|
|
175
|
+
if (this.reportedFailures.get(featureId) === src)
|
|
176
|
+
return;
|
|
177
|
+
this.reportedFailures.set(featureId, src);
|
|
178
|
+
this.onError?.(featureId, error);
|
|
179
|
+
}
|
|
180
|
+
getImageStyle(style) {
|
|
181
|
+
return {
|
|
182
|
+
...DEFAULT_IMAGE_STYLE,
|
|
183
|
+
...style,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Compute the bounding box of an image (in degrees)
|
|
188
|
+
*
|
|
189
|
+
* @param feature The image feature
|
|
190
|
+
* @param zoom The current zoom level
|
|
191
|
+
* @returns The bounding box { minX, minY, maxX, maxY }
|
|
192
|
+
*/
|
|
193
|
+
computeBounds(feature, zoom) {
|
|
194
|
+
if (feature.type !== 'Image')
|
|
195
|
+
return null;
|
|
196
|
+
const properties = getImageProperties(feature);
|
|
197
|
+
if (!properties.imageFileId)
|
|
198
|
+
return null;
|
|
199
|
+
const coord = feature.coordinates;
|
|
200
|
+
const latitude = coord[1];
|
|
201
|
+
const style = this.getImageStyle(feature.style);
|
|
202
|
+
// Determine the size
|
|
203
|
+
const imageWidth = properties.imageWidth || style.width;
|
|
204
|
+
const imageHeight = properties.imageHeight || style.height;
|
|
205
|
+
const displayWidth = style.width || imageWidth;
|
|
206
|
+
const displayHeight = style.height || imageHeight;
|
|
207
|
+
// Scale relative to how it is displayed at createdZoom
|
|
208
|
+
const createdZoom = properties.createdZoom || zoom;
|
|
209
|
+
const scale = properties.scale || 1;
|
|
210
|
+
// Pixel -> meter conversion at createdZoom
|
|
211
|
+
const tileSize = this.getMapTileSize();
|
|
212
|
+
const metersPerPixel = getMetersPerPixel(latitude, createdZoom, tileSize);
|
|
213
|
+
const widthMeters = displayWidth * scale * metersPerPixel;
|
|
214
|
+
const heightMeters = displayHeight * scale * metersPerPixel;
|
|
215
|
+
// Convert meters -> degrees
|
|
216
|
+
const widthDeg = metersToDegreesLng(widthMeters, latitude);
|
|
217
|
+
const heightDeg = metersToDegreesLat(heightMeters);
|
|
218
|
+
// Rotation angle
|
|
219
|
+
const rotationRad = (((style.rotation || 0) + (properties.rotation || 0)) * Math.PI) / 180;
|
|
220
|
+
// Compute the quad vertices
|
|
221
|
+
const vertices = computeQuadVertices(coord[0], coord[1], widthDeg, heightDeg, rotationRad);
|
|
222
|
+
// Compute the bounding box
|
|
223
|
+
const lngs = [
|
|
224
|
+
this.mercatorToLng(vertices.topLeft[0]),
|
|
225
|
+
this.mercatorToLng(vertices.topRight[0]),
|
|
226
|
+
this.mercatorToLng(vertices.bottomLeft[0]),
|
|
227
|
+
this.mercatorToLng(vertices.bottomRight[0]),
|
|
228
|
+
];
|
|
229
|
+
const lats = [
|
|
230
|
+
this.mercatorToLat(vertices.topLeft[1]),
|
|
231
|
+
this.mercatorToLat(vertices.topRight[1]),
|
|
232
|
+
this.mercatorToLat(vertices.bottomLeft[1]),
|
|
233
|
+
this.mercatorToLat(vertices.bottomRight[1]),
|
|
234
|
+
];
|
|
235
|
+
return {
|
|
236
|
+
minX: Math.min(...lngs),
|
|
237
|
+
minY: Math.min(...lats),
|
|
238
|
+
maxX: Math.max(...lngs),
|
|
239
|
+
maxY: Math.max(...lats),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Convert a Mercator X coordinate to longitude
|
|
244
|
+
*/
|
|
245
|
+
mercatorToLng(x) {
|
|
246
|
+
return x * 360 - 180;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Convert a Mercator Y coordinate to latitude
|
|
250
|
+
*/
|
|
251
|
+
mercatorToLat(y) {
|
|
252
|
+
const n = Math.PI - 2 * Math.PI * y;
|
|
253
|
+
return (180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Coordinate } from '../../../shared/types/model.js';
|
|
2
|
+
export type { Coordinate };
|
|
3
|
+
/** One dash of a dashed line, as returned by {@link splitIntoDashes}. */
|
|
4
|
+
export interface DashSegment {
|
|
5
|
+
/** The positions `[lng, lat]` of the dash, at least 2 */
|
|
6
|
+
coords: Coordinate[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Splits a line into the pieces of a dash pattern measured in screen pixels at a zoom.
|
|
10
|
+
*
|
|
11
|
+
* Lengths are measured in Web Mercator pixels of 512 px tiles, so the dashes look the
|
|
12
|
+
* specified length on screen at `zoom`. The pattern continues across vertices.
|
|
13
|
+
*
|
|
14
|
+
* @param coords The vertices `[lng, lat]` in degrees
|
|
15
|
+
* @param dashLength The dash length in screen px
|
|
16
|
+
* @param gapLength The gap length in screen px
|
|
17
|
+
* @param zoom The zoom the lengths are measured at
|
|
18
|
+
* @returns The dashes, in order along the line. An empty array for fewer than 2 positions
|
|
19
|
+
*/
|
|
20
|
+
export declare function splitIntoDashes(coords: Coordinate[], dashLength: number, gapLength: number, zoom: number): DashSegment[];
|
|
21
|
+
/**
|
|
22
|
+
* Returns the dash and gap lengths in px that suit a line style at a line width.
|
|
23
|
+
*
|
|
24
|
+
* Unlike getDashPattern (preset) in shared/math, this computes dynamically from the stroke
|
|
25
|
+
* width.
|
|
26
|
+
*
|
|
27
|
+
* @param lineStyle The line style
|
|
28
|
+
* @param strokeWidth The line thickness at draw time (pixels)
|
|
29
|
+
* @returns [dashLength, gapLength], or null (for a solid line)
|
|
30
|
+
*/
|
|
31
|
+
export declare function getStrokeDashPattern(lineStyle: 'solid' | 'dashed' | 'dotted', strokeWidth?: number): [number, number] | null;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Dash pattern computation utilities
|
|
5
|
+
*
|
|
6
|
+
* Precomputes the dash pattern on the CPU side and returns each dash as an individual segment
|
|
7
|
+
*/
|
|
8
|
+
import { DEFAULT_TILE_SIZE } from '../../../shared/math/index.js';
|
|
9
|
+
const RADIANS_PER_DEGREE = Math.PI / 180;
|
|
10
|
+
/**
|
|
11
|
+
* Measures the distance between two points in screen pixels
|
|
12
|
+
*
|
|
13
|
+
* The dash length and gap length arrive in screen pixels (the caller derives them from the
|
|
14
|
+
* effective line width), so unless the path is measured on exactly the same scale, the result
|
|
15
|
+
* will not look the way it was specified.
|
|
16
|
+
*
|
|
17
|
+
* In Web Mercator:
|
|
18
|
+
* - 1 degree of longitude = worldSize / 360 px (constant regardless of latitude)
|
|
19
|
+
* - 1 degree of latitude = 1 / cos(lat) times that (stretched more at higher latitudes)
|
|
20
|
+
* where worldSize = tileSize x 2^zoom (tileSize is 512).
|
|
21
|
+
*
|
|
22
|
+
* The old implementation used 156543 m/px (= the zoom 0 resolution based on 256 px tiles) and
|
|
23
|
+
* did not account for the latitude stretch either, so it estimated the path length at 1/2 to
|
|
24
|
+
* 1/2.5 of its actual size. As a result, dashes were drawn 2 to 2.5 times longer than
|
|
25
|
+
* specified, and short paths fit within a single dash and looked solid.
|
|
26
|
+
*/
|
|
27
|
+
function calculateDistance(p1, p2, zoom, tileSize = DEFAULT_TILE_SIZE) {
|
|
28
|
+
const pixelsPerLngDegree = (tileSize * 2 ** zoom) / 360;
|
|
29
|
+
// Determine the stretch per degree from the latitude at the middle of the interval (the
|
|
30
|
+
// mapping is affine within the interval, so interpolating with the ratio computed here still
|
|
31
|
+
// gives exactly the same intersection positions)
|
|
32
|
+
const latitude = (p1[1] + p2[1]) / 2;
|
|
33
|
+
const cosLatitude = Math.max(Math.cos(latitude * RADIANS_PER_DEGREE), 1e-6);
|
|
34
|
+
const x = (p2[0] - p1[0]) * pixelsPerLngDegree;
|
|
35
|
+
const y = ((p2[1] - p1[1]) * pixelsPerLngDegree) / cosLatitude;
|
|
36
|
+
return Math.hypot(x, y);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Interpolates between two points
|
|
40
|
+
*/
|
|
41
|
+
function interpolate(p1, p2, t) {
|
|
42
|
+
return [p1[0] + (p2[0] - p1[0]) * t, p1[1] + (p2[1] - p1[1]) * t];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Splits a line into the pieces of a dash pattern measured in screen pixels at a zoom.
|
|
46
|
+
*
|
|
47
|
+
* Lengths are measured in Web Mercator pixels of 512 px tiles, so the dashes look the
|
|
48
|
+
* specified length on screen at `zoom`. The pattern continues across vertices.
|
|
49
|
+
*
|
|
50
|
+
* @param coords The vertices `[lng, lat]` in degrees
|
|
51
|
+
* @param dashLength The dash length in screen px
|
|
52
|
+
* @param gapLength The gap length in screen px
|
|
53
|
+
* @param zoom The zoom the lengths are measured at
|
|
54
|
+
* @returns The dashes, in order along the line. An empty array for fewer than 2 positions
|
|
55
|
+
*/
|
|
56
|
+
export function splitIntoDashes(coords, dashLength, gapLength, zoom) {
|
|
57
|
+
if (coords.length < 2)
|
|
58
|
+
return [];
|
|
59
|
+
const segments = [];
|
|
60
|
+
let currentDash = [];
|
|
61
|
+
let distanceInPattern = 0; // Current position within the pattern
|
|
62
|
+
let inDash = true; // Whether we are currently in a dash portion
|
|
63
|
+
// Add the first point
|
|
64
|
+
currentDash.push(coords[0]);
|
|
65
|
+
for (let i = 0; i < coords.length - 1; i++) {
|
|
66
|
+
const p1 = coords[i];
|
|
67
|
+
const p2 = coords[i + 1];
|
|
68
|
+
const segmentLength = calculateDistance(p1, p2, zoom);
|
|
69
|
+
if (segmentLength === 0)
|
|
70
|
+
continue;
|
|
71
|
+
let remainingInSegment = segmentLength;
|
|
72
|
+
let currentT = 0; // Current position within the segment (0-1)
|
|
73
|
+
while (remainingInSegment > 0) {
|
|
74
|
+
if (inDash) {
|
|
75
|
+
// Dash portion
|
|
76
|
+
const remainingInDash = dashLength - distanceInPattern;
|
|
77
|
+
if (remainingInSegment >= remainingInDash) {
|
|
78
|
+
// The dash ends
|
|
79
|
+
const t = currentT + remainingInDash / segmentLength;
|
|
80
|
+
const point = interpolate(p1, p2, Math.min(t, 1));
|
|
81
|
+
currentDash.push(point);
|
|
82
|
+
// Store the dash
|
|
83
|
+
if (currentDash.length >= 2) {
|
|
84
|
+
segments.push({ coords: [...currentDash] });
|
|
85
|
+
}
|
|
86
|
+
currentDash = [];
|
|
87
|
+
remainingInSegment -= remainingInDash;
|
|
88
|
+
currentT = t;
|
|
89
|
+
distanceInPattern = 0;
|
|
90
|
+
inDash = false;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// The dash continues within the segment
|
|
94
|
+
distanceInPattern += remainingInSegment;
|
|
95
|
+
remainingInSegment = 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Gap portion
|
|
100
|
+
const remainingInGap = gapLength - distanceInPattern;
|
|
101
|
+
if (remainingInSegment >= remainingInGap) {
|
|
102
|
+
// The gap ends
|
|
103
|
+
const t = currentT + remainingInGap / segmentLength;
|
|
104
|
+
const point = interpolate(p1, p2, Math.min(t, 1));
|
|
105
|
+
currentDash = [point];
|
|
106
|
+
remainingInSegment -= remainingInGap;
|
|
107
|
+
currentT = t;
|
|
108
|
+
distanceInPattern = 0;
|
|
109
|
+
inDash = true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// The gap continues within the segment
|
|
113
|
+
distanceInPattern += remainingInSegment;
|
|
114
|
+
remainingInSegment = 0;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Add the end point of the segment (when we are in a dash portion)
|
|
119
|
+
if (inDash && currentDash.length > 0) {
|
|
120
|
+
currentDash.push(p2);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Store the last dash
|
|
124
|
+
if (inDash && currentDash.length >= 2) {
|
|
125
|
+
segments.push({ coords: currentDash });
|
|
126
|
+
}
|
|
127
|
+
return segments;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Returns the dash and gap lengths in px that suit a line style at a line width.
|
|
131
|
+
*
|
|
132
|
+
* Unlike getDashPattern (preset) in shared/math, this computes dynamically from the stroke
|
|
133
|
+
* width.
|
|
134
|
+
*
|
|
135
|
+
* @param lineStyle The line style
|
|
136
|
+
* @param strokeWidth The line thickness at draw time (pixels)
|
|
137
|
+
* @returns [dashLength, gapLength], or null (for a solid line)
|
|
138
|
+
*/
|
|
139
|
+
export function getStrokeDashPattern(lineStyle, strokeWidth = 2) {
|
|
140
|
+
// The minimum gap at which round caps do not overlap
|
|
141
|
+
const minGap = strokeWidth + 1;
|
|
142
|
+
switch (lineStyle) {
|
|
143
|
+
case 'dashed':
|
|
144
|
+
// Dashed: longer dashes (4x the line width), moderate gaps (2x the line width)
|
|
145
|
+
return [Math.max(12, strokeWidth * 4), Math.max(minGap, strokeWidth * 2)];
|
|
146
|
+
case 'dotted':
|
|
147
|
+
// Dotted: short dots (nearly round), short gaps (about the line width)
|
|
148
|
+
return [Math.max(1, strokeWidth * 0.5), Math.max(minGap, strokeWidth * 1.2)];
|
|
149
|
+
default:
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const INSTANCE_STRIDE = 12;
|
|
2
|
+
export declare const INSTANCE_BYTES: number;
|
|
3
|
+
/**
|
|
4
|
+
* The upper bound on subdivision points
|
|
5
|
+
*
|
|
6
|
+
* When terrain is enabled, a single segment is split into at most this many parts to draw it.
|
|
7
|
+
* A long straight line with only two vertices (34km as measured) sinks into the terrain
|
|
8
|
+
* between subdivision points when split coarsely, so the line looks broken up like a dashed
|
|
9
|
+
* line. The upper bound was decided from that (34km / 512 = 66m, which lands at the same
|
|
10
|
+
* granularity as the subdivision step).
|
|
11
|
+
* The vertex buffer of the strip statically holds this upper bound, but (512+1)*2 vertices =
|
|
12
|
+
* 4KB, so it is negligible as a resource. The number of vertices actually drawn is determined
|
|
13
|
+
* from u_stations every time.
|
|
14
|
+
*/
|
|
15
|
+
export declare const MAX_LINE_STATIONS = 512;
|
|
16
|
+
/**
|
|
17
|
+
* A guideline for how many post-split segments a single draw call may produce (a guard against
|
|
18
|
+
* a vertex-count blow-up)
|
|
19
|
+
*
|
|
20
|
+
* The number of subdivisions is determined by the longest segment in the batch, so a single
|
|
21
|
+
* long line mixed into a batch full of short lines makes the whole batch use the maximum
|
|
22
|
+
* subdivision. This caps that.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LINE_STATION_BUDGET = 500000;
|
|
25
|
+
/**
|
|
26
|
+
* The strip vertices shared by all instances (side, station)
|
|
27
|
+
*
|
|
28
|
+
* side: 1=left, -1=right / station: the index of the subdivision point along the segment
|
|
29
|
+
*
|
|
30
|
+
* On terrain, a segment sinks into valleys unless it is subdivided. Here the subdivision is
|
|
31
|
+
* expressed as "the station index in the vertex buffer plus the vertex count at draw time".
|
|
32
|
+
* Neither the coordinate texture of the segment nor the instance array is touched, so both
|
|
33
|
+
* retained batches and the partial update for a vertex drag (patchRetainedBatchCoords) keep
|
|
34
|
+
* working as they are.
|
|
35
|
+
*
|
|
36
|
+
* With u_stations = 1, drawing only 4 vertices gives stations 0,0,1,1, which is exactly the
|
|
37
|
+
* same triangle strip as before terrain was introduced.
|
|
38
|
+
*/
|
|
39
|
+
export declare const STATION_VERTICES: Float32Array<ArrayBuffer>;
|