@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,186 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { getMetersPerPixel, toDegrees, toRadians } from './distance.js';
|
|
4
|
+
/**
|
|
5
|
+
* WGS84 ellipsoid parameters
|
|
6
|
+
*/
|
|
7
|
+
const WGS84_SEMI_MAJOR_AXIS = 6378137.0; // Equatorial radius (meters)
|
|
8
|
+
const WGS84_ECCENTRICITY_SQUARED = 6.69437999014e-3; // Square of the first eccentricity
|
|
9
|
+
/**
|
|
10
|
+
* Converts a WGS84 coordinate into an ECEF coordinate (accounting for the ellipsoid)
|
|
11
|
+
*
|
|
12
|
+
* @param coord WGS84 coordinate [lng, lat]
|
|
13
|
+
* @returns ECEF coordinate {x, y, z} (in meters)
|
|
14
|
+
*/
|
|
15
|
+
export function wgs84ToECEF(coord) {
|
|
16
|
+
const lat = toRadians(coord[1]);
|
|
17
|
+
const lng = toRadians(coord[0]);
|
|
18
|
+
// Prime vertical radius of curvature
|
|
19
|
+
const N = WGS84_SEMI_MAJOR_AXIS / Math.sqrt(1 - WGS84_ECCENTRICITY_SQUARED * Math.sin(lat) ** 2);
|
|
20
|
+
return {
|
|
21
|
+
x: N * Math.cos(lat) * Math.cos(lng),
|
|
22
|
+
y: N * Math.cos(lat) * Math.sin(lng),
|
|
23
|
+
z: N * (1 - WGS84_ECCENTRICITY_SQUARED) * Math.sin(lat),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Converts an ECEF coordinate into a WGS84 coordinate (iterative computation by Bowring's
|
|
28
|
+
* method)
|
|
29
|
+
*
|
|
30
|
+
* @param x ECEF X coordinate (meters)
|
|
31
|
+
* @param y ECEF Y coordinate (meters)
|
|
32
|
+
* @param z ECEF Z coordinate (meters)
|
|
33
|
+
* @returns WGS84 coordinate [lng, lat]
|
|
34
|
+
*/
|
|
35
|
+
export function ecefToWGS84(x, y, z) {
|
|
36
|
+
// The longitude can be computed directly
|
|
37
|
+
const lng = Math.atan2(y, x);
|
|
38
|
+
// Iterative computation of the latitude (Bowring's method)
|
|
39
|
+
const p = Math.sqrt(x * x + y * y);
|
|
40
|
+
const e2 = WGS84_ECCENTRICITY_SQUARED;
|
|
41
|
+
const a = WGS84_SEMI_MAJOR_AXIS;
|
|
42
|
+
// Initial value
|
|
43
|
+
let lat = Math.atan2(z, p * (1 - e2));
|
|
44
|
+
// Iterative computation (usually converges in 2-3 rounds)
|
|
45
|
+
for (let i = 0; i < 5; i++) {
|
|
46
|
+
const sinLat = Math.sin(lat);
|
|
47
|
+
const N = a / Math.sqrt(1 - e2 * sinLat * sinLat);
|
|
48
|
+
const newLat = Math.atan2(z + e2 * N * sinLat, p);
|
|
49
|
+
if (Math.abs(newLat - lat) < 1e-12) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
lat = newLat;
|
|
53
|
+
}
|
|
54
|
+
return [toDegrees(lng), toDegrees(lat)];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Rotates a single coordinate about the center point as the axis (ECEF coordinate system,
|
|
58
|
+
* Rodrigues' formula)
|
|
59
|
+
*
|
|
60
|
+
* @param coord The coordinate to rotate [lng, lat]
|
|
61
|
+
* @param center Center point of the rotation [lng, lat]
|
|
62
|
+
* @param angleDegrees Rotation angle (degrees, counter-clockwise)
|
|
63
|
+
* @returns The coordinate after rotation [lng, lat]
|
|
64
|
+
*/
|
|
65
|
+
export function rotateCoordinateOnSphere(coord, center, angleDegrees) {
|
|
66
|
+
const angleRad = toRadians(angleDegrees);
|
|
67
|
+
// Rotation axis: the normal vector from the center point to the center of the Earth
|
|
68
|
+
// (ECEF coordinate system)
|
|
69
|
+
const centerLatRad = toRadians(center[1]);
|
|
70
|
+
const centerLngRad = toRadians(center[0]);
|
|
71
|
+
const axisX = Math.cos(centerLatRad) * Math.cos(centerLngRad);
|
|
72
|
+
const axisY = Math.cos(centerLatRad) * Math.sin(centerLngRad);
|
|
73
|
+
const axisZ = Math.sin(centerLatRad);
|
|
74
|
+
// Convert the WGS84 coordinate into ECEF (3D Cartesian coordinates)
|
|
75
|
+
const latRad = toRadians(coord[1]);
|
|
76
|
+
const lngRad = toRadians(coord[0]);
|
|
77
|
+
const vx = Math.cos(latRad) * Math.cos(lngRad);
|
|
78
|
+
const vy = Math.cos(latRad) * Math.sin(lngRad);
|
|
79
|
+
const vz = Math.sin(latRad);
|
|
80
|
+
// Rodrigues' rotation formula
|
|
81
|
+
// v_rotated = v*cos(θ) + (k×v)*sin(θ) + k*(k·v)*(1-cos(θ))
|
|
82
|
+
// Cross product k×v
|
|
83
|
+
const crossX = axisY * vz - axisZ * vy;
|
|
84
|
+
const crossY = axisZ * vx - axisX * vz;
|
|
85
|
+
const crossZ = axisX * vy - axisY * vx;
|
|
86
|
+
// Dot product k·v
|
|
87
|
+
const dotProduct = axisX * vx + axisY * vy + axisZ * vz;
|
|
88
|
+
// Apply the rotation
|
|
89
|
+
const cosAngle = Math.cos(angleRad);
|
|
90
|
+
const sinAngle = Math.sin(angleRad);
|
|
91
|
+
const oneMinusCos = 1 - cosAngle;
|
|
92
|
+
const rotatedX = vx * cosAngle + crossX * sinAngle + axisX * dotProduct * oneMinusCos;
|
|
93
|
+
const rotatedY = vy * cosAngle + crossY * sinAngle + axisY * dotProduct * oneMinusCos;
|
|
94
|
+
const rotatedZ = vz * cosAngle + crossZ * sinAngle + axisZ * dotProduct * oneMinusCos;
|
|
95
|
+
// Inverse conversion from ECEF into a WGS84 coordinate (unit sphere approximation)
|
|
96
|
+
const newLat = toDegrees(Math.asin(rotatedZ));
|
|
97
|
+
const newLng = toDegrees(Math.atan2(rotatedY, rotatedX));
|
|
98
|
+
return [newLng, newLat];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Rotates multiple coordinates about the center point as the axis (ECEF coordinate system,
|
|
102
|
+
* Rodrigues' formula)
|
|
103
|
+
*
|
|
104
|
+
* @param coords Array of coordinates to rotate
|
|
105
|
+
* @param center Center point of the rotation [lng, lat]
|
|
106
|
+
* @param angleDegrees Rotation angle (degrees, counter-clockwise)
|
|
107
|
+
* @returns Array of coordinates after rotation
|
|
108
|
+
*/
|
|
109
|
+
export function rotateCoordinatesOnSphere(coords, center, angleDegrees) {
|
|
110
|
+
return coords.map((coord) => rotateCoordinateOnSphere(coord, center, angleDegrees));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Kilometers per degree of latitude
|
|
114
|
+
*/
|
|
115
|
+
const KILOMETERS_PER_DEGREE_LATITUDE = 111.32;
|
|
116
|
+
/**
|
|
117
|
+
* Converts kilometers into degrees (with a latitude correction)
|
|
118
|
+
*
|
|
119
|
+
* @param km Distance (kilometers)
|
|
120
|
+
* @param latitude Reference latitude
|
|
121
|
+
* @returns Degrees
|
|
122
|
+
*/
|
|
123
|
+
export function kmToDegrees(km, latitude) {
|
|
124
|
+
// Distance of 1 degree of latitude
|
|
125
|
+
const latDegrees = km / KILOMETERS_PER_DEGREE_LATITUDE;
|
|
126
|
+
// The distance of 1 degree of longitude varies with the latitude
|
|
127
|
+
const lngDegrees = km / (KILOMETERS_PER_DEGREE_LATITUDE * Math.cos(toRadians(latitude)));
|
|
128
|
+
// Use the larger one to be safe
|
|
129
|
+
return Math.max(latDegrees, lngDegrees);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Converts pixels into degrees (with a latitude correction)
|
|
133
|
+
*
|
|
134
|
+
* @param pixels Number of pixels
|
|
135
|
+
* @param latitude Reference latitude
|
|
136
|
+
* @param zoom Zoom level
|
|
137
|
+
* @param tileSize Tile size (default 512)
|
|
138
|
+
* @returns Degrees
|
|
139
|
+
*/
|
|
140
|
+
export function pixelsToDegrees(pixels, latitude, zoom, tileSize = 512) {
|
|
141
|
+
// Meters per pixel
|
|
142
|
+
const metersPerPixel = getMetersPerPixel(latitude, zoom, tileSize);
|
|
143
|
+
// Convert meters into kilometers
|
|
144
|
+
const km = (pixels * metersPerPixel) / 1000;
|
|
145
|
+
// Convert kilometers into degrees (it differs between longitude and latitude)
|
|
146
|
+
const latDegrees = km / KILOMETERS_PER_DEGREE_LATITUDE;
|
|
147
|
+
const lngDegrees = km / (KILOMETERS_PER_DEGREE_LATITUDE * Math.cos(toRadians(latitude)));
|
|
148
|
+
return { lngDegrees, latDegrees };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Computes the vertices of a quad with a rotation applied (uses spherical rotation)
|
|
152
|
+
*
|
|
153
|
+
* @param centerLng Center longitude
|
|
154
|
+
* @param centerLat Center latitude
|
|
155
|
+
* @param halfWidthDeg Half width (degrees) - in the longitude direction
|
|
156
|
+
* @param halfHeightDeg Half height (degrees) - in the latitude direction
|
|
157
|
+
* @param rotationDeg Rotation angle (degrees, counter-clockwise)
|
|
158
|
+
* @returns The 4 vertices of the quad [topLeft, topRight, bottomLeft, bottomRight]
|
|
159
|
+
*/
|
|
160
|
+
export function computeRotatedQuadCorners(centerLng, centerLat, halfWidthDeg, halfHeightDeg, rotationDeg) {
|
|
161
|
+
const center = [centerLng, centerLat];
|
|
162
|
+
// Local coordinates before rotation (positions relative to the center, in degrees)
|
|
163
|
+
// Geographic coordinate system: north is positive (up), south is negative (down)
|
|
164
|
+
const corners = [
|
|
165
|
+
[centerLng - halfWidthDeg, centerLat + halfHeightDeg], // top-left (northwest)
|
|
166
|
+
[centerLng + halfWidthDeg, centerLat + halfHeightDeg], // top-right (northeast)
|
|
167
|
+
[centerLng - halfWidthDeg, centerLat - halfHeightDeg], // bottom-left (southwest)
|
|
168
|
+
[centerLng + halfWidthDeg, centerLat - halfHeightDeg], // bottom-right (southeast)
|
|
169
|
+
];
|
|
170
|
+
if (rotationDeg === 0) {
|
|
171
|
+
return {
|
|
172
|
+
topLeft: corners[0],
|
|
173
|
+
topRight: corners[1],
|
|
174
|
+
bottomLeft: corners[2],
|
|
175
|
+
bottomRight: corners[3],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// Apply the spherical rotation
|
|
179
|
+
const rotatedCorners = rotateCoordinatesOnSphere(corners, center, rotationDeg);
|
|
180
|
+
return {
|
|
181
|
+
topLeft: rotatedCorners[0],
|
|
182
|
+
topRight: rotatedCorners[1],
|
|
183
|
+
bottomLeft: rotatedCorners[2],
|
|
184
|
+
bottomRight: rotatedCorners[3],
|
|
185
|
+
};
|
|
186
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Segment grid index
|
|
3
|
+
*
|
|
4
|
+
* A static uniform grid index over a coordinate array (one polyline, or one ring).
|
|
5
|
+
* On geometries with a hundred thousand vertices it reduces hit testing, which would
|
|
6
|
+
* otherwise scan every segment (O(N)), to computing only the candidate segments in the
|
|
7
|
+
* cells that overlap the tolerance box.
|
|
8
|
+
*
|
|
9
|
+
* This module is for internal use within the package and is not exposed in the public API.
|
|
10
|
+
* Hit testing (dispatcher/hit-test/segment-grid.ts measures distances through it) and the
|
|
11
|
+
* bbox-limited enumeration of the snapping providers and the tracing both use it, so it sits
|
|
12
|
+
* in shared/.
|
|
13
|
+
*
|
|
14
|
+
* Assumption: coordinate arrays are never rewritten in place (updating coordinates in the
|
|
15
|
+
* Store follows the immutable update convention of replacing the array with a new one,
|
|
16
|
+
* both in the memory implementation of core and in external store implementations).
|
|
17
|
+
* Therefore the index stays valid as long as the array reference is the same, and when the
|
|
18
|
+
* coordinates change the key of the WeakMap changes, so the index is naturally rebuilt and
|
|
19
|
+
* the old index is reclaimed by the GC.
|
|
20
|
+
* For that reason there is no invalidation logic.
|
|
21
|
+
*/
|
|
22
|
+
import type { BoundingBox, Coordinate } from '../types/model.js';
|
|
23
|
+
/**
|
|
24
|
+
* Vertex count threshold above which the index is built
|
|
25
|
+
*
|
|
26
|
+
* Below it a full scan is faster (the cost of building the index outweighs the gain).
|
|
27
|
+
*/
|
|
28
|
+
export declare const SEGMENT_INDEX_THRESHOLD = 1024;
|
|
29
|
+
/**
|
|
30
|
+
* Segment grid index
|
|
31
|
+
*/
|
|
32
|
+
export interface SegmentGrid {
|
|
33
|
+
/** The bbox covered by the index */
|
|
34
|
+
readonly minX: number;
|
|
35
|
+
readonly minY: number;
|
|
36
|
+
readonly maxX: number;
|
|
37
|
+
readonly maxY: number;
|
|
38
|
+
/** Column count and row count */
|
|
39
|
+
readonly cols: number;
|
|
40
|
+
readonly rows: number;
|
|
41
|
+
/** Cell width and height (at least CELL_EPS) */
|
|
42
|
+
readonly cellW: number;
|
|
43
|
+
readonly cellH: number;
|
|
44
|
+
/** The segment start indices of each cell. An empty cell is undefined */
|
|
45
|
+
readonly cells: (number[] | undefined)[];
|
|
46
|
+
/** Segment count (= coords.length - 1, never negative) */
|
|
47
|
+
readonly segmentCount: number;
|
|
48
|
+
/** Visit stamps (they avoid computing the same segment twice within one query) */
|
|
49
|
+
readonly visited: Uint32Array;
|
|
50
|
+
/** Generation counter of the visit stamps */
|
|
51
|
+
generation: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Builds the segment grid index
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildSegmentGrid(coords: Coordinate[]): SegmentGrid;
|
|
57
|
+
/**
|
|
58
|
+
* Gets the index for a coordinate array (building and caching it when there is none)
|
|
59
|
+
*/
|
|
60
|
+
export declare function getSegmentGrid(coords: Coordinate[]): SegmentGrid;
|
|
61
|
+
/**
|
|
62
|
+
* Enumerates, through the index, the indices of the segments that touch a bbox
|
|
63
|
+
*
|
|
64
|
+
* Nothing is missed (every segment whose segment bbox overlaps the query bbox is always
|
|
65
|
+
* included). Since the cells are held as boxes it may return more than necessary, so the
|
|
66
|
+
* strict test is left to the caller. The return value is sorted in ascending order to make
|
|
67
|
+
* the enumeration order deterministic.
|
|
68
|
+
*/
|
|
69
|
+
export declare function querySegmentIndicesInBBox(grid: SegmentGrid, bbox: BoundingBox): number[];
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Vertex count threshold above which the index is built
|
|
5
|
+
*
|
|
6
|
+
* Below it a full scan is faster (the cost of building the index outweighs the gain).
|
|
7
|
+
*/
|
|
8
|
+
export const SEGMENT_INDEX_THRESHOLD = 1024;
|
|
9
|
+
/** Lower bound of the cell width and height (guards against division by zero when the
|
|
10
|
+
* bbox is degenerate) */
|
|
11
|
+
const CELL_EPS = 1e-12;
|
|
12
|
+
/** Module-level index cache (the key is the reference of the coordinate array) */
|
|
13
|
+
const gridCache = new WeakMap();
|
|
14
|
+
/**
|
|
15
|
+
* Builds the segment grid index
|
|
16
|
+
*/
|
|
17
|
+
export function buildSegmentGrid(coords) {
|
|
18
|
+
const segmentCount = Math.max(coords.length - 1, 0);
|
|
19
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
20
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
21
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
22
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
23
|
+
// Put only the vertices that make up a segment into the bbox (a trailing isolated point
|
|
24
|
+
// is ignored)
|
|
25
|
+
const vertexCount = segmentCount === 0 ? 0 : segmentCount + 1;
|
|
26
|
+
for (let i = 0; i < vertexCount; i++) {
|
|
27
|
+
const [x, y] = coords[i];
|
|
28
|
+
if (x < minX)
|
|
29
|
+
minX = x;
|
|
30
|
+
if (y < minY)
|
|
31
|
+
minY = y;
|
|
32
|
+
if (x > maxX)
|
|
33
|
+
maxX = x;
|
|
34
|
+
if (y > maxY)
|
|
35
|
+
maxY = y;
|
|
36
|
+
}
|
|
37
|
+
const cols = segmentCount === 0 ? 1 : Math.ceil(Math.sqrt(segmentCount));
|
|
38
|
+
const rows = cols;
|
|
39
|
+
const cellW = Math.max((maxX - minX) / cols, CELL_EPS);
|
|
40
|
+
const cellH = Math.max((maxY - minY) / rows, CELL_EPS);
|
|
41
|
+
const grid = {
|
|
42
|
+
minX,
|
|
43
|
+
minY,
|
|
44
|
+
maxX,
|
|
45
|
+
maxY,
|
|
46
|
+
cols,
|
|
47
|
+
rows,
|
|
48
|
+
cellW,
|
|
49
|
+
cellH,
|
|
50
|
+
cells: new Array(cols * rows),
|
|
51
|
+
segmentCount,
|
|
52
|
+
visited: new Uint32Array(segmentCount),
|
|
53
|
+
generation: 0,
|
|
54
|
+
};
|
|
55
|
+
// Register each segment in every cell its bbox overlaps
|
|
56
|
+
for (let i = 0; i < segmentCount; i++) {
|
|
57
|
+
const [ax, ay] = coords[i];
|
|
58
|
+
const [bx, by] = coords[i + 1];
|
|
59
|
+
const col0 = cellIndex(Math.min(ax, bx) - grid.minX, grid.cellW, cols);
|
|
60
|
+
const col1 = cellIndex(Math.max(ax, bx) - grid.minX, grid.cellW, cols);
|
|
61
|
+
const row0 = cellIndex(Math.min(ay, by) - grid.minY, grid.cellH, rows);
|
|
62
|
+
const row1 = cellIndex(Math.max(ay, by) - grid.minY, grid.cellH, rows);
|
|
63
|
+
for (let row = row0; row <= row1; row++) {
|
|
64
|
+
const rowOffset = row * cols;
|
|
65
|
+
for (let col = col0; col <= col1; col++) {
|
|
66
|
+
const cell = grid.cells[rowOffset + col];
|
|
67
|
+
if (cell) {
|
|
68
|
+
cell.push(i);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
grid.cells[rowOffset + col] = [i];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return grid;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Gets the index for a coordinate array (building and caching it when there is none)
|
|
80
|
+
*/
|
|
81
|
+
export function getSegmentGrid(coords) {
|
|
82
|
+
const cached = gridCache.get(coords);
|
|
83
|
+
if (cached)
|
|
84
|
+
return cached;
|
|
85
|
+
const grid = buildSegmentGrid(coords);
|
|
86
|
+
gridCache.set(coords, grid);
|
|
87
|
+
return grid;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Enumerates, through the index, the indices of the segments that touch a bbox
|
|
91
|
+
*
|
|
92
|
+
* Nothing is missed (every segment whose segment bbox overlaps the query bbox is always
|
|
93
|
+
* included). Since the cells are held as boxes it may return more than necessary, so the
|
|
94
|
+
* strict test is left to the caller. The return value is sorted in ascending order to make
|
|
95
|
+
* the enumeration order deterministic.
|
|
96
|
+
*/
|
|
97
|
+
export function querySegmentIndicesInBBox(grid, bbox) {
|
|
98
|
+
if (grid.segmentCount === 0)
|
|
99
|
+
return [];
|
|
100
|
+
// If the query box does not intersect the bbox of the index, there is no candidate
|
|
101
|
+
if (bbox.maxX < grid.minX ||
|
|
102
|
+
bbox.minX > grid.maxX ||
|
|
103
|
+
bbox.maxY < grid.minY ||
|
|
104
|
+
bbox.minY > grid.maxY) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
const col0 = cellIndex(bbox.minX - grid.minX, grid.cellW, grid.cols);
|
|
108
|
+
const col1 = cellIndex(bbox.maxX - grid.minX, grid.cellW, grid.cols);
|
|
109
|
+
const row0 = cellIndex(bbox.minY - grid.minY, grid.cellH, grid.rows);
|
|
110
|
+
const row1 = cellIndex(bbox.maxY - grid.minY, grid.cellH, grid.rows);
|
|
111
|
+
const stamp = nextGeneration(grid);
|
|
112
|
+
const indices = [];
|
|
113
|
+
for (let row = row0; row <= row1; row++) {
|
|
114
|
+
const rowOffset = row * grid.cols;
|
|
115
|
+
for (let col = col0; col <= col1; col++) {
|
|
116
|
+
const cell = grid.cells[rowOffset + col];
|
|
117
|
+
if (!cell)
|
|
118
|
+
continue;
|
|
119
|
+
for (const i of cell) {
|
|
120
|
+
// A segment is registered in several cells, so pick it up only once per query
|
|
121
|
+
if (grid.visited[i] === stamp)
|
|
122
|
+
continue;
|
|
123
|
+
grid.visited[i] = stamp;
|
|
124
|
+
indices.push(i);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
indices.sort((a, b) => a - b);
|
|
129
|
+
return indices;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Finds the cell index from a coordinate offset (clamping it into range)
|
|
133
|
+
*
|
|
134
|
+
* @internal
|
|
135
|
+
*/
|
|
136
|
+
export function cellIndex(offset, cellSize, count) {
|
|
137
|
+
const index = Math.floor(offset / cellSize);
|
|
138
|
+
if (index < 0)
|
|
139
|
+
return 0;
|
|
140
|
+
if (index >= count)
|
|
141
|
+
return count - 1;
|
|
142
|
+
return index;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Advances the generation of the visit stamps
|
|
146
|
+
*
|
|
147
|
+
* When the upper limit of the Uint32Array is reached, the stamps are cleared all at once
|
|
148
|
+
* and the counter wraps back around.
|
|
149
|
+
*
|
|
150
|
+
* @internal
|
|
151
|
+
*/
|
|
152
|
+
export function nextGeneration(grid) {
|
|
153
|
+
if (grid.generation >= 0xffffffff) {
|
|
154
|
+
grid.visited.fill(0);
|
|
155
|
+
grid.generation = 0;
|
|
156
|
+
}
|
|
157
|
+
grid.generation += 1;
|
|
158
|
+
return grid.generation;
|
|
159
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordinate transformation utilities
|
|
3
|
+
*
|
|
4
|
+
* Converts between geographic coordinates and screen coordinates in both directions.
|
|
5
|
+
*/
|
|
6
|
+
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
7
|
+
import type { Coordinate } from '../types/model.js';
|
|
8
|
+
/**
|
|
9
|
+
* Clamps a latitude into the valid range
|
|
10
|
+
*
|
|
11
|
+
* MapLibre's project() throws an error when the latitude is outside the range -90 to 90, and
|
|
12
|
+
* the latitude can fall outside that range, for example when a large image is placed at a low
|
|
13
|
+
* zoom level.
|
|
14
|
+
*
|
|
15
|
+
* @param latitude - The latitude to clamp (degrees)
|
|
16
|
+
* @returns The latitude clamped into the range -89.9 to 89.9
|
|
17
|
+
*/
|
|
18
|
+
export declare function clampLatitude(latitude: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* Clamps the latitude of a coordinate into the valid range
|
|
21
|
+
*
|
|
22
|
+
* @param coord - The coordinate to clamp [lng, lat]
|
|
23
|
+
* @returns The coordinate with its latitude clamped
|
|
24
|
+
*/
|
|
25
|
+
export declare function clampCoordinate(coord: Coordinate): Coordinate;
|
|
26
|
+
/**
|
|
27
|
+
* Mercator coordinate (in the range 0-1)
|
|
28
|
+
*/
|
|
29
|
+
export type MercatorCoord = [number, number];
|
|
30
|
+
/**
|
|
31
|
+
* Converts a longitude/latitude into a Mercator coordinate (in the range 0-1)
|
|
32
|
+
*
|
|
33
|
+
* @param coord Longitude/latitude coordinate [lng, lat]
|
|
34
|
+
* @returns Mercator coordinate [x, y] (in the range 0-1)
|
|
35
|
+
*/
|
|
36
|
+
export declare function lngLatToMercator(coord: Coordinate): MercatorCoord;
|
|
37
|
+
/**
|
|
38
|
+
* A point on the screen in CSS pixels, from the top-left corner of the map
|
|
39
|
+
*/
|
|
40
|
+
export interface ScreenPoint {
|
|
41
|
+
/** The distance from the left edge */
|
|
42
|
+
x: number;
|
|
43
|
+
/** The distance from the top edge */
|
|
44
|
+
y: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A geographic position as an object, in degrees
|
|
48
|
+
*/
|
|
49
|
+
export interface LngLat {
|
|
50
|
+
/** The longitude */
|
|
51
|
+
lng: number;
|
|
52
|
+
/** The latitude */
|
|
53
|
+
lat: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Coordinate transformation interface
|
|
57
|
+
*
|
|
58
|
+
* Wraps MapLibre's map.project() / map.unproject() and supports both the Mercator projection
|
|
59
|
+
* and the globe projection.
|
|
60
|
+
*/
|
|
61
|
+
export interface CoordinateTransform {
|
|
62
|
+
/** Converts a geographic coordinate into a screen coordinate */
|
|
63
|
+
project(lngLat: Coordinate): ScreenPoint;
|
|
64
|
+
/** Converts a screen coordinate into a geographic coordinate */
|
|
65
|
+
unproject(point: ScreenPoint): LngLat;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Injection point for the terrain-aware anchor projection
|
|
69
|
+
*
|
|
70
|
+
* When terrain is enabled, this is the only path that maps a UI anchor (longitude/latitude +
|
|
71
|
+
* ground elevation) into screen coordinates. So that the rendering side (the vertex shader)
|
|
72
|
+
* and the hit-testing side (this transformation) are structurally guaranteed to go through the
|
|
73
|
+
* same elevation, the same matrices and the same branches, the implementation is owned by the
|
|
74
|
+
* view layer (`view/terrain/anchor.ts`) and injected here. shared cannot depend on view, so
|
|
75
|
+
* the direction is reversed into "shared opens a socket and view plugs into it".
|
|
76
|
+
*
|
|
77
|
+
* When project returns null (terrain is disabled, or the frame state is not yet established),
|
|
78
|
+
* it falls back to MapLibre's project. The path taken when there is no terrain is exactly the
|
|
79
|
+
* same as before the injection existed (which guarantees zero regression).
|
|
80
|
+
*/
|
|
81
|
+
export interface AnchorProjector {
|
|
82
|
+
/**
|
|
83
|
+
* Maps longitude/latitude + ground elevation into a screen coordinate (CSS pixels). null
|
|
84
|
+
* when it cannot be used.
|
|
85
|
+
*/
|
|
86
|
+
project(lng: number, lat: number): ScreenPoint | null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Injects an anchor projection (the view layer calls this per map; null removes it)
|
|
90
|
+
*/
|
|
91
|
+
export declare function setAnchorProjector(map: MapLibreMap, projector: AnchorProjector | null): void;
|
|
92
|
+
/**
|
|
93
|
+
* Gets the anchor projection that is currently injected
|
|
94
|
+
*/
|
|
95
|
+
export declare function getAnchorProjector(map: MapLibreMap): AnchorProjector | null;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a CoordinateTransform from a MapLibre map
|
|
98
|
+
*
|
|
99
|
+
* When terrain is enabled, project goes through the anchor projection (elevation included, one
|
|
100
|
+
* matrix pass). With terrain enabled, MapLibre's map.project internally raycasts against the
|
|
101
|
+
* terrain mesh, which measured at roughly 307μs per point (roughly 1μs without terrain). Hit
|
|
102
|
+
* testing calls project for every vertex, so editing would not hold up as is.
|
|
103
|
+
*
|
|
104
|
+
* unproject is called for only a single screen point (roughly 43μs), so MapLibre's is used as
|
|
105
|
+
* is. That is also because it has to solve the intersection with the terrain mesh by
|
|
106
|
+
* raycasting, which cannot be obtained from matrices alone.
|
|
107
|
+
*
|
|
108
|
+
* @param map MapLibre map instance
|
|
109
|
+
* @returns A CoordinateTransform instance
|
|
110
|
+
*/
|
|
111
|
+
export declare function createCoordinateTransform(map: MapLibreMap): CoordinateTransform;
|
|
112
|
+
/**
|
|
113
|
+
* Applies a margin in pixels to a bounding box
|
|
114
|
+
*
|
|
115
|
+
* When zoom is passed, the expansion is done on the map plane. When it is not passed, the
|
|
116
|
+
* expansion round-trips through screen coordinates. It must not round-trip when there is
|
|
117
|
+
* terrain: with terrain enabled, project projects a point at the height of the ground surface
|
|
118
|
+
* and unproject casts a ray from the screen onto the ground surface and comes back, so the
|
|
119
|
+
* round trip is no longer the identity mapping. With a tilted view, the returned values drift
|
|
120
|
+
* by kilometers, and the box appears far away from the feature, with a different shape too.
|
|
121
|
+
*
|
|
122
|
+
* @param coords Coordinates of the 4 corners of the bounding box
|
|
123
|
+
* [topLeft, topRight, bottomRight, bottomLeft]
|
|
124
|
+
* @param margin Margin size (pixels)
|
|
125
|
+
* @param transform Coordinate transformation interface
|
|
126
|
+
* @param zoom Current zoom (when passed, the expansion is done on the map plane; required when
|
|
127
|
+
* there is terrain)
|
|
128
|
+
* @returns Coordinates of the 4 corners after the margin is applied
|
|
129
|
+
*/
|
|
130
|
+
export declare function applyMarginToBoundingBox(coords: {
|
|
131
|
+
topLeft: Coordinate;
|
|
132
|
+
topRight: Coordinate;
|
|
133
|
+
bottomRight: Coordinate;
|
|
134
|
+
bottomLeft: Coordinate;
|
|
135
|
+
}, margin: number, transform: CoordinateTransform, zoom?: number): {
|
|
136
|
+
topLeft: Coordinate;
|
|
137
|
+
topRight: Coordinate;
|
|
138
|
+
bottomRight: Coordinate;
|
|
139
|
+
bottomLeft: Coordinate;
|
|
140
|
+
};
|