@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,142 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { TextureCache } from '../cache/texture.js';
|
|
4
|
+
import { BatchManager } from '../renderers/batch-manager.js';
|
|
5
|
+
import { FeatureDrawer } from '../renderers/drawer.js';
|
|
6
|
+
import { ImageRenderer } from '../renderers/image.js';
|
|
7
|
+
import { SDFLineRenderer } from '../renderers/line/sdf-line.js';
|
|
8
|
+
import { PointInstanceRenderer } from '../renderers/point/point-instance.js';
|
|
9
|
+
import { PointShapeRenderer } from '../renderers/point/point-shape.js';
|
|
10
|
+
import { PolygonBatchRenderer } from '../renderers/polygon/batch.js';
|
|
11
|
+
import { FillShaderManager } from '../renderers/polygon/fill.js';
|
|
12
|
+
import { SDFPolygonRenderer } from '../renderers/polygon/sdf-polygon.js';
|
|
13
|
+
import { StrokeRenderer } from '../renderers/stroke.js';
|
|
14
|
+
import { ShaderInitializer } from '../shaders/initializer.js';
|
|
15
|
+
import { QuadShader } from '../shaders/quad.js';
|
|
16
|
+
import { BoxSelectionRenderer } from '../ui/box-selection.js';
|
|
17
|
+
import { SelectionHandlesRenderer, SelectionUIRenderer } from '../ui/index.js';
|
|
18
|
+
import { TentativeRenderer } from '../ui/tentative.js';
|
|
19
|
+
import { ViewportFilter } from '../viewport.js';
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the renderers
|
|
22
|
+
*/
|
|
23
|
+
export function initRenderers(deps) {
|
|
24
|
+
const { gl, map: mapInstance, store, spatialIndex, featureStyle, selectionConfig, renderingConfig, customFeatureHandlers, pixelRatio, scope, onImageError, } = deps;
|
|
25
|
+
const textureCache = new TextureCache(gl);
|
|
26
|
+
const terrain = scope.terrain;
|
|
27
|
+
const quadShader = new QuadShader(gl, terrain);
|
|
28
|
+
const imageRenderer = new ImageRenderer(mapInstance, gl, textureCache, quadShader, (fileId) => store.getFile(fileId), onImageError);
|
|
29
|
+
const strokeRenderer = new StrokeRenderer(mapInstance, gl, pixelRatio, terrain);
|
|
30
|
+
const sdfLineRenderer = new SDFLineRenderer(mapInstance, gl, pixelRatio, terrain);
|
|
31
|
+
const pointShapeRenderer = new PointShapeRenderer(mapInstance, gl, pixelRatio, terrain);
|
|
32
|
+
const pointInstanceRenderer = new PointInstanceRenderer(mapInstance, gl, pixelRatio, terrain);
|
|
33
|
+
const polygonScope = { terrain, earcut: scope.earcut };
|
|
34
|
+
const polygonBatchRenderer = new PolygonBatchRenderer(gl, polygonScope);
|
|
35
|
+
const sdfPolygonRenderer = new SDFPolygonRenderer(gl, pixelRatio, polygonScope);
|
|
36
|
+
const fillShaderManager = new FillShaderManager(gl, terrain);
|
|
37
|
+
const selectionExtensions = scope.selection.extensions;
|
|
38
|
+
const selectionUIRenderer = new SelectionUIRenderer(strokeRenderer, selectionConfig, selectionExtensions);
|
|
39
|
+
// The tile size of this instance's map (read by the custom bounding box calculators)
|
|
40
|
+
const tileSize = mapInstance.transform?.tileSize ?? 512;
|
|
41
|
+
selectionExtensions.setTileSize(tileSize);
|
|
42
|
+
// Register the bounding box functions used by the selection UI for custom feature handlers
|
|
43
|
+
if (customFeatureHandlers) {
|
|
44
|
+
for (const handler of customFeatureHandlers) {
|
|
45
|
+
if (handler.getSelectionBoundingBox) {
|
|
46
|
+
selectionExtensions.registerBoundingBox(handler.type, handler.getSelectionBoundingBox);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const selectionHandlesRenderer = new SelectionHandlesRenderer(strokeRenderer, pointShapeRenderer, selectionConfig);
|
|
51
|
+
selectionHandlesRenderer.setPointInstanceRenderer(pointInstanceRenderer);
|
|
52
|
+
const featureDrawer = new FeatureDrawer({
|
|
53
|
+
gl,
|
|
54
|
+
map: mapInstance,
|
|
55
|
+
sdfLineRenderer,
|
|
56
|
+
pointShapeRenderer,
|
|
57
|
+
imageRenderer,
|
|
58
|
+
featureStyle,
|
|
59
|
+
styleRules: scope.styleRules,
|
|
60
|
+
terrain,
|
|
61
|
+
});
|
|
62
|
+
const tentativeRenderer = new TentativeRenderer({
|
|
63
|
+
gl,
|
|
64
|
+
map: mapInstance,
|
|
65
|
+
sdfLineRenderer,
|
|
66
|
+
pointShapeRenderer,
|
|
67
|
+
tentativeStyle: featureStyle.tentative,
|
|
68
|
+
terrain,
|
|
69
|
+
});
|
|
70
|
+
const boxSelectionRenderer = new BoxSelectionRenderer(mapInstance, gl, renderingConfig.boxSelectionStyle, pixelRatio);
|
|
71
|
+
const viewportFilter = new ViewportFilter({ map: mapInstance, spatialIndex });
|
|
72
|
+
const shaderInitializer = new ShaderInitializer({
|
|
73
|
+
featureDrawer,
|
|
74
|
+
tentativeRenderer,
|
|
75
|
+
quadShader,
|
|
76
|
+
strokeRenderer,
|
|
77
|
+
pointShapeRenderer,
|
|
78
|
+
pointInstanceRenderer,
|
|
79
|
+
sdfLineRenderer,
|
|
80
|
+
polygonBatchRenderer,
|
|
81
|
+
sdfPolygonRenderer,
|
|
82
|
+
});
|
|
83
|
+
const batchManager = new BatchManager({
|
|
84
|
+
gl,
|
|
85
|
+
featureDrawer,
|
|
86
|
+
pointInstanceRenderer,
|
|
87
|
+
sdfLineRenderer,
|
|
88
|
+
polygonBatchRenderer,
|
|
89
|
+
sdfPolygonRenderer,
|
|
90
|
+
terrain,
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
textureCache,
|
|
94
|
+
quadShader,
|
|
95
|
+
imageRenderer,
|
|
96
|
+
strokeRenderer,
|
|
97
|
+
sdfLineRenderer,
|
|
98
|
+
pointShapeRenderer,
|
|
99
|
+
pointInstanceRenderer,
|
|
100
|
+
polygonBatchRenderer,
|
|
101
|
+
sdfPolygonRenderer,
|
|
102
|
+
fillShaderManager,
|
|
103
|
+
selectionUIRenderer,
|
|
104
|
+
selectionHandlesRenderer,
|
|
105
|
+
featureDrawer,
|
|
106
|
+
tentativeRenderer,
|
|
107
|
+
boxSelectionRenderer,
|
|
108
|
+
viewportFilter,
|
|
109
|
+
shaderInitializer,
|
|
110
|
+
batchManager,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Every member that owns GPU resources, in the order they are released
|
|
115
|
+
*
|
|
116
|
+
* The list is checked against the type: a member with a dispose() that is missing here is a
|
|
117
|
+
* compile error (see `UNRELEASED` below), so a renderer added to Renderers cannot leak its
|
|
118
|
+
* programs, buffers and textures when the layer is removed and added again.
|
|
119
|
+
*/
|
|
120
|
+
const GPU_OWNERS = [
|
|
121
|
+
'featureDrawer',
|
|
122
|
+
'tentativeRenderer',
|
|
123
|
+
'boxSelectionRenderer',
|
|
124
|
+
'textureCache',
|
|
125
|
+
'quadShader',
|
|
126
|
+
'strokeRenderer',
|
|
127
|
+
'pointShapeRenderer',
|
|
128
|
+
'pointInstanceRenderer',
|
|
129
|
+
'sdfLineRenderer',
|
|
130
|
+
'polygonBatchRenderer',
|
|
131
|
+
'sdfPolygonRenderer',
|
|
132
|
+
'fillShaderManager',
|
|
133
|
+
];
|
|
134
|
+
const UNRELEASED = true;
|
|
135
|
+
void UNRELEASED;
|
|
136
|
+
/**
|
|
137
|
+
* Dispose the renderers
|
|
138
|
+
*/
|
|
139
|
+
export function disposeRenderers(r) {
|
|
140
|
+
for (const key of GPU_OWNERS)
|
|
141
|
+
r[key].dispose();
|
|
142
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SlotManager
|
|
3
|
+
*
|
|
4
|
+
* Keeps the slots (one CustomLayer per segment of the stacking order) in step with the stacking
|
|
5
|
+
* order, and counts how many of them are on the maplibre map. The engine behind the slots is
|
|
6
|
+
* built when the first slot goes onto the map and torn down when the last one leaves; the
|
|
7
|
+
* manager only answers "first" and "last", and the layer builds and tears down. How the order is
|
|
8
|
+
* cut into segments is in slots.ts, and the design is chapter 5 of
|
|
9
|
+
* docs/internals/rendering.md ("Slots and separators").
|
|
10
|
+
*/
|
|
11
|
+
import type { CustomLayerInterface, Map as MapLibreMap } from 'maplibre-gl';
|
|
12
|
+
import { type RenderSlot } from './slots.js';
|
|
13
|
+
/** What the manager needs */
|
|
14
|
+
export interface SlotManagerDeps {
|
|
15
|
+
map: Pick<MapLibreMap, 'getLayer' | 'addLayer' | 'removeLayer'> & {
|
|
16
|
+
triggerRepaint?: () => void;
|
|
17
|
+
};
|
|
18
|
+
/** The current stacking order */
|
|
19
|
+
getLayerOrder: () => readonly string[];
|
|
20
|
+
/** Predicate that identifies the separators (always false when omitted = a single slot) */
|
|
21
|
+
isExternalEntry?: (entryId: string) => boolean;
|
|
22
|
+
/** Where the changes of the slots and of the segments are notified */
|
|
23
|
+
onSlotsChange?: (slots: RenderSlot[]) => void;
|
|
24
|
+
/** Creates the CustomLayer of the slot at `index` (index 1 onwards) */
|
|
25
|
+
createSlotLayer: (index: number) => CustomLayerInterface;
|
|
26
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { partitionLayerOrder, renderSlotLayerId, sameSegments, } from './slots.js';
|
|
4
|
+
/**
|
|
5
|
+
* The slots of one draw instance
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class SlotManager {
|
|
10
|
+
constructor(deps) {
|
|
11
|
+
Object.defineProperty(this, "deps", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: void 0
|
|
16
|
+
});
|
|
17
|
+
/** The current list of segments (layerOrder cut at the separators) */
|
|
18
|
+
Object.defineProperty(this, "currentSegments", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true,
|
|
22
|
+
value: void 0
|
|
23
|
+
});
|
|
24
|
+
/** The CustomLayers of the slots (first = backmost; the first is the primary layer) */
|
|
25
|
+
Object.defineProperty(this, "slotLayers", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: []
|
|
30
|
+
});
|
|
31
|
+
/** Number of slots added to maplibre (0 → 1 builds the engine, 1 → 0 tears it down) */
|
|
32
|
+
Object.defineProperty(this, "added", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: 0
|
|
37
|
+
});
|
|
38
|
+
this.deps = deps;
|
|
39
|
+
this.currentSegments = partitionLayerOrder(deps.getLayerOrder(), deps.isExternalEntry);
|
|
40
|
+
}
|
|
41
|
+
/** The current list of segments */
|
|
42
|
+
get segments() {
|
|
43
|
+
return this.currentSegments;
|
|
44
|
+
}
|
|
45
|
+
/** Number of slots currently on the map */
|
|
46
|
+
get addedCount() {
|
|
47
|
+
return this.added;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Registers the primary layer as the first slot and prepares the following slots
|
|
51
|
+
*
|
|
52
|
+
* When there are separators, the following slots are prepared here (the host adds them to the
|
|
53
|
+
* map in order from the first).
|
|
54
|
+
*/
|
|
55
|
+
init(primary) {
|
|
56
|
+
this.slotLayers.push(primary);
|
|
57
|
+
for (let index = 1; index < this.currentSegments.length; index++) {
|
|
58
|
+
this.slotLayers.push(this.deps.createSlotLayer(index));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Records that a slot went onto the map
|
|
63
|
+
*
|
|
64
|
+
* @returns true when it is the first one (the engine is to be built)
|
|
65
|
+
*/
|
|
66
|
+
attach() {
|
|
67
|
+
this.added++;
|
|
68
|
+
return this.added === 1;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Records that a slot left the map
|
|
72
|
+
*
|
|
73
|
+
* @returns true when none is left (the engine is to be torn down)
|
|
74
|
+
*/
|
|
75
|
+
detach() {
|
|
76
|
+
this.added = Math.max(0, this.added - 1);
|
|
77
|
+
return this.added === 0;
|
|
78
|
+
}
|
|
79
|
+
/** The list of slots (public form) */
|
|
80
|
+
getRenderSlots() {
|
|
81
|
+
return this.currentSegments.map((segment, index) => ({
|
|
82
|
+
layerId: this.slotLayers[index]?.id ?? renderSlotLayerId(index),
|
|
83
|
+
from: segment.from,
|
|
84
|
+
to: segment.to,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/** The CustomLayers of the slots (first = backmost) */
|
|
88
|
+
getSlotLayers() {
|
|
89
|
+
return this.slotLayers.slice();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Makes the slots follow the changes of the stacking order
|
|
93
|
+
*
|
|
94
|
+
* Nothing happens when the list of segments has not changed. A new slot is added to the front
|
|
95
|
+
* of the maplibre order (which is consistent with the slots added from the first one onwards;
|
|
96
|
+
* placing the native layers of the separators again is the responsibility of the host and is
|
|
97
|
+
* prompted by the notification). When a slot is removed, it is removed from the last one.
|
|
98
|
+
*/
|
|
99
|
+
sync() {
|
|
100
|
+
const { map, isExternalEntry, onSlotsChange } = this.deps;
|
|
101
|
+
const next = partitionLayerOrder(this.deps.getLayerOrder(), isExternalEntry);
|
|
102
|
+
if (sameSegments(next, this.currentSegments))
|
|
103
|
+
return;
|
|
104
|
+
this.currentSegments = next;
|
|
105
|
+
const slotLayers = this.slotLayers;
|
|
106
|
+
while (slotLayers.length < next.length) {
|
|
107
|
+
const slot = this.deps.createSlotLayer(slotLayers.length);
|
|
108
|
+
slotLayers.push(slot);
|
|
109
|
+
// The following slots are added to the map only while the first slot is on it (when it is
|
|
110
|
+
// not, the host adds them later in order from the first)
|
|
111
|
+
if (this.hasMapLayer(slotLayers[0].id) && !this.hasMapLayer(slot.id)) {
|
|
112
|
+
map.addLayer(slot);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
while (slotLayers.length > next.length) {
|
|
116
|
+
const slot = slotLayers.pop();
|
|
117
|
+
if (slot && this.hasMapLayer(slot.id)) {
|
|
118
|
+
map.removeLayer(slot.id);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
onSlotsChange?.(this.getRenderSlots());
|
|
122
|
+
map.triggerRepaint?.();
|
|
123
|
+
}
|
|
124
|
+
/** Whether the map has that layer (always false while the style is not loaded) */
|
|
125
|
+
hasMapLayer(id) {
|
|
126
|
+
try {
|
|
127
|
+
return !!this.deps.map.getLayer(id);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Separators and slots of the stacking order
|
|
3
|
+
*
|
|
4
|
+
* Entries of the stacking order (layerOrder) that the host declares as "external entries"
|
|
5
|
+
* (entries we do not draw ourselves, which the host places as native maplibre layers) are treated
|
|
6
|
+
* as separators, and every segment between separators gets its own CustomLayer (a slot).
|
|
7
|
+
* A maplibre style is a single ordered list and nothing can be inserted inside a CustomLayer, so
|
|
8
|
+
* a native layer can be placed in between our own rendering only once the slots are split per
|
|
9
|
+
* segment. The design is in docs/internals/rendering.md, "Slots and separators".
|
|
10
|
+
*/
|
|
11
|
+
export type { RenderSlot } from '../../shared/types/events.js';
|
|
12
|
+
/** A segment ([from, to) in layerOrder) */
|
|
13
|
+
export interface RenderSegment {
|
|
14
|
+
readonly from: number;
|
|
15
|
+
readonly to: number;
|
|
16
|
+
}
|
|
17
|
+
/** Layer id of the first slot (keeps the same id as the single layer used before) */
|
|
18
|
+
export declare const PRIMARY_RENDER_LAYER_ID = "maplibre-gl-draw-layer";
|
|
19
|
+
/** Layer id of the slot at `index` */
|
|
20
|
+
export declare function renderSlotLayerId(index: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Split the stacking order into segments at the separators
|
|
23
|
+
*
|
|
24
|
+
* A separator is an entry for which the predicate returns true, and the separator itself belongs
|
|
25
|
+
* to no segment. No segment is created for an empty run between separators (where separators are
|
|
26
|
+
* adjacent) because there is nothing to draw. If there is no separator at all, the whole list
|
|
27
|
+
* becomes a single segment and the behaviour is the same as the single CustomLayer used before.
|
|
28
|
+
* Even for a list with no entry drawn by us, a slot is needed to draw the foreground pass
|
|
29
|
+
* (selection UI and overlays), so one empty segment is returned.
|
|
30
|
+
*/
|
|
31
|
+
export declare function partitionLayerOrder(order: readonly string[], isExternalEntry?: (entryId: string) => boolean): RenderSegment[];
|
|
32
|
+
/** Whether two lists of segments are the same */
|
|
33
|
+
export declare function sameSegments(a: readonly RenderSegment[], b: readonly RenderSegment[]): boolean;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** Layer id of the first slot (keeps the same id as the single layer used before) */
|
|
4
|
+
export const PRIMARY_RENDER_LAYER_ID = 'maplibre-gl-draw-layer';
|
|
5
|
+
/** Layer id of the slot at `index` */
|
|
6
|
+
export function renderSlotLayerId(index) {
|
|
7
|
+
return index === 0 ? PRIMARY_RENDER_LAYER_ID : `${PRIMARY_RENDER_LAYER_ID}:${index}`;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Split the stacking order into segments at the separators
|
|
11
|
+
*
|
|
12
|
+
* A separator is an entry for which the predicate returns true, and the separator itself belongs
|
|
13
|
+
* to no segment. No segment is created for an empty run between separators (where separators are
|
|
14
|
+
* adjacent) because there is nothing to draw. If there is no separator at all, the whole list
|
|
15
|
+
* becomes a single segment and the behaviour is the same as the single CustomLayer used before.
|
|
16
|
+
* Even for a list with no entry drawn by us, a slot is needed to draw the foreground pass
|
|
17
|
+
* (selection UI and overlays), so one empty segment is returned.
|
|
18
|
+
*/
|
|
19
|
+
export function partitionLayerOrder(order, isExternalEntry) {
|
|
20
|
+
if (!isExternalEntry)
|
|
21
|
+
return [{ from: 0, to: order.length }];
|
|
22
|
+
const segments = [];
|
|
23
|
+
let start = -1;
|
|
24
|
+
for (let i = 0; i < order.length; i++) {
|
|
25
|
+
if (isExternalEntry(order[i])) {
|
|
26
|
+
if (start >= 0) {
|
|
27
|
+
segments.push({ from: start, to: i });
|
|
28
|
+
start = -1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (start < 0) {
|
|
32
|
+
start = i;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (start >= 0)
|
|
36
|
+
segments.push({ from: start, to: order.length });
|
|
37
|
+
if (segments.length === 0)
|
|
38
|
+
segments.push({ from: 0, to: 0 });
|
|
39
|
+
return segments;
|
|
40
|
+
}
|
|
41
|
+
/** Whether two lists of segments are the same */
|
|
42
|
+
export function sameSegments(a, b) {
|
|
43
|
+
if (a.length !== b.length)
|
|
44
|
+
return false;
|
|
45
|
+
for (let i = 0; i < a.length; i++) {
|
|
46
|
+
if (a[i].from !== b[i].from || a[i].to !== b[i].to)
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { BoundingBox, Coordinate, Feature } from '../../store/types.js';
|
|
2
|
+
import type { SelectionExtensionRegistry } from '../ui/selection-ui/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Longitude/latitude bounding box of a chunk `[minLng, minLat, maxLng, maxLat]`
|
|
5
|
+
*/
|
|
6
|
+
export type ChunkBBox = [number, number, number, number];
|
|
7
|
+
/**
|
|
8
|
+
* Whether the chunk bbox intersects the expanded viewport
|
|
9
|
+
*
|
|
10
|
+
* Both are treated as longitude/latitude rectangles (touching edges count as intersecting).
|
|
11
|
+
*/
|
|
12
|
+
export declare function bboxIntersects(bbox: ChunkBBox, viewport: BoundingBox): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The chunk bbox as a BoundingBox
|
|
15
|
+
*/
|
|
16
|
+
export declare function chunkBBoxToBounds(bbox: ChunkBBox): BoundingBox;
|
|
17
|
+
/**
|
|
18
|
+
* Expands the chunk bbox by one point (it never shrinks it)
|
|
19
|
+
*
|
|
20
|
+
* The incremental update of vertices only looks at the vertices that moved, so the bbox cannot be
|
|
21
|
+
* recomputed exactly. As long as it only grows, "retained mode ⊇ immediate mode" holds: thinning
|
|
22
|
+
* simply misses and the rendering result stays correct. The exact bbox comes back with the next
|
|
23
|
+
* rebuild.
|
|
24
|
+
*
|
|
25
|
+
* @param bbox The current bbox. null (= always drawn without thinning) is returned as it is
|
|
26
|
+
*/
|
|
27
|
+
export declare function expandBBox(bbox: ChunkBBox | null, coord: Coordinate): ChunkBBox | null;
|
|
28
|
+
/**
|
|
29
|
+
* Computes the longitude/latitude bbox of a list of features
|
|
30
|
+
*
|
|
31
|
+
* min/max are taken on the raw longitude values without normalization. Data crossing ±180 ends up
|
|
32
|
+
* with a huge bbox, so the thinning misses and it is always drawn (erring on the safe side).
|
|
33
|
+
*
|
|
34
|
+
* @returns null when there is not a single coordinate (= no thinning)
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeFeaturesBBox(features: readonly Feature[], extensions: SelectionExtensionRegistry | undefined): ChunkBBox | null;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Longitude/latitude extents of the retained chunks
|
|
5
|
+
*
|
|
6
|
+
* A retained batch does not depend on the camera, so each chunk keeps the bbox of its features
|
|
7
|
+
* and a frame skips the chunks that do not intersect the expanded viewport. The functions here
|
|
8
|
+
* compute that bbox, grow it during an incremental update and test it against the viewport.
|
|
9
|
+
*/
|
|
10
|
+
import { circleBoundingBox } from '../../geometry/circle.js';
|
|
11
|
+
import { DEFAULT_TILE_SIZE } from '../../shared/math/index.js';
|
|
12
|
+
import { getCircleRadius } from '../../shared/utils/property.js';
|
|
13
|
+
import { getBoundingBox } from '../../store/spatial/index.js';
|
|
14
|
+
/**
|
|
15
|
+
* Whether the chunk bbox intersects the expanded viewport
|
|
16
|
+
*
|
|
17
|
+
* Both are treated as longitude/latitude rectangles (touching edges count as intersecting).
|
|
18
|
+
*/
|
|
19
|
+
export function bboxIntersects(bbox, viewport) {
|
|
20
|
+
return (bbox[0] <= viewport.maxX &&
|
|
21
|
+
bbox[2] >= viewport.minX &&
|
|
22
|
+
bbox[1] <= viewport.maxY &&
|
|
23
|
+
bbox[3] >= viewport.minY);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The chunk bbox as a BoundingBox
|
|
27
|
+
*/
|
|
28
|
+
export function chunkBBoxToBounds(bbox) {
|
|
29
|
+
return { minX: bbox[0], minY: bbox[1], maxX: bbox[2], maxY: bbox[3] };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Expands the chunk bbox by one point (it never shrinks it)
|
|
33
|
+
*
|
|
34
|
+
* The incremental update of vertices only looks at the vertices that moved, so the bbox cannot be
|
|
35
|
+
* recomputed exactly. As long as it only grows, "retained mode ⊇ immediate mode" holds: thinning
|
|
36
|
+
* simply misses and the rendering result stays correct. The exact bbox comes back with the next
|
|
37
|
+
* rebuild.
|
|
38
|
+
*
|
|
39
|
+
* @param bbox The current bbox. null (= always drawn without thinning) is returned as it is
|
|
40
|
+
*/
|
|
41
|
+
export function expandBBox(bbox, coord) {
|
|
42
|
+
if (!bbox)
|
|
43
|
+
return null;
|
|
44
|
+
const [lng, lat] = coord;
|
|
45
|
+
if (!Number.isFinite(lng) || !Number.isFinite(lat))
|
|
46
|
+
return bbox;
|
|
47
|
+
return [
|
|
48
|
+
Math.min(bbox[0], lng),
|
|
49
|
+
Math.min(bbox[1], lat),
|
|
50
|
+
Math.max(bbox[2], lng),
|
|
51
|
+
Math.max(bbox[3], lat),
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Walks the nesting of coordinates (Coordinate / Coordinate[] / Coordinate[][] / ...)
|
|
56
|
+
*
|
|
57
|
+
* To avoid having a branch per feature type, it recurses until it reaches a pair of numbers. It
|
|
58
|
+
* also withstands the unknown nesting of a custom type.
|
|
59
|
+
*/
|
|
60
|
+
function walkCoordinates(value, visit) {
|
|
61
|
+
if (!Array.isArray(value))
|
|
62
|
+
return;
|
|
63
|
+
if (typeof value[0] === 'number' && typeof value[1] === 'number') {
|
|
64
|
+
visit(value[0], value[1]);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const item of value)
|
|
68
|
+
walkCoordinates(item, visit);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Computes the rectangle occupied by a feature that spreads around its anchor
|
|
72
|
+
*
|
|
73
|
+
* A kind where "coordinates is a single anchor point and the body spreads around it", such as
|
|
74
|
+
* Note / Text, degenerates into a point of zero area when only the coordinates are walked. The
|
|
75
|
+
* whole chunk would then be thinned away the moment the center of the map enters it (= the moment
|
|
76
|
+
* the anchor leaves the expanded viewport), and a feature that should cover the whole screen
|
|
77
|
+
* would disappear entirely.
|
|
78
|
+
*
|
|
79
|
+
* The rectangle it actually occupies is already known to the calculator registered by the
|
|
80
|
+
* extension (for Note, the selection box including the rotation) and to the size computation of
|
|
81
|
+
* Image. That is folded into an AABB and used.
|
|
82
|
+
*
|
|
83
|
+
* @returns null for a kind where walking the raw coordinates is enough (Point / LineString /
|
|
84
|
+
* Polygon and so on) and when the computation did not produce finite values (the caller then
|
|
85
|
+
* walks them as before)
|
|
86
|
+
*/
|
|
87
|
+
function computeAnchoredExtent(feature, extensions) {
|
|
88
|
+
const tileSize = extensions?.getTileSize() ?? DEFAULT_TILE_SIZE;
|
|
89
|
+
// A custom type folds its registered rectangle (the 4 corners)
|
|
90
|
+
const calculator = extensions?.getBoundingBoxCalculator(feature.type);
|
|
91
|
+
if (calculator) {
|
|
92
|
+
const box = calculator(feature, tileSize);
|
|
93
|
+
if (!box)
|
|
94
|
+
return null;
|
|
95
|
+
return cornersToBBox([box.topLeft, box.topRight, box.bottomRight, box.bottomLeft]);
|
|
96
|
+
}
|
|
97
|
+
// Image is a standard kind of core, but its size is determined by the style and createdZoom
|
|
98
|
+
if (feature.type === 'Image') {
|
|
99
|
+
const box = getBoundingBox(feature, tileSize);
|
|
100
|
+
return isFiniteBBox([box.minX, box.minY, box.maxX, box.maxY])
|
|
101
|
+
? [box.minX, box.minY, box.maxX, box.maxY]
|
|
102
|
+
: null;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Folds a sequence of coordinates into an AABB (null when a non-finite value is mixed in)
|
|
108
|
+
*/
|
|
109
|
+
function cornersToBBox(corners) {
|
|
110
|
+
let minLng = Number.POSITIVE_INFINITY;
|
|
111
|
+
let minLat = Number.POSITIVE_INFINITY;
|
|
112
|
+
let maxLng = Number.NEGATIVE_INFINITY;
|
|
113
|
+
let maxLat = Number.NEGATIVE_INFINITY;
|
|
114
|
+
for (const corner of corners) {
|
|
115
|
+
const lng = corner?.[0];
|
|
116
|
+
const lat = corner?.[1];
|
|
117
|
+
if (!Number.isFinite(lng) || !Number.isFinite(lat))
|
|
118
|
+
return null;
|
|
119
|
+
if (lng < minLng)
|
|
120
|
+
minLng = lng;
|
|
121
|
+
if (lng > maxLng)
|
|
122
|
+
maxLng = lng;
|
|
123
|
+
if (lat < minLat)
|
|
124
|
+
minLat = lat;
|
|
125
|
+
if (lat > maxLat)
|
|
126
|
+
maxLat = lat;
|
|
127
|
+
}
|
|
128
|
+
return corners.length > 0 ? [minLng, minLat, maxLng, maxLat] : null;
|
|
129
|
+
}
|
|
130
|
+
/** Whether all 4 values of the bbox are finite */
|
|
131
|
+
function isFiniteBBox(bbox) {
|
|
132
|
+
return bbox.every((value) => Number.isFinite(value));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Computes the longitude/latitude bbox of a list of features
|
|
136
|
+
*
|
|
137
|
+
* min/max are taken on the raw longitude values without normalization. Data crossing ±180 ends up
|
|
138
|
+
* with a huge bbox, so the thinning misses and it is always drawn (erring on the safe side).
|
|
139
|
+
*
|
|
140
|
+
* @returns null when there is not a single coordinate (= no thinning)
|
|
141
|
+
*/
|
|
142
|
+
export function computeFeaturesBBox(features, extensions) {
|
|
143
|
+
let minLng = Number.POSITIVE_INFINITY;
|
|
144
|
+
let minLat = Number.POSITIVE_INFINITY;
|
|
145
|
+
let maxLng = Number.NEGATIVE_INFINITY;
|
|
146
|
+
let maxLat = Number.NEGATIVE_INFINITY;
|
|
147
|
+
let found = false;
|
|
148
|
+
const visit = (lng, lat) => {
|
|
149
|
+
if (!Number.isFinite(lng) || !Number.isFinite(lat))
|
|
150
|
+
return;
|
|
151
|
+
found = true;
|
|
152
|
+
if (lng < minLng)
|
|
153
|
+
minLng = lng;
|
|
154
|
+
if (lng > maxLng)
|
|
155
|
+
maxLng = lng;
|
|
156
|
+
if (lat < minLat)
|
|
157
|
+
minLat = lat;
|
|
158
|
+
if (lat > maxLat)
|
|
159
|
+
maxLat = lat;
|
|
160
|
+
};
|
|
161
|
+
for (const feature of features) {
|
|
162
|
+
// A kind that spreads around its anchor (a custom type, Image) uses the rectangle it really
|
|
163
|
+
// occupies. For a standard kind that falls back to walking the raw coordinates this only adds
|
|
164
|
+
// one registry lookup, and the cost per chunk build does not change.
|
|
165
|
+
const extent = computeAnchoredExtent(feature, extensions);
|
|
166
|
+
if (extent) {
|
|
167
|
+
visit(extent[0], extent[1]);
|
|
168
|
+
visit(extent[2], extent[3]);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (feature.type === 'Circle') {
|
|
172
|
+
const radiusMeters = getCircleRadius(feature);
|
|
173
|
+
const center = feature.coordinates;
|
|
174
|
+
if (radiusMeters && radiusMeters > 0 && typeof center?.[0] === 'number') {
|
|
175
|
+
// The box of the geodesic circle, whose east and west extremes lie poleward of due
|
|
176
|
+
// east and west; it contains the polygon used for drawing (generateCirclePolygon).
|
|
177
|
+
const box = circleBoundingBox(center, radiusMeters);
|
|
178
|
+
if (box) {
|
|
179
|
+
visit(box[0], box[1]);
|
|
180
|
+
visit(box[2], box[3]);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
walkCoordinates(feature.coordinates, visit);
|
|
186
|
+
}
|
|
187
|
+
return found ? [minLng, minLat, maxLng, maxLat] : null;
|
|
188
|
+
}
|