@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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The feature handler contract of an extension
|
|
3
|
+
*
|
|
4
|
+
* The shape an extension implements to add a custom feature type: its renderer, its hit
|
|
5
|
+
* testing, its box selection, its bounding boxes, its resize and its snapping candidates, all
|
|
6
|
+
* registered at once with `registerFeatureHandler`. It is types only and sits low in the layer
|
|
7
|
+
* order, so the view, snapping and operations layers read it without reaching up into api.
|
|
8
|
+
*/
|
|
9
|
+
import type { BoxSelectionStrategy } from '../dispatcher/hit-test/box-strategy.js';
|
|
10
|
+
import type { HitTestStrategy } from '../dispatcher/hit-test/strategies/index.js';
|
|
11
|
+
import type { ResizeState } from '../operations/resize.js';
|
|
12
|
+
import type { HandleType } from '../shared/config/constants.js';
|
|
13
|
+
import type { BoundingBox, Coordinate, Feature } from '../shared/types/model.js';
|
|
14
|
+
import type { BoundingBoxCoords } from '../shared/types/selection-box.js';
|
|
15
|
+
import type { SnapCandidate, SnapProviderContext } from '../snapping/types.js';
|
|
16
|
+
import type { HandleInfo } from '../view/ui/handles.js';
|
|
17
|
+
import type { PointFrameExtent } from '../view/ui/selection-ui/index.js';
|
|
18
|
+
import type { CustomFeatureRenderer } from './renderers.js';
|
|
19
|
+
/**
|
|
20
|
+
* Custom resize result
|
|
21
|
+
*
|
|
22
|
+
* The result of the resize computation for a custom feature.
|
|
23
|
+
* Used when processing different from the standard resize (changing scale) is needed.
|
|
24
|
+
*/
|
|
25
|
+
export interface CustomResizeResult {
|
|
26
|
+
/** The new coordinates */
|
|
27
|
+
coordinates: Coordinate;
|
|
28
|
+
/** The new width (in pixels, optional) */
|
|
29
|
+
width?: number;
|
|
30
|
+
/** The new height (in pixels, optional) */
|
|
31
|
+
height?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The type of a custom resize computation function
|
|
35
|
+
*/
|
|
36
|
+
export type CustomResizeCalculator = (handle: HandleType, state: ResizeState, currentLngLat: {
|
|
37
|
+
lng: number;
|
|
38
|
+
lat: number;
|
|
39
|
+
}, feature: Feature) => CustomResizeResult | null;
|
|
40
|
+
/**
|
|
41
|
+
* A custom feature type: how its features are drawn, hit, selected, resized and snapped to
|
|
42
|
+
*
|
|
43
|
+
* Register it with `draw.registerFeatureHandler(handler)`, usually from `onInstall` of a
|
|
44
|
+
* {@link Plugin}. The registration belongs to that draw instance, and the returned function
|
|
45
|
+
* removes it. Features of the type are ordinary features in the Store (`type` is the name of
|
|
46
|
+
* the handler), so they are saved, exported, grouped and stacked like the built-in types;
|
|
47
|
+
* GeoJSON export writes the type in `maplibre-gl-draw:featureType` so that it comes back.
|
|
48
|
+
*
|
|
49
|
+
* `type`, `renderer` and `hitTest` are required. The rest have fallbacks: box selection and
|
|
50
|
+
* the bounding box use the coordinates, and without `getSelectionBoundingBox` no selection UI
|
|
51
|
+
* is drawn.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* import type { CustomFeatureHandler, Feature } from '@sakuzu/maplibre-gl-draw';
|
|
56
|
+
*
|
|
57
|
+
* // A "marker" type: one coordinate, drawn as a square, hit within the tolerance
|
|
58
|
+
* const distanceTo = (feature: Feature, [lng, lat]: [number, number]) => {
|
|
59
|
+
* const [x, y] = feature.coordinates as [number, number];
|
|
60
|
+
* return Math.hypot(x - lng, y - lat);
|
|
61
|
+
* };
|
|
62
|
+
*
|
|
63
|
+
* const markerHandler: CustomFeatureHandler = {
|
|
64
|
+
* type: 'marker',
|
|
65
|
+
* renderer: markerRenderer, // see CustomFeatureRenderer
|
|
66
|
+
* hitTest: {
|
|
67
|
+
* geometryType: 'marker',
|
|
68
|
+
* test: (feature, coordinate, tolerance) => distanceTo(feature, coordinate) <= tolerance,
|
|
69
|
+
* distance: (feature, coordinate) => distanceTo(feature, coordinate),
|
|
70
|
+
* },
|
|
71
|
+
* };
|
|
72
|
+
*
|
|
73
|
+
* const unregister = draw.registerFeatureHandler(markerHandler);
|
|
74
|
+
* draw.addFeature({ type: 'marker', coordinates: [139.767, 35.681] });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export interface CustomFeatureHandler {
|
|
78
|
+
/** The feature type name */
|
|
79
|
+
readonly type: string;
|
|
80
|
+
/** The custom renderer */
|
|
81
|
+
readonly renderer: CustomFeatureRenderer;
|
|
82
|
+
/** The custom hit testing strategy */
|
|
83
|
+
readonly hitTest: HitTestStrategy;
|
|
84
|
+
/** The custom box selection strategy (when omitted, a coordinate-based fallback is used) */
|
|
85
|
+
readonly boxSelection?: BoxSelectionStrategy;
|
|
86
|
+
/**
|
|
87
|
+
* The resize strategy (applied when computeCustomResize returns null)
|
|
88
|
+
* - 'scale': changes the scale property (as an Image does)
|
|
89
|
+
* - 'coordinates': changes the coordinates directly (the same as Polygon and LineString)
|
|
90
|
+
* - when omitted: a generic check (decided by the presence of the scale property)
|
|
91
|
+
*/
|
|
92
|
+
readonly resizeStrategy?: 'scale' | 'coordinates';
|
|
93
|
+
/**
|
|
94
|
+
* Bounding box computation
|
|
95
|
+
*
|
|
96
|
+
* Used for viewport filtering in SpatialIndex.
|
|
97
|
+
* When omitted, a simple bounding box is computed from the coordinates.
|
|
98
|
+
*
|
|
99
|
+
* @param feature The target feature
|
|
100
|
+
* @param tileSize The tile size (512 by default)
|
|
101
|
+
*/
|
|
102
|
+
getBoundingBox?(feature: Feature, tileSize: number): BoundingBox;
|
|
103
|
+
/**
|
|
104
|
+
* The additional reach for narrowing down candidates (in CSS pixels)
|
|
105
|
+
*
|
|
106
|
+
* The first stage of hit testing narrows down candidates with a radius equivalent to
|
|
107
|
+
* clickTolerance, so when the hitTest strategy of this type treats a wider area as a hit
|
|
108
|
+
* (icons and the like), the candidate is dropped before the precise test is reached.
|
|
109
|
+
* Registering "how far from the center a hit can occur" here widens the candidate search
|
|
110
|
+
* radius by that much.
|
|
111
|
+
*
|
|
112
|
+
* The test itself is still decided by the hitTest strategy as before (only the number of
|
|
113
|
+
* candidates increases slightly). A value that changes with zoom or with settings is
|
|
114
|
+
* registered as a function (it is evaluated on every query).
|
|
115
|
+
*/
|
|
116
|
+
readonly candidateReachPx?: number | (() => number);
|
|
117
|
+
/**
|
|
118
|
+
* The half width and half height of the selection box of a zero-area point (in CSS pixels)
|
|
119
|
+
*
|
|
120
|
+
* A point keeps its zero area and is treated with the "point appearance" (box only, no resize
|
|
121
|
+
* or rotation handles, move inside the box). This function only decides the dimensions of that
|
|
122
|
+
* box (the special treatment of zero area itself does not change).
|
|
123
|
+
*
|
|
124
|
+
* When it is omitted, or returns null, the default 12px square is used.
|
|
125
|
+
*
|
|
126
|
+
* @param feature The target feature
|
|
127
|
+
*/
|
|
128
|
+
getPointFrameExtent?(feature: Feature): PointFrameExtent | null;
|
|
129
|
+
/**
|
|
130
|
+
* Bounding box computation for the selection UI
|
|
131
|
+
*
|
|
132
|
+
* Used for the visual feedback of the selected state (bounding box, handles).
|
|
133
|
+
* Returns an OBB (Oriented Bounding Box) that takes rotation into account.
|
|
134
|
+
* When omitted, no selection UI is drawn.
|
|
135
|
+
*
|
|
136
|
+
* @param feature The target feature
|
|
137
|
+
* @param tileSize The tile size (512 by default)
|
|
138
|
+
*/
|
|
139
|
+
getSelectionBoundingBox?(feature: Feature, tileSize: number): BoundingBoxCoords;
|
|
140
|
+
/**
|
|
141
|
+
* Returns additional resize handles
|
|
142
|
+
*
|
|
143
|
+
* Returns the handles to display in addition to the standard four corner handles.
|
|
144
|
+
* When omitted, only the four corner handles are shown.
|
|
145
|
+
* Called only for a single selection.
|
|
146
|
+
*
|
|
147
|
+
* @param feature The target feature
|
|
148
|
+
* @param bbox The bounding box for the selection UI
|
|
149
|
+
*/
|
|
150
|
+
getAdditionalResizeHandles?(feature: Feature, bbox: BoundingBoxCoords): HandleInfo[];
|
|
151
|
+
/**
|
|
152
|
+
* Custom resize computation
|
|
153
|
+
*
|
|
154
|
+
* Provides custom resize logic such as edge-midpoint handles.
|
|
155
|
+
* Returning null applies the standard resize (changing scale).
|
|
156
|
+
*
|
|
157
|
+
* @param handle The type of the handle being operated
|
|
158
|
+
* @param state The state of the resize operation
|
|
159
|
+
* @param currentLngLat The current mouse coordinate
|
|
160
|
+
* @param feature The target feature
|
|
161
|
+
*/
|
|
162
|
+
computeCustomResize?(handle: HandleType, state: ResizeState, currentLngLat: {
|
|
163
|
+
lng: number;
|
|
164
|
+
lat: number;
|
|
165
|
+
}, feature: Feature): CustomResizeResult | null;
|
|
166
|
+
/**
|
|
167
|
+
* Returns the snapping candidates
|
|
168
|
+
*
|
|
169
|
+
* An extension point that lets a custom type provide its own vertices and edges as snapping
|
|
170
|
+
* targets. The built-in vertex provider calls this when there is a registration for the type
|
|
171
|
+
* of the target feature (when it is called, the standard enumeration of the vertices and edges
|
|
172
|
+
* of that feature is not performed).
|
|
173
|
+
*
|
|
174
|
+
* The returned candidates may be either point candidates that have a coordinate
|
|
175
|
+
* (kind: 'vertex' and the like) or segment candidates that have two endpoints (kind: 'edge').
|
|
176
|
+
* The nearest point on a segment candidate is computed by SnapService.
|
|
177
|
+
*
|
|
178
|
+
* @param feature The target feature
|
|
179
|
+
* @param ctx The snapping context (includes the cursor position, the tolerance and exclusions)
|
|
180
|
+
*/
|
|
181
|
+
getSnapTargets?(feature: Feature, ctx: SnapProviderContext): SnapCandidate[];
|
|
182
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The contracts an extension implements
|
|
3
|
+
*
|
|
4
|
+
* The types a plugin, a custom feature type or an overlay implements to plug into the
|
|
5
|
+
* extension points of a draw instance. The registration itself is on the instance
|
|
6
|
+
* (`registerFeatureHandler`, `addOverlayRenderer` and so on).
|
|
7
|
+
*/
|
|
8
|
+
export type { CustomFeatureHandler, CustomResizeCalculator, CustomResizeResult, } from './feature-handler.js';
|
|
9
|
+
export type { CustomFeatureRenderer, CustomOverlayRenderer, CustomRendererDrawContext, LayerAwareOverlayRenderer, } from './renderers.js';
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The renderer contracts of an extension
|
|
3
|
+
*
|
|
4
|
+
* The shapes an extension implements to draw with the WebGL context of a draw instance: the
|
|
5
|
+
* renderer of a custom feature type and the overlay renderers. They are types only and sit low
|
|
6
|
+
* in the layer order, so the view and snapping layers read them without reaching up into api.
|
|
7
|
+
*/
|
|
8
|
+
import type { Map as MapLibreMap, ProjectionData } from 'maplibre-gl';
|
|
9
|
+
import type { SDFLineRenderer } from '../view/renderers/line/sdf-line.js';
|
|
10
|
+
import type { PointShapeRenderer } from '../view/renderers/point/point-shape.js';
|
|
11
|
+
import type { FillShaderManager } from '../view/renderers/polygon/fill.js';
|
|
12
|
+
import type { TerrainContext } from '../view/terrain/context.js';
|
|
13
|
+
/**
|
|
14
|
+
* Rendering context for custom renderers
|
|
15
|
+
*
|
|
16
|
+
* Provides the shader data and offset information needed when using QuadShader and the like.
|
|
17
|
+
* It also holds references to the shared renderers, which makes high-quality rendering possible.
|
|
18
|
+
*/
|
|
19
|
+
export interface CustomRendererDrawContext {
|
|
20
|
+
/** Shader data (vertexShaderPrelude, define, variantName) */
|
|
21
|
+
shaderData: {
|
|
22
|
+
vertexShaderPrelude: string;
|
|
23
|
+
define: string;
|
|
24
|
+
variantName: string;
|
|
25
|
+
};
|
|
26
|
+
/** Viewport center coordinate [lng, lat] */
|
|
27
|
+
centerLngLat: [number, number];
|
|
28
|
+
/** The mainMatrix converted into an array */
|
|
29
|
+
mainMatrixArray: number[];
|
|
30
|
+
/**
|
|
31
|
+
* The resolved rendering scale factor (the conversion factor from CSS pixels to device pixels)
|
|
32
|
+
*
|
|
33
|
+
* It is the value of `pixelRatio` in Options when one has been injected, and otherwise the
|
|
34
|
+
* `window.devicePixelRatio` read in that frame. Renderers on the extension side use this
|
|
35
|
+
* instead of reading `window.devicePixelRatio` directly.
|
|
36
|
+
*/
|
|
37
|
+
pixelRatio: number;
|
|
38
|
+
/**
|
|
39
|
+
* The terrain state of the draw instance being drawn
|
|
40
|
+
*
|
|
41
|
+
* A renderer that owns a `ProjectionUniformManager` or a `QuadShader` passes it with
|
|
42
|
+
* `setTerrain(context.terrain)` before drawing, and the anchor functions (`projectAnchor`,
|
|
43
|
+
* `anchorElevationMeters`, `anchorGhostOpacity`, `drawQuadSurfaceOnTerrain` and so on) take
|
|
44
|
+
* it as their first argument. It is valid for this draw call only; a renderer shared between
|
|
45
|
+
* draw instances must not keep it.
|
|
46
|
+
*/
|
|
47
|
+
terrain: TerrainContext;
|
|
48
|
+
/**
|
|
49
|
+
* The opacity of the layer being drawn, from 0 to 1 (`Layer.opacity`)
|
|
50
|
+
*
|
|
51
|
+
* Core multiplies it into everything it draws for the layer, and a renderer multiplies it
|
|
52
|
+
* into its own alpha, so that what it draws fades with the layer. It is the opacity of the
|
|
53
|
+
* layer of the feature for a {@link CustomFeatureRenderer} and a feature companion, and 1 for
|
|
54
|
+
* an overlay (which does not belong to a layer). The shared renderers of this context do not
|
|
55
|
+
* apply it by themselves. It changes nothing about hit testing: a feature in a layer at
|
|
56
|
+
* opacity 0 can still be selected.
|
|
57
|
+
*/
|
|
58
|
+
opacity: number;
|
|
59
|
+
/** SDF line rendering (high-quality line rendering, anti-aliasing, dashes and so on) */
|
|
60
|
+
sdfLineRenderer: SDFLineRenderer;
|
|
61
|
+
/** Polygon fill rendering */
|
|
62
|
+
fillShaderManager: FillShaderManager;
|
|
63
|
+
/** Point shape rendering */
|
|
64
|
+
pointShapeRenderer: PointShapeRenderer;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Draws the features of a custom feature type with the WebGL context of the map
|
|
68
|
+
*
|
|
69
|
+
* It is the `renderer` of a {@link CustomFeatureHandler}. `onAdd` runs when the draw layer is
|
|
70
|
+
* added to the map (create the WebGL resources there), `draw` runs for each visible feature of
|
|
71
|
+
* the type in stacking order on every frame, and `onRemove` runs when the layer is removed. The
|
|
72
|
+
* shared renderers of the context draw lines, fills and point shapes the same way the built-in
|
|
73
|
+
* types are drawn, terrain included.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* import type { CustomFeatureRenderer, PointStyle } from '@sakuzu/maplibre-gl-draw';
|
|
78
|
+
*
|
|
79
|
+
* const markerStyle: PointStyle = {
|
|
80
|
+
* shape: 'square',
|
|
81
|
+
* size: 14,
|
|
82
|
+
* fillColor: [0, 0.4, 1, 1],
|
|
83
|
+
* fillOpacity: 1,
|
|
84
|
+
* strokeColor: [1, 1, 1, 1],
|
|
85
|
+
* strokeWidth: 2,
|
|
86
|
+
* strokeOpacity: 1,
|
|
87
|
+
* };
|
|
88
|
+
*
|
|
89
|
+
* const markerRenderer: CustomFeatureRenderer = {
|
|
90
|
+
* name: 'marker',
|
|
91
|
+
* onAdd() {}, // nothing to create: the shared point renderer does the drawing
|
|
92
|
+
* draw(feature, _projectionData, zoom, context) {
|
|
93
|
+
* const coordinate = feature.coordinates as [number, number];
|
|
94
|
+
* // Fade with the layer: the opacity of the layer is multiplied into the alpha
|
|
95
|
+
* const style = {
|
|
96
|
+
* ...markerStyle,
|
|
97
|
+
* fillOpacity: markerStyle.fillOpacity * context.opacity,
|
|
98
|
+
* strokeOpacity: markerStyle.strokeOpacity * context.opacity,
|
|
99
|
+
* };
|
|
100
|
+
* context.pointShapeRenderer.draw(coordinate, style, zoom, feature.id);
|
|
101
|
+
* },
|
|
102
|
+
* onRemove() {},
|
|
103
|
+
* };
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export interface CustomFeatureRenderer {
|
|
107
|
+
/** Renderer name (for debugging) */
|
|
108
|
+
readonly name: string;
|
|
109
|
+
/**
|
|
110
|
+
* Initializes the WebGL resources
|
|
111
|
+
*/
|
|
112
|
+
onAdd(gl: WebGL2RenderingContext, map: MapLibreMap): void;
|
|
113
|
+
/**
|
|
114
|
+
* Draws a feature
|
|
115
|
+
*
|
|
116
|
+
* @param feature The feature to draw
|
|
117
|
+
* @param projectionData MapLibre's ProjectionData
|
|
118
|
+
* @param zoom The current zoom level
|
|
119
|
+
* @param context The rendering context (shader data, offset information, and the opacity of
|
|
120
|
+
* the layer of the feature, which the renderer multiplies into its own alpha)
|
|
121
|
+
*/
|
|
122
|
+
draw(feature: {
|
|
123
|
+
id: string;
|
|
124
|
+
type: string;
|
|
125
|
+
coordinates: unknown;
|
|
126
|
+
properties: Record<string, unknown>;
|
|
127
|
+
style?: unknown;
|
|
128
|
+
}, projectionData: ProjectionData, zoom: number, context: CustomRendererDrawContext): void;
|
|
129
|
+
/**
|
|
130
|
+
* Releases the WebGL resources
|
|
131
|
+
*/
|
|
132
|
+
onRemove(): void;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Custom renderer
|
|
136
|
+
*
|
|
137
|
+
* Responsible for overlay rendering (independent of features).
|
|
138
|
+
*/
|
|
139
|
+
export interface CustomOverlayRenderer {
|
|
140
|
+
/** Renderer name (for debugging) */
|
|
141
|
+
readonly name: string;
|
|
142
|
+
/**
|
|
143
|
+
* The priority in the draw order
|
|
144
|
+
* - 'background': drawn behind the features
|
|
145
|
+
* - 'foreground': drawn in front of the features (behind the selection UI)
|
|
146
|
+
* - 'overlay': drawn in front of the selection UI
|
|
147
|
+
*/
|
|
148
|
+
readonly order: 'background' | 'foreground' | 'overlay';
|
|
149
|
+
/**
|
|
150
|
+
* Initializes the WebGL resources
|
|
151
|
+
*/
|
|
152
|
+
onAdd(gl: WebGL2RenderingContext, map: MapLibreMap): void;
|
|
153
|
+
/**
|
|
154
|
+
* Draws
|
|
155
|
+
*
|
|
156
|
+
* @param projectionData MapLibre's ProjectionData
|
|
157
|
+
* @param zoom The current zoom level
|
|
158
|
+
* @param context The rendering context (shared renderers, shader data and so on)
|
|
159
|
+
*/
|
|
160
|
+
draw(projectionData: ProjectionData, zoom: number, context: CustomRendererDrawContext): void;
|
|
161
|
+
/**
|
|
162
|
+
* Releases the WebGL resources
|
|
163
|
+
*/
|
|
164
|
+
onRemove(): void;
|
|
165
|
+
/**
|
|
166
|
+
* Whether the renderer still has work that later frames finish on their own and that will
|
|
167
|
+
* change what it draws (resources it prepares over several frames, say). Optional: a renderer
|
|
168
|
+
* without it has none
|
|
169
|
+
*
|
|
170
|
+
* `MapLibreGLDraw.hasPendingWork` asks every overlay renderer, so a host that waits for a
|
|
171
|
+
* complete picture waits for this renderer too. A renderer that returns true requests the
|
|
172
|
+
* repaints that finish the work itself. With `timeSlicing: false` in the rendering settings,
|
|
173
|
+
* a renderer should finish in the frame what it would otherwise spread over frames.
|
|
174
|
+
*/
|
|
175
|
+
hasPendingWork?(): boolean;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Layer-aware overlay renderer
|
|
179
|
+
*
|
|
180
|
+
* An extension of CustomOverlayRenderer that supports rendering per layer.
|
|
181
|
+
* Used for rendering that follows the layer order, such as Tentative.
|
|
182
|
+
*/
|
|
183
|
+
export interface LayerAwareOverlayRenderer extends CustomOverlayRenderer {
|
|
184
|
+
/**
|
|
185
|
+
* Performs the rendering that corresponds to the given layer (lines and fills only)
|
|
186
|
+
*
|
|
187
|
+
* Called in the per-layer rendering loop, after the features of each layer have been drawn.
|
|
188
|
+
* When this method exists, it is used instead of draw().
|
|
189
|
+
* Vertices are drawn in the foreground, so they are not drawn here.
|
|
190
|
+
*
|
|
191
|
+
* @param layerId The ID of the target layer
|
|
192
|
+
* @param projectionData MapLibre's ProjectionData
|
|
193
|
+
* @param zoom The current zoom level
|
|
194
|
+
* @param context The rendering context
|
|
195
|
+
*/
|
|
196
|
+
drawForLayer(layerId: string, projectionData: ProjectionData, zoom: number, context: CustomRendererDrawContext): void;
|
|
197
|
+
/**
|
|
198
|
+
* Draws the vertices in the foreground
|
|
199
|
+
*
|
|
200
|
+
* Called after the selection UI, it draws the vertices of all layers in the foreground at once.
|
|
201
|
+
* This is needed so that the vertices stay visible even while drawing on a layer that is behind.
|
|
202
|
+
*
|
|
203
|
+
* @param projectionData MapLibre's ProjectionData
|
|
204
|
+
* @param zoom The current zoom level
|
|
205
|
+
* @param context The rendering context
|
|
206
|
+
*/
|
|
207
|
+
drawVertices?(projectionData: ProjectionData, zoom: number, context: CustomRendererDrawContext): void;
|
|
208
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coordinate generation from a bearing
|
|
3
|
+
*
|
|
4
|
+
* Computes a point from a center, a distance and a bearing on the lng/lat plane. The
|
|
5
|
+
* snapping guides rely on it. Circles and buffers use the geodesic direct problem
|
|
6
|
+
* (destinationPoint in distance.ts) instead.
|
|
7
|
+
*
|
|
8
|
+
* It is not the geodesic direct problem. The distance is laid out on the lng/lat plane
|
|
9
|
+
* scaled at the latitude of the center (an equirectangular approximation: the longitude
|
|
10
|
+
* displacement is divided by cos of the center latitude), so the point drifts from the true
|
|
11
|
+
* geodesic position as the distance and the latitude grow. Measured with the haversine
|
|
12
|
+
* distance back to the center, the radius error at latitude 60 degrees is about ±0.05% for
|
|
13
|
+
* 10 km, ±0.5% (±530 m) for 100 km and -5.6% to +4.9% for 1000 km, and it diverges near
|
|
14
|
+
* the poles (-20% to +14% for 1 km at latitude 89.99 degrees). Along a bearing of 90 or 270
|
|
15
|
+
* degrees the point stays on the parallel of the center, which the snapping guides rely on.
|
|
16
|
+
*/
|
|
17
|
+
import type { Coordinate } from './types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Returns the position at a distance and bearing from a center, laid out on the lng/lat
|
|
20
|
+
* plane.
|
|
21
|
+
*
|
|
22
|
+
* This is a planar approximation, not the geodesic direct problem: the longitude
|
|
23
|
+
* displacement is divided by `cos(lat)` of the center, so a bearing of 90 or 270 degrees
|
|
24
|
+
* stays exactly on the parallel of the center. The haversine distance from the center to
|
|
25
|
+
* the result differs from `radiusMeters` by about ±0.2% at latitude 35 degrees for 100 km
|
|
26
|
+
* and ±0.5% at latitude 60 degrees for 100 km, and the error diverges near the poles. It is
|
|
27
|
+
* exact enough at the scale of an edit; where the distance must hold, use
|
|
28
|
+
* {@link destinationPoint}.
|
|
29
|
+
*
|
|
30
|
+
* The longitude of the result is not wrapped into [-180, 180]. No input is rejected: a
|
|
31
|
+
* center at latitude ±90 degrees gives a non-finite longitude, and non-finite arguments
|
|
32
|
+
* give non-finite coordinates.
|
|
33
|
+
*
|
|
34
|
+
* @param center The center `[lng, lat]` in degrees
|
|
35
|
+
* @param radiusMeters The distance from the center in meters
|
|
36
|
+
* @param angleDegrees The bearing in degrees, clockwise with north as 0
|
|
37
|
+
* @returns The position `[lng, lat]` in degrees
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { getPointAtAngle } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
42
|
+
*
|
|
43
|
+
* // 1 km due east of Tokyo Station, on the same parallel
|
|
44
|
+
* getPointAtAngle([139.767, 35.681], 1000, 90); // [139.77807..., 35.681]
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function getPointAtAngle(center: Coordinate, radiusMeters: number, angleDegrees: number): Coordinate;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { EARTH_RADIUS_METERS, toRadians } from './units.js';
|
|
4
|
+
/**
|
|
5
|
+
* Returns the position at a distance and bearing from a center, laid out on the lng/lat
|
|
6
|
+
* plane.
|
|
7
|
+
*
|
|
8
|
+
* This is a planar approximation, not the geodesic direct problem: the longitude
|
|
9
|
+
* displacement is divided by `cos(lat)` of the center, so a bearing of 90 or 270 degrees
|
|
10
|
+
* stays exactly on the parallel of the center. The haversine distance from the center to
|
|
11
|
+
* the result differs from `radiusMeters` by about ±0.2% at latitude 35 degrees for 100 km
|
|
12
|
+
* and ±0.5% at latitude 60 degrees for 100 km, and the error diverges near the poles. It is
|
|
13
|
+
* exact enough at the scale of an edit; where the distance must hold, use
|
|
14
|
+
* {@link destinationPoint}.
|
|
15
|
+
*
|
|
16
|
+
* The longitude of the result is not wrapped into [-180, 180]. No input is rejected: a
|
|
17
|
+
* center at latitude ±90 degrees gives a non-finite longitude, and non-finite arguments
|
|
18
|
+
* give non-finite coordinates.
|
|
19
|
+
*
|
|
20
|
+
* @param center The center `[lng, lat]` in degrees
|
|
21
|
+
* @param radiusMeters The distance from the center in meters
|
|
22
|
+
* @param angleDegrees The bearing in degrees, clockwise with north as 0
|
|
23
|
+
* @returns The position `[lng, lat]` in degrees
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { getPointAtAngle } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
28
|
+
*
|
|
29
|
+
* // 1 km due east of Tokyo Station, on the same parallel
|
|
30
|
+
* getPointAtAngle([139.767, 35.681], 1000, 90); // [139.77807..., 35.681]
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function getPointAtAngle(center, radiusMeters, angleDegrees) {
|
|
34
|
+
const earthRadius = EARTH_RADIUS_METERS;
|
|
35
|
+
const [lng, lat] = center;
|
|
36
|
+
// Convert the angle to radians (clockwise with north as 0)
|
|
37
|
+
const angleRad = toRadians(angleDegrees);
|
|
38
|
+
// Compute the latitude displacement (northward is positive)
|
|
39
|
+
const dLat = (radiusMeters / earthRadius) * Math.cos(angleRad) * (180 / Math.PI);
|
|
40
|
+
// Compute the longitude displacement (with the correction for latitude)
|
|
41
|
+
const latRad = toRadians(lat);
|
|
42
|
+
const dLng = ((radiusMeters / earthRadius) * Math.sin(angleRad) * (180 / Math.PI)) / Math.cos(latRad);
|
|
43
|
+
return [lng + dLng, lat + dLat];
|
|
44
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AreaCoordinates, BBox, Coordinate } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the bounding box of a coordinate sequence.
|
|
4
|
+
*
|
|
5
|
+
* A coordinate whose longitude or latitude is not a finite number is skipped. Crossing the
|
|
6
|
+
* ±180 degree meridian is not handled: the box spans the plain minimum and maximum
|
|
7
|
+
* longitudes.
|
|
8
|
+
*
|
|
9
|
+
* @param coordinates Positions `[lng, lat]` in degrees
|
|
10
|
+
* @returns `[minLng, minLat, maxLng, maxLat]` in degrees. `null` when there is not a single
|
|
11
|
+
* finite coordinate (an empty array included)
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { coordinatesBBox } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
16
|
+
*
|
|
17
|
+
* coordinatesBBox([[139.7, 35.6], [139.8, 35.7]]); // [139.7, 35.6, 139.8, 35.7]
|
|
18
|
+
* coordinatesBBox([]); // null
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function coordinatesBBox(coordinates: Coordinate[]): BBox | null;
|
|
22
|
+
/**
|
|
23
|
+
* Computes the bounding box of Polygon or MultiPolygon coordinates.
|
|
24
|
+
*
|
|
25
|
+
* Every position of every ring, holes included, is taken into account; a position that is
|
|
26
|
+
* not finite is skipped.
|
|
27
|
+
*
|
|
28
|
+
* @param coordinates Polygon or MultiPolygon coordinates in degrees
|
|
29
|
+
* @returns `[minLng, minLat, maxLng, maxLat]` in degrees. `null` when there is not a single
|
|
30
|
+
* finite coordinate
|
|
31
|
+
*/
|
|
32
|
+
export declare function boundingBox(coordinates: AreaCoordinates): BBox | null;
|
|
33
|
+
/**
|
|
34
|
+
* Determines whether two bounding boxes overlap, touching included.
|
|
35
|
+
*
|
|
36
|
+
* @param a A box `[minLng, minLat, maxLng, maxLat]`
|
|
37
|
+
* @param b A box `[minLng, minLat, maxLng, maxLat]`
|
|
38
|
+
* @returns `true` when the boxes share at least one point, an edge or a corner included
|
|
39
|
+
*/
|
|
40
|
+
export declare function bboxIntersects(a: BBox, b: BBox): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Determines whether one bounding box contains another, coincident boundaries included.
|
|
43
|
+
*
|
|
44
|
+
* @param outer The containing box `[minLng, minLat, maxLng, maxLat]`
|
|
45
|
+
* @param inner The contained box `[minLng, minLat, maxLng, maxLat]`
|
|
46
|
+
* @returns `true` when every point of `inner` lies in `outer`. A box contains itself
|
|
47
|
+
*/
|
|
48
|
+
export declare function bboxContains(outer: BBox, inner: BBox): boolean;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Bounding box
|
|
5
|
+
*
|
|
6
|
+
* Lightweight tests used as the preliminary check of the predicates. Crossing the
|
|
7
|
+
* ±180 degree meridian is not handled.
|
|
8
|
+
*/
|
|
9
|
+
import { flattenAreaCoordinates, isFiniteCoordinate } from './coords.js';
|
|
10
|
+
/**
|
|
11
|
+
* Computes the bounding box of a coordinate sequence.
|
|
12
|
+
*
|
|
13
|
+
* A coordinate whose longitude or latitude is not a finite number is skipped. Crossing the
|
|
14
|
+
* ±180 degree meridian is not handled: the box spans the plain minimum and maximum
|
|
15
|
+
* longitudes.
|
|
16
|
+
*
|
|
17
|
+
* @param coordinates Positions `[lng, lat]` in degrees
|
|
18
|
+
* @returns `[minLng, minLat, maxLng, maxLat]` in degrees. `null` when there is not a single
|
|
19
|
+
* finite coordinate (an empty array included)
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { coordinatesBBox } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
24
|
+
*
|
|
25
|
+
* coordinatesBBox([[139.7, 35.6], [139.8, 35.7]]); // [139.7, 35.6, 139.8, 35.7]
|
|
26
|
+
* coordinatesBBox([]); // null
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function coordinatesBBox(coordinates) {
|
|
30
|
+
let found = false;
|
|
31
|
+
let minLng = Number.POSITIVE_INFINITY;
|
|
32
|
+
let minLat = Number.POSITIVE_INFINITY;
|
|
33
|
+
let maxLng = Number.NEGATIVE_INFINITY;
|
|
34
|
+
let maxLat = Number.NEGATIVE_INFINITY;
|
|
35
|
+
for (const coordinate of coordinates) {
|
|
36
|
+
if (!isFiniteCoordinate(coordinate))
|
|
37
|
+
continue;
|
|
38
|
+
found = true;
|
|
39
|
+
const [lng, lat] = coordinate;
|
|
40
|
+
if (lng < minLng)
|
|
41
|
+
minLng = lng;
|
|
42
|
+
if (lat < minLat)
|
|
43
|
+
minLat = lat;
|
|
44
|
+
if (lng > maxLng)
|
|
45
|
+
maxLng = lng;
|
|
46
|
+
if (lat > maxLat)
|
|
47
|
+
maxLat = lat;
|
|
48
|
+
}
|
|
49
|
+
return found ? [minLng, minLat, maxLng, maxLat] : null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Computes the bounding box of Polygon or MultiPolygon coordinates.
|
|
53
|
+
*
|
|
54
|
+
* Every position of every ring, holes included, is taken into account; a position that is
|
|
55
|
+
* not finite is skipped.
|
|
56
|
+
*
|
|
57
|
+
* @param coordinates Polygon or MultiPolygon coordinates in degrees
|
|
58
|
+
* @returns `[minLng, minLat, maxLng, maxLat]` in degrees. `null` when there is not a single
|
|
59
|
+
* finite coordinate
|
|
60
|
+
*/
|
|
61
|
+
export function boundingBox(coordinates) {
|
|
62
|
+
return coordinatesBBox(flattenAreaCoordinates(coordinates));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Determines whether two bounding boxes overlap, touching included.
|
|
66
|
+
*
|
|
67
|
+
* @param a A box `[minLng, minLat, maxLng, maxLat]`
|
|
68
|
+
* @param b A box `[minLng, minLat, maxLng, maxLat]`
|
|
69
|
+
* @returns `true` when the boxes share at least one point, an edge or a corner included
|
|
70
|
+
*/
|
|
71
|
+
export function bboxIntersects(a, b) {
|
|
72
|
+
return !(a[2] < b[0] || b[2] < a[0] || a[3] < b[1] || b[3] < a[1]);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Determines whether one bounding box contains another, coincident boundaries included.
|
|
76
|
+
*
|
|
77
|
+
* @param outer The containing box `[minLng, minLat, maxLng, maxLat]`
|
|
78
|
+
* @param inner The contained box `[minLng, minLat, maxLng, maxLat]`
|
|
79
|
+
* @returns `true` when every point of `inner` lies in `outer`. A box contains itself
|
|
80
|
+
*/
|
|
81
|
+
export function bboxContains(outer, inner) {
|
|
82
|
+
return (outer[0] <= inner[0] && outer[1] <= inner[1] && outer[2] >= inner[2] && outer[3] >= inner[3]);
|
|
83
|
+
}
|