@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 +1016 -2
- package/README.ja.md +39 -19
- package/README.md +41 -21
- package/dist/api/datasets.d.ts +258 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +135 -0
- package/dist/api/draw.js +18 -0
- package/dist/api/drawing.d.ts +87 -0
- package/dist/api/errors.d.ts +35 -0
- package/dist/api/errors.js +35 -0
- package/dist/api/events.d.ts +306 -0
- package/dist/api/extension/context.d.ts +247 -0
- package/dist/api/extension/feature-type.d.ts +129 -0
- package/dist/api/extension/mode.d.ts +123 -0
- package/dist/api/extension/plugin.d.ts +51 -0
- package/dist/api/extension/plugin.js +3 -0
- package/dist/api/extension/provider.d.ts +119 -0
- package/dist/api/extension/provider.js +3 -0
- package/dist/api/extension/render.d.ts +176 -0
- package/dist/api/extension/render.js +3 -0
- package/dist/api/extension/store.d.ts +190 -0
- package/dist/api/extension/store.js +3 -0
- package/dist/api/extensions.d.ts +306 -0
- package/dist/api/extensions.js +3 -0
- package/dist/api/features.d.ts +188 -0
- package/dist/api/features.js +3 -0
- package/dist/api/groups.d.ts +111 -0
- package/dist/api/groups.js +3 -0
- package/dist/api/hidden.d.ts +45 -0
- package/dist/api/hidden.js +3 -0
- package/dist/api/impl/adapters.js +463 -0
- package/dist/api/impl/contexts.js +466 -0
- package/dist/api/impl/create-draw.js +124 -0
- package/dist/api/impl/datasets.js +404 -0
- package/dist/api/impl/destroy-guard.js +74 -0
- package/dist/api/impl/document.js +280 -0
- package/dist/api/impl/drawing.js +180 -0
- package/dist/api/impl/engine-context.d.ts +7 -0
- package/dist/api/{context.js → impl/engine-context.js} +49 -38
- package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
- package/dist/api/impl/events.js +422 -0
- package/dist/api/impl/extension-host.js +361 -0
- package/dist/api/impl/extensions.js +229 -0
- package/dist/api/impl/features.js +445 -0
- package/dist/api/impl/geometry/apply.d.ts +32 -0
- package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
- package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
- package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
- package/dist/api/{geometry → impl/geometry}/split.js +10 -21
- package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
- package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
- package/dist/api/impl/geometry/types.js +3 -0
- package/dist/api/impl/groups.d.ts +3 -0
- package/dist/api/impl/groups.js +268 -0
- package/dist/api/impl/hidden.js +60 -0
- package/dist/api/impl/import-export/constants.d.ts +22 -0
- package/dist/api/impl/import-export/constants.js +24 -0
- package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
- package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
- package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
- package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
- package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
- package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
- package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
- package/dist/api/impl/import-export/image-import.d.ts +16 -0
- package/dist/api/impl/import-export/image-import.js +73 -0
- package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
- package/dist/api/impl/import-export/legacy-image-style.js +49 -0
- package/dist/api/impl/import-export/native-format.d.ts +14 -0
- package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
- package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
- package/dist/api/impl/import-export/native-upgrade.js +139 -0
- package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
- package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
- package/dist/api/impl/import-export/style-validation.d.ts +24 -0
- package/dist/api/impl/import-export/style-validation.js +86 -0
- package/dist/api/impl/import-export/types.d.ts +52 -0
- package/dist/api/impl/import-export/types.js +3 -0
- package/dist/api/impl/input.js +180 -0
- package/dist/api/impl/layers.js +307 -0
- package/dist/api/impl/metadata.d.ts +1 -0
- package/dist/api/impl/metadata.js +22 -0
- package/dist/api/impl/options.d.ts +1 -0
- package/dist/api/impl/options.js +822 -0
- package/dist/api/impl/placement.d.ts +1 -0
- package/dist/api/impl/placement.js +138 -0
- package/dist/api/impl/render-context.d.ts +13 -0
- package/dist/api/impl/render-context.js +272 -0
- package/dist/api/impl/rows.d.ts +1 -0
- package/dist/api/impl/rows.js +46 -0
- package/dist/api/impl/selection.d.ts +1 -0
- package/dist/api/impl/selection.js +186 -0
- package/dist/api/impl/shared.d.ts +64 -0
- package/dist/api/impl/shared.js +178 -0
- package/dist/api/impl/validate-extension.d.ts +1 -0
- package/dist/api/impl/validate-extension.js +159 -0
- package/dist/api/layers.d.ts +130 -0
- package/dist/api/layers.js +3 -0
- package/dist/api/metadata.d.ts +18 -0
- package/dist/api/metadata.js +3 -0
- package/dist/api/model.d.ts +487 -0
- package/dist/api/model.js +47 -0
- package/dist/api/options.d.ts +466 -0
- package/dist/api/options.js +3 -0
- package/dist/api/selection.d.ts +94 -0
- package/dist/api/selection.js +3 -0
- package/dist/api/state.d.ts +155 -0
- package/dist/api/state.js +12 -0
- package/dist/{display → dataset}/chunk.d.ts +1 -1
- package/dist/{display → dataset}/chunk.js +4 -3
- package/dist/{display → dataset}/dataset.js +18 -21
- package/dist/dataset/interaction.d.ts +1 -0
- package/dist/{display → dataset}/interaction.js +18 -6
- package/dist/dataset/manager.d.ts +1 -0
- package/dist/dataset/provider.d.ts +1 -0
- package/dist/{display → dataset}/retained.d.ts +1 -1
- package/dist/{display → dataset}/retained.js +8 -7
- package/dist/dataset/source.d.ts +1 -0
- package/dist/{display → dataset}/source.js +17 -4
- package/dist/dataset/spatial.d.ts +1 -0
- package/dist/{display → dataset}/spatial.js +1 -1
- package/dist/dataset/style.d.ts +1 -0
- package/dist/{display → dataset}/style.js +1 -1
- package/dist/dataset/table-source.d.ts +1 -0
- package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
- package/dist/{display → dataset}/thinning.d.ts +0 -10
- package/dist/{display → dataset}/thinning.js +3 -2
- package/dist/dataset/triangulation.d.ts +1 -0
- package/dist/{display → dataset}/triangulation.js +0 -0
- package/dist/{display → dataset}/types.d.ts +82 -121
- package/dist/dataset/types.js +61 -0
- package/dist/dispatcher/hit-test/box-strategies.js +13 -13
- package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
- package/dist/dispatcher/hit-test/globe-shape.js +5 -4
- package/dist/dispatcher/hit-test/service.d.ts +17 -0
- package/dist/dispatcher/hit-test/service.js +80 -16
- package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
- package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
- package/dist/dispatcher/hit-test/strategies/image.js +6 -18
- package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
- package/dist/dispatcher/hit-test/strategies/line.js +9 -2
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
- package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
- package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
- package/dist/dispatcher/hit-test/strategies/point.js +8 -4
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
- package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
- package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
- package/dist/dispatcher/input-router.js +152 -69
- package/dist/dispatcher/normalizer.js +6 -2
- package/dist/dispatcher/types.d.ts +6 -1
- package/dist/extension/feature-handler.d.ts +1 -182
- package/dist/extension/index.d.ts +4 -7
- package/dist/extension/renderers.d.ts +1 -208
- package/dist/geometry/angle.d.ts +0 -8
- package/dist/geometry/angle.js +0 -8
- package/dist/geometry/bbox.d.ts +4 -12
- package/dist/geometry/bbox.js +4 -12
- package/dist/geometry/boolean.d.ts +0 -51
- package/dist/geometry/boolean.js +0 -51
- package/dist/geometry/buffer.d.ts +0 -26
- package/dist/geometry/buffer.js +0 -26
- package/dist/geometry/circle.d.ts +0 -9
- package/dist/geometry/circle.js +0 -9
- package/dist/geometry/coords.d.ts +0 -16
- package/dist/geometry/coords.js +0 -16
- package/dist/geometry/distance.d.ts +0 -24
- package/dist/geometry/distance.js +0 -24
- package/dist/geometry/errors.d.ts +21 -36
- package/dist/geometry/errors.js +49 -29
- package/dist/geometry/geojson.d.ts +81 -0
- package/dist/geometry/geojson.js +164 -0
- package/dist/geometry/index.d.ts +38 -23
- package/dist/geometry/index.js +43 -31
- package/dist/geometry/measure.d.ts +0 -27
- package/dist/geometry/measure.js +0 -27
- package/dist/geometry/predicates.d.ts +0 -9
- package/dist/geometry/predicates.js +0 -9
- package/dist/geometry/public-bounds.d.ts +26 -0
- package/dist/geometry/public-bounds.js +30 -0
- package/dist/geometry/public-combine.d.ts +78 -0
- package/dist/geometry/public-combine.js +82 -0
- package/dist/geometry/public-create.d.ts +54 -0
- package/dist/geometry/public-create.js +70 -0
- package/dist/geometry/public-measure.d.ts +170 -0
- package/dist/geometry/public-measure.js +283 -0
- package/dist/geometry/public-predicates.d.ts +54 -0
- package/dist/geometry/public-predicates.js +144 -0
- package/dist/geometry/public-repair.d.ts +75 -0
- package/dist/geometry/public-repair.js +77 -0
- package/dist/geometry/simplify.d.ts +0 -7
- package/dist/geometry/simplify.js +0 -7
- package/dist/geometry/split.d.ts +0 -20
- package/dist/geometry/split.js +0 -20
- package/dist/geometry/units.d.ts +20 -12
- package/dist/geometry/units.js +20 -12
- package/dist/index.d.ts +52 -66
- package/dist/index.js +6 -18
- package/dist/messages.d.ts +7 -7
- package/dist/modes/draw/circle.js +83 -207
- package/dist/modes/draw/commit-layer.d.ts +5 -16
- package/dist/modes/draw/commit-layer.js +2 -13
- package/dist/modes/draw/freehand.js +108 -246
- package/dist/modes/draw/image.js +4 -2
- package/dist/modes/draw/index.d.ts +5 -5
- package/dist/modes/draw/index.js +5 -5
- package/dist/modes/draw/line.js +18 -354
- package/dist/modes/draw/point.js +29 -78
- package/dist/modes/draw/polygon.js +23 -368
- package/dist/modes/draw/trace-support.d.ts +43 -36
- package/dist/modes/draw/trace-support.js +95 -98
- package/dist/modes/draw/vertex-drawing.d.ts +1 -0
- package/dist/modes/draw/vertex-drawing.js +176 -0
- package/dist/modes/handler.d.ts +1 -285
- package/dist/modes/manager.d.ts +2 -2
- package/dist/modes/manager.js +3 -0
- package/dist/modes/select/box-selection.d.ts +3 -3
- package/dist/modes/select/box-selection.js +2 -1
- package/dist/modes/select/click-handler.d.ts +5 -5
- package/dist/modes/select/click-handler.js +22 -20
- package/dist/modes/select/cursor-handler.d.ts +2 -2
- package/dist/modes/select/drag/intermediate-writes.js +1 -1
- package/dist/modes/select/drag/move.js +3 -3
- package/dist/modes/select/drag/operation.d.ts +3 -3
- package/dist/modes/select/drag/radius.js +5 -4
- package/dist/modes/select/drag/transform.d.ts +2 -2
- package/dist/modes/select/drag/transform.js +11 -5
- package/dist/modes/select/drag/vertex.d.ts +2 -2
- package/dist/modes/select/drag/vertex.js +13 -8
- package/dist/modes/select/drag-handler.js +44 -25
- package/dist/modes/select/mode.js +17 -17
- package/dist/modes/select/shortcut-handler.d.ts +8 -8
- package/dist/modes/select/shortcut-handler.js +9 -7
- package/dist/operations/layer-operations.js +29 -168
- package/dist/operations/resize.d.ts +2 -2
- package/dist/operations/resize.js +5 -5
- package/dist/operations/rotate.js +5 -5
- package/dist/operations/selection-operations.d.ts +16 -1
- package/dist/operations/selection-operations.js +28 -13
- package/dist/operations/shared-vertex.js +4 -2
- package/dist/operations/trace-graph.d.ts +0 -18
- package/dist/operations/trace-graph.js +0 -18
- package/dist/operations/vertex.js +36 -35
- package/dist/shared/color.d.ts +1 -0
- package/dist/shared/color.js +245 -0
- package/dist/shared/config/constants.d.ts +1 -54
- package/dist/shared/config/constants.js +1 -58
- package/dist/shared/config/feature-style.d.ts +16 -13
- package/dist/shared/config/feature-style.js +9 -0
- package/dist/shared/config/rendering.d.ts +3 -3
- package/dist/shared/config/selection-highlight.d.ts +0 -15
- package/dist/shared/config/selection-highlight.js +4 -7
- package/dist/shared/config/selection.d.ts +2 -32
- package/dist/shared/config/selection.js +0 -18
- package/dist/shared/config/topology.d.ts +2 -2
- package/dist/shared/config/trace.d.ts +4 -4
- package/dist/shared/math/angle.d.ts +1 -1
- package/dist/shared/math/angle.js +1 -1
- package/dist/shared/math/circle.d.ts +1 -1
- package/dist/shared/math/circle.js +1 -1
- package/dist/shared/math/distance.d.ts +2 -1
- package/dist/shared/math/distance.js +3 -2
- package/dist/shared/math/index.d.ts +1 -1
- package/dist/shared/math/index.js +1 -1
- package/dist/shared/math/transform.d.ts +23 -0
- package/dist/shared/math/transform.js +47 -28
- package/dist/shared/properties.d.ts +18 -0
- package/dist/shared/properties.js +129 -0
- package/dist/shared/types/events.d.ts +15 -7
- package/dist/shared/types/model.d.ts +109 -159
- package/dist/shared/types/style.d.ts +1 -1
- package/dist/shared/utils/color.d.ts +2 -36
- package/dist/shared/utils/color.js +13 -70
- package/dist/shared/utils/coordinates.d.ts +30 -4
- package/dist/shared/utils/coordinates.js +56 -10
- package/dist/shared/utils/event-emitter.d.ts +1 -262
- package/dist/shared/utils/event-emitter.js +4 -3
- package/dist/shared/utils/feature-bbox.js +8 -7
- package/dist/shared/utils/feature-segments.js +5 -4
- package/dist/shared/utils/image.d.ts +0 -4
- package/dist/shared/utils/image.js +0 -6
- package/dist/shared/utils/name-generator.d.ts +14 -20
- package/dist/shared/utils/name-generator.js +20 -3
- package/dist/shared/utils/pixel-ratio.d.ts +9 -3
- package/dist/shared/utils/pixel-ratio.js +13 -4
- package/dist/shared/utils/property.d.ts +7 -50
- package/dist/shared/utils/property.js +22 -87
- package/dist/snapping/custom-targets.js +21 -4
- package/dist/snapping/indicator.js +20 -11
- package/dist/snapping/providers/display.d.ts +6 -1
- package/dist/snapping/providers/display.js +2 -1
- package/dist/snapping/providers/guide.d.ts +3 -43
- package/dist/snapping/providers/guide.js +1 -44
- package/dist/snapping/providers/intersection.js +1 -1
- package/dist/snapping/providers/store.js +3 -3
- package/dist/snapping/service.js +18 -7
- package/dist/snapping/types.d.ts +9 -35
- package/dist/store/draw-store.js +233 -142
- package/dist/store/local-visibility.d.ts +11 -6
- package/dist/store/local-visibility.js +38 -7
- package/dist/store/lock.d.ts +0 -6
- package/dist/store/lock.js +0 -6
- package/dist/store/memory/change-bus.d.ts +3 -3
- package/dist/store/memory/change-bus.js +12 -0
- package/dist/store/memory/file-store.d.ts +2 -2
- package/dist/store/memory/ui-state.d.ts +1 -51
- package/dist/store/memory/ui-state.js +122 -134
- package/dist/store/memory.d.ts +1 -8
- package/dist/store/memory.js +249 -45
- package/dist/store/ordering.d.ts +9 -0
- package/dist/store/ordering.js +17 -0
- package/dist/store/spatial/spatial-index.d.ts +1 -1
- package/dist/store/spatial/spatial-index.js +1 -1
- package/dist/store/spatial/store-spatial-index.d.ts +3 -1
- package/dist/store/spatial/store-spatial-index.js +9 -3
- package/dist/store/store.d.ts +66 -107
- package/dist/store/types.d.ts +1 -1
- package/dist/store/writable-layer.d.ts +1 -1
- package/dist/store/writable-layer.js +2 -2
- package/dist/table/builder.d.ts +83 -0
- package/dist/table/builder.js +381 -0
- package/dist/table/index.d.ts +37 -0
- package/dist/table/index.js +5 -0
- package/dist/table/packed-rtree.d.ts +1 -0
- package/dist/{display → table}/packed-rtree.js +1 -1
- package/dist/table/partition.d.ts +1 -0
- package/dist/{display → table}/partition.js +3 -3
- package/dist/table/prepare.d.ts +44 -0
- package/dist/table/prepare.js +136 -0
- package/dist/table/table.d.ts +1 -0
- package/dist/{display/columnar → table}/table.js +29 -25
- package/dist/{display/columnar → table}/types.d.ts +68 -72
- package/dist/table/types.js +3 -0
- package/dist/view/coordinator.js +4 -3
- package/dist/view/feature-companion.d.ts +13 -7
- package/dist/view/feature-companion.js +11 -3
- package/dist/view/globe-subdivision.js +3 -3
- package/dist/view/layer/attach.d.ts +1 -1
- package/dist/view/layer/attach.js +1 -1
- package/dist/view/layer/custom-layer.js +40 -11
- package/dist/view/layer/display-list.js +2 -1
- package/dist/view/layer/drape-planner.d.ts +2 -2
- package/dist/view/layer/frame-render.d.ts +3 -3
- package/dist/view/layer/frame-render.js +7 -2
- package/dist/view/layer/frame-state.d.ts +6 -6
- package/dist/view/layer/index.d.ts +2 -2
- package/dist/view/layer/index.js +1 -1
- package/dist/view/layer/render.d.ts +4 -4
- package/dist/view/layer/render.js +3 -8
- package/dist/view/layer/renderers.d.ts +2 -2
- package/dist/view/layer/renderers.js +1 -1
- package/dist/view/layer/slot-manager.d.ts +2 -2
- package/dist/view/layer/slot-manager.js +4 -4
- package/dist/view/layer/slots.d.ts +2 -2
- package/dist/view/layer/slots.js +1 -1
- package/dist/view/layer/store-retained-bbox.js +3 -2
- package/dist/view/layer/store-retained-classify.d.ts +5 -7
- package/dist/view/layer/store-retained-classify.js +19 -7
- package/dist/view/layer/store-retained-collect.js +8 -7
- package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
- package/dist/view/layer/store-retained-coord-patch.js +13 -4
- package/dist/view/layer/store-retained-immediate.d.ts +3 -3
- package/dist/view/layer/store-retained-immediate.js +3 -8
- package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
- package/dist/view/layer/store-retained.d.ts +2 -2
- package/dist/view/layer/store-retained.js +1 -1
- package/dist/view/renderers/batch-manager.js +8 -7
- package/dist/view/renderers/drawer.js +21 -15
- package/dist/view/renderers/image.js +13 -39
- package/dist/view/renderers/line/line-types.d.ts +3 -3
- package/dist/view/renderers/line/sdf-line.js +3 -1
- package/dist/view/renderers/point/billboard-depth.js +1 -1
- package/dist/view/renderers/point/point-instance.js +1 -1
- package/dist/view/renderers/point/point-shape.js +2 -2
- package/dist/view/renderers/point/point-style.js +48 -4
- package/dist/view/renderers/polygon/batch.js +1 -2
- package/dist/view/renderers/polygon/fill.js +3 -1
- package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
- package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
- package/dist/view/renderers/stroke.js +3 -1
- package/dist/view/shaders/helpers.d.ts +2 -42
- package/dist/view/shaders/helpers.js +0 -6
- package/dist/view/shaders/projection.d.ts +15 -7
- package/dist/view/shaders/projection.js +23 -6
- package/dist/view/shaders/quad.d.ts +16 -12
- package/dist/view/shaders/quad.js +34 -13
- package/dist/view/style-rule.d.ts +5 -42
- package/dist/view/style-rule.js +20 -44
- package/dist/view/terrain/binding.d.ts +1 -0
- package/dist/view/terrain/binding.js +29 -0
- package/dist/view/terrain/context.d.ts +3 -4
- package/dist/view/terrain/context.js +4 -5
- package/dist/view/terrain/drape/geometry.js +1 -1
- package/dist/view/terrain/drape/pass.d.ts +1 -1
- package/dist/view/terrain/drape/pass.js +8 -7
- package/dist/view/terrain/polygon.d.ts +9 -5
- package/dist/view/terrain/polygon.js +16 -2
- package/dist/view/terrain/state.d.ts +1 -1
- package/dist/view/terrain/state.js +1 -1
- package/dist/view/terrain/tessellation.d.ts +2 -2
- package/dist/view/terrain/tessellation.js +1 -1
- package/dist/view/ui/auxiliary-handles.d.ts +6 -29
- package/dist/view/ui/bounds.js +8 -12
- package/dist/view/ui/handle-test.js +2 -2
- package/dist/view/ui/handle-thinning.js +17 -17
- package/dist/view/ui/handles.js +21 -13
- package/dist/view/ui/helper.d.ts +1 -1
- package/dist/view/ui/helper.js +1 -1
- package/dist/view/ui/index.d.ts +1 -1
- package/dist/view/ui/selection-scope.js +4 -2
- package/dist/view/ui/selection-ui/bounding-box.js +6 -6
- package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
- package/dist/view/ui/selection-ui/extension-registry.js +70 -7
- package/dist/view/ui/selection-ui/index.d.ts +2 -2
- package/dist/view/ui/selection-ui/index.js +1 -1
- package/dist/view/ui/selection-ui/renderer.js +15 -38
- package/dist/view/ui/selection-ui/types.d.ts +17 -2
- package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
- package/dist/view/ui/selection-ui-drawer.js +63 -2
- package/dist/view/ui/tentative.js +1 -1
- package/dist/webgl/index.d.ts +65 -0
- package/dist/webgl/index.js +62 -0
- package/package.json +20 -9
- package/dist/api/api.d.ts +0 -1259
- package/dist/api/api.js +0 -86
- package/dist/api/context.d.ts +0 -173
- package/dist/api/display-api.js +0 -23
- package/dist/api/event-api.d.ts +0 -13
- package/dist/api/event-api.js +0 -17
- package/dist/api/extension-api.d.ts +0 -46
- package/dist/api/extension-api.js +0 -85
- package/dist/api/feature-api.d.ts +0 -11
- package/dist/api/feature-api.js +0 -101
- package/dist/api/geometry/apply.d.ts +0 -51
- package/dist/api/geometry/boolean.d.ts +0 -28
- package/dist/api/geometry/boolean.js +0 -65
- package/dist/api/geometry/types.d.ts +0 -31
- package/dist/api/geometry-operations.d.ts +0 -162
- package/dist/api/geometry-operations.js +0 -94
- package/dist/api/group-api.d.ts +0 -10
- package/dist/api/group-api.js +0 -78
- package/dist/api/import-export/constants.d.ts +0 -29
- package/dist/api/import-export/constants.js +0 -40
- package/dist/api/import-export/file-name.d.ts +0 -10
- package/dist/api/import-export/file-name.js +0 -20
- package/dist/api/import-export/geojson-export.d.ts +0 -19
- package/dist/api/import-export/image-import.d.ts +0 -12
- package/dist/api/import-export/image-import.js +0 -53
- package/dist/api/import-export/index.d.ts +0 -9
- package/dist/api/import-export/index.js +0 -107
- package/dist/api/import-export/native-format.d.ts +0 -15
- package/dist/api/import-export/style-validation.d.ts +0 -27
- package/dist/api/import-export/style-validation.js +0 -49
- package/dist/api/import-export/types.d.ts +0 -26
- package/dist/api/index.d.ts +0 -15
- package/dist/api/index.js +0 -3
- package/dist/api/input-api.d.ts +0 -158
- package/dist/api/input-api.js +0 -144
- package/dist/api/instance-api.d.ts +0 -38
- package/dist/api/instance-api.js +0 -136
- package/dist/api/layer-api.d.ts +0 -12
- package/dist/api/layer-api.js +0 -62
- package/dist/api/selection-api.d.ts +0 -7
- package/dist/api/selection-api.js +0 -78
- package/dist/api/snapping-api.d.ts +0 -125
- package/dist/api/snapping-api.js +0 -50
- package/dist/api/topology-api.d.ts +0 -30
- package/dist/api/topology-api.js +0 -16
- package/dist/api/tracing-api.d.ts +0 -31
- package/dist/api/tracing-api.js +0 -16
- package/dist/dispatcher/hit-test/index.d.ts +0 -14
- package/dist/dispatcher/hit-test/index.js +0 -9
- package/dist/dispatcher/index.d.ts +0 -15
- package/dist/dispatcher/index.js +0 -3
- package/dist/display/columnar/index.d.ts +0 -12
- package/dist/display/columnar/index.js +0 -13
- package/dist/display/columnar/prepare.d.ts +0 -42
- package/dist/display/columnar/prepare.js +0 -116
- package/dist/display/index.d.ts +0 -13
- package/dist/display/types.js +0 -43
- package/dist/maplibre-gl-draw.d.ts +0 -47
- package/dist/modes/cursor.js +0 -72
- package/dist/modes/index.d.ts +0 -7
- package/dist/operations/index.d.ts +0 -9
- package/dist/operations/index.js +0 -3
- package/dist/plugins/index.d.ts +0 -10
- package/dist/plugins/mutation-hooks.d.ts +0 -28
- package/dist/plugins/mutation-hooks.js +0 -84
- package/dist/plugins/plugin-context.js +0 -367
- package/dist/plugins/plugin-manager.d.ts +0 -103
- package/dist/plugins/plugin-manager.js +0 -316
- package/dist/plugins/plugin.d.ts +0 -529
- package/dist/shared/config/index.d.ts +0 -17
- package/dist/shared/config/index.js +0 -8
- package/dist/shared/utils/index.d.ts +0 -15
- package/dist/shared/utils/index.js +0 -24
- package/dist/snapping/index.d.ts +0 -14
- package/dist/snapping/index.js +0 -4
- package/dist/store/change-merger.js +0 -102
- package/dist/store/event-bridge.js +0 -161
- package/dist/store/index.d.ts +0 -12
- package/dist/store/index.js +0 -4
- package/dist/view/index.d.ts +0 -47
- package/dist/view/index.js +0 -20
- /package/dist/api/{geometry/types.js → datasets.js} +0 -0
- /package/dist/api/{import-export/types.js → document.js} +0 -0
- /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
- /package/dist/{display/index.js → api/events.js} +0 -0
- /package/dist/{modes/index.js → api/extension/context.js} +0 -0
- /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
- /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
- /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
- /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
- /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
- /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
- /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
- /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
- /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
- /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
- /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
- /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
- /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
- /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
- /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
- /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
- /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
- /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
- /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
- /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
- /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
- /package/dist/{display → dataset}/chunk-set.js +0 -0
- /package/dist/{display → dataset}/dataset.d.ts +0 -0
- /package/dist/{display → dataset}/manager.js +0 -0
- /package/dist/{display → dataset}/provider.js +0 -0
- /package/dist/{display → dataset}/selection.d.ts +0 -0
- /package/dist/{display → dataset}/selection.js +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The state of this client: the mode, the selection, the vertex selection, the snapping
|
|
3
|
+
* result, the stacking order and the terrain diagnostics
|
|
4
|
+
*/
|
|
5
|
+
import type { Position } from 'geojson';
|
|
6
|
+
/** The names of the built-in modes. */
|
|
7
|
+
export declare const MODES: readonly ["select", "draw_point", "draw_line", "draw_polygon", "draw_image", "draw_circle", "draw_freehand"];
|
|
8
|
+
/**
|
|
9
|
+
* The name of a mode: how the input is received. One of {@link MODES}, or the name of a mode
|
|
10
|
+
* added with `draw.extensions.modes.add`.
|
|
11
|
+
*/
|
|
12
|
+
export type Mode = (typeof MODES)[number] | (string & {});
|
|
13
|
+
/** What the selection holds: features, groups or layers. */
|
|
14
|
+
export type SelectionType = 'feature' | 'group' | 'layer';
|
|
15
|
+
/** What this client has selected: the type and the IDs. The selection holds one type at a time. */
|
|
16
|
+
export interface Selection {
|
|
17
|
+
/** The type of the selected items, or `null` when nothing is selected */
|
|
18
|
+
type: SelectionType | null;
|
|
19
|
+
/** The IDs of the selected items */
|
|
20
|
+
ids: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A vertex of a feature, as the part, the ring and the index within the ring.
|
|
24
|
+
*/
|
|
25
|
+
export interface VertexRef {
|
|
26
|
+
/** The part of a Multi geometry; 0 when it is left out */
|
|
27
|
+
part?: number;
|
|
28
|
+
/** The ring of a polygon, 0 for the outer ring; 0 for lines and points */
|
|
29
|
+
ring: number;
|
|
30
|
+
/** The index of the vertex within the ring */
|
|
31
|
+
index: number;
|
|
32
|
+
}
|
|
33
|
+
/** The selected vertices of one feature. */
|
|
34
|
+
export interface VertexSelection {
|
|
35
|
+
/** The ID of the feature */
|
|
36
|
+
featureId: string;
|
|
37
|
+
/** The selected vertices */
|
|
38
|
+
vertices: readonly VertexRef[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Where the pointer snapped to. When nothing was snapped to, `lngLat` is the position of the
|
|
42
|
+
* pointer and `target` is absent.
|
|
43
|
+
*/
|
|
44
|
+
export interface SnapResult {
|
|
45
|
+
/** The position after snapping */
|
|
46
|
+
lngLat: Position;
|
|
47
|
+
/** What was snapped to */
|
|
48
|
+
target?: {
|
|
49
|
+
/**
|
|
50
|
+
* The kind of the target; a kind of its own that a snap provider gave its candidate is
|
|
51
|
+
* kept as it is
|
|
52
|
+
*/
|
|
53
|
+
kind: 'vertex' | 'edge' | 'intersection' | 'guide' | (string & {});
|
|
54
|
+
/** The ID of the feature, for a target of the document */
|
|
55
|
+
featureId?: string;
|
|
56
|
+
/** The ID of the dataset, for a target of a dataset */
|
|
57
|
+
datasetId?: string;
|
|
58
|
+
/** A description to show */
|
|
59
|
+
description?: string;
|
|
60
|
+
/** The vertex, for a vertex target */
|
|
61
|
+
vertex?: VertexRef;
|
|
62
|
+
/** The segment, for an edge or a guide */
|
|
63
|
+
segment?: {
|
|
64
|
+
start: Position;
|
|
65
|
+
end: Position;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* How a mode wants the positions of its input snapped, as `ModeHandler.snapPreference` declares
|
|
71
|
+
* it. It is read before every input is snapped, so a mode whose preference changes
|
|
72
|
+
* while it draws declares it as a getter.
|
|
73
|
+
*/
|
|
74
|
+
export interface SnapPreference {
|
|
75
|
+
/**
|
|
76
|
+
* The feature to prefer when snapping candidates are at the same distance, such as the
|
|
77
|
+
* boundary a trace started along; none when it is left out or `null`
|
|
78
|
+
*/
|
|
79
|
+
prefer?: {
|
|
80
|
+
featureId: string;
|
|
81
|
+
datasetId?: string;
|
|
82
|
+
} | null;
|
|
83
|
+
/**
|
|
84
|
+
* The inputs whose position is not snapped, by the name of their receiver; every input is
|
|
85
|
+
* snapped when it is left out. A stroke drawn by dragging leaves out `onDrag`, so that its
|
|
86
|
+
* inner points follow the pointer while its ends still snap.
|
|
87
|
+
*/
|
|
88
|
+
unsnapped?: readonly ('onClick' | 'onPointerMove' | 'onDragStart' | 'onDrag' | 'onDragEnd')[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* One division of the stacking order: the map layer that draws one run of the layer order
|
|
92
|
+
* between two entries that come from outside the document.
|
|
93
|
+
*/
|
|
94
|
+
export interface LayerStackEntry {
|
|
95
|
+
/** The ID of the map layer that draws the run */
|
|
96
|
+
readonly layerId: string;
|
|
97
|
+
/** The index in the layer order where the run starts (inclusive) */
|
|
98
|
+
readonly from: number;
|
|
99
|
+
/** The index in the layer order where the run ends (exclusive) */
|
|
100
|
+
readonly to: number;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The state the terrain was drawn with, for diagnostics. Its fields follow the drawing and
|
|
104
|
+
* carry a weaker promise than the rest of the API.
|
|
105
|
+
*/
|
|
106
|
+
export interface TerrainDiagnostics {
|
|
107
|
+
/** The terrain state of the last drawing */
|
|
108
|
+
readonly render: {
|
|
109
|
+
/** Whether the terrain was on and its elevation data usable */
|
|
110
|
+
readonly active: boolean;
|
|
111
|
+
/** The Mercator rectangle the elevation data covers, `[x0, y0, 1 / width, 1 / height]` */
|
|
112
|
+
readonly atlasRect: readonly [number, number, number, number];
|
|
113
|
+
/** The size of the elevation data in texels, `[width, height]` */
|
|
114
|
+
readonly atlasSize: readonly [number, number];
|
|
115
|
+
/** The factor from meters to Mercator z at the latitude of the center of the screen */
|
|
116
|
+
readonly elevationScale: number;
|
|
117
|
+
/** The lift above the ground in meters */
|
|
118
|
+
readonly liftMeters: number;
|
|
119
|
+
/** The subdivision step in meters (0 means no subdivision) */
|
|
120
|
+
readonly stepMeters: number;
|
|
121
|
+
/** The grid spacing of the subdivision, in Mercator units */
|
|
122
|
+
readonly stepGrid: number;
|
|
123
|
+
/** The generation of the subdivision; it counts the changes of the step */
|
|
124
|
+
readonly generation: number;
|
|
125
|
+
};
|
|
126
|
+
/** How the areas were laid on the terrain in the last drawing */
|
|
127
|
+
readonly drape: {
|
|
128
|
+
/** Whether the analytic drape was used */
|
|
129
|
+
readonly used: boolean;
|
|
130
|
+
/** Why it was not used */
|
|
131
|
+
readonly reason: string;
|
|
132
|
+
/** The number of features laid on the drape */
|
|
133
|
+
readonly featureCount: number;
|
|
134
|
+
/** The number of edges */
|
|
135
|
+
readonly edgeCount: number;
|
|
136
|
+
/** The number of tiles drawn */
|
|
137
|
+
readonly tileCount: number;
|
|
138
|
+
/** The largest number of runs in one cell */
|
|
139
|
+
readonly maxRunsPerCell: number;
|
|
140
|
+
/** The largest number of edges in one cell */
|
|
141
|
+
readonly maxEdgesPerCell: number;
|
|
142
|
+
/** The largest number of edges in one tile of the view */
|
|
143
|
+
readonly maxTileEdges: number;
|
|
144
|
+
/** The number of cells cut short for going over the budget */
|
|
145
|
+
readonly truncatedCells: number;
|
|
146
|
+
/** The number of tiles that could not be evaluated and were not drawn */
|
|
147
|
+
readonly unfitTiles: number;
|
|
148
|
+
/** The number of runs whose cell origin was inside the feature */
|
|
149
|
+
readonly insideRuns: number;
|
|
150
|
+
/** The number of features left off the drape */
|
|
151
|
+
readonly excluded: number;
|
|
152
|
+
/** The number of features drawn without the drape */
|
|
153
|
+
readonly immediate: number;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** The names of the built-in modes. */
|
|
4
|
+
export const MODES = [
|
|
5
|
+
'select',
|
|
6
|
+
'draw_point',
|
|
7
|
+
'draw_line',
|
|
8
|
+
'draw_polygon',
|
|
9
|
+
'draw_image',
|
|
10
|
+
'draw_circle',
|
|
11
|
+
'draw_freehand',
|
|
12
|
+
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from '
|
|
1
|
+
export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from '../table/partition.js';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { coordinatesOf } from '../shared/utils/coordinates.js';
|
|
3
4
|
import { getBoundingBox } from '../shared/utils/feature-bbox.js';
|
|
4
|
-
import { CHUNK_TARGET_SIZE, partitionRows } from '
|
|
5
|
-
export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from '
|
|
5
|
+
import { CHUNK_TARGET_SIZE, partitionRows } from '../table/partition.js';
|
|
6
|
+
export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from '../table/partition.js';
|
|
6
7
|
/**
|
|
7
8
|
* Whether two bboxes intersect
|
|
8
9
|
*
|
|
@@ -17,7 +18,7 @@ export function boundsIntersect(a, b) {
|
|
|
17
18
|
* @internal
|
|
18
19
|
*/
|
|
19
20
|
export function countVertices(feature) {
|
|
20
|
-
const geometry = feature;
|
|
21
|
+
const geometry = { type: feature.type, coordinates: coordinatesOf(feature) };
|
|
21
22
|
const walk = (value, depth) => {
|
|
22
23
|
if (!Array.isArray(value))
|
|
23
24
|
return 0;
|
|
@@ -4,11 +4,11 @@ import { DEFAULT_FEATURE_STYLE_CONFIG } from '../shared/config/feature-style.js'
|
|
|
4
4
|
import { sanitizeDrawFactors } from '../view/renderers/draw-factors.js';
|
|
5
5
|
import { TerrainContext } from '../view/terrain/context.js';
|
|
6
6
|
import { DisplayChunkSet } from './chunk-set.js';
|
|
7
|
-
import { ColumnarSource } from './columnar/source.js';
|
|
8
7
|
import { DisplayProviderLoader } from './provider.js';
|
|
9
8
|
import { drawSelectionHighlight, hitTestDisplayFeatures, sameFeatureIds, } from './selection.js';
|
|
10
9
|
import { FeatureArraySource } from './source.js';
|
|
11
10
|
import { DisplayFeatureStyler } from './style.js';
|
|
11
|
+
import { TableSource } from './table-source.js';
|
|
12
12
|
import { CollisionThinningState, pointMarkerRadiusPx } from './thinning.js';
|
|
13
13
|
import { normalizeDisplayFeature } from './types.js';
|
|
14
14
|
// The importers of these moved names keep their path (the definitions live in the parts)
|
|
@@ -218,12 +218,9 @@ export class DatasetImpl {
|
|
|
218
218
|
writable: true,
|
|
219
219
|
value: (feature) => feature.type === 'Point' && this.externalPointRender?.(feature) === true
|
|
220
220
|
});
|
|
221
|
-
const given = [options.
|
|
221
|
+
const given = [options.rows, options.table, options.provider].filter((input) => input !== undefined);
|
|
222
222
|
if (given.length > 1) {
|
|
223
|
-
throw new Error(`Dataset "${options.id}": only one of
|
|
224
|
-
}
|
|
225
|
-
if (options.prepared && !options.columnar) {
|
|
226
|
-
throw new Error(`Dataset "${options.id}": prepared is given without columnar`);
|
|
223
|
+
throw new Error(`Dataset "${options.id}": only one of rows, table and provider can be given`);
|
|
227
224
|
}
|
|
228
225
|
this.id = options.id;
|
|
229
226
|
this.currentOrder = options.order ?? 'below-store';
|
|
@@ -267,11 +264,11 @@ export class DatasetImpl {
|
|
|
267
264
|
},
|
|
268
265
|
})
|
|
269
266
|
: null;
|
|
270
|
-
if (options.
|
|
271
|
-
this.
|
|
267
|
+
if (options.rows) {
|
|
268
|
+
this.setRows(options.rows);
|
|
272
269
|
}
|
|
273
|
-
else if (options.
|
|
274
|
-
this.
|
|
270
|
+
else if (options.table) {
|
|
271
|
+
this.setTable(options.table);
|
|
275
272
|
}
|
|
276
273
|
}
|
|
277
274
|
/** Draw order (the current side) */
|
|
@@ -307,12 +304,12 @@ export class DatasetImpl {
|
|
|
307
304
|
this.emit('change', { reason: 'visibility' });
|
|
308
305
|
this.deps.requestRepaint();
|
|
309
306
|
}
|
|
310
|
-
|
|
311
|
-
this.applySource(new FeatureArraySource(
|
|
307
|
+
setRows(rows) {
|
|
308
|
+
this.applySource(new FeatureArraySource(rows.map(normalizeDisplayFeature)));
|
|
312
309
|
this.deps.requestRepaint();
|
|
313
310
|
}
|
|
314
|
-
|
|
315
|
-
this.applySource(new
|
|
311
|
+
setTable(table) {
|
|
312
|
+
this.applySource(new TableSource(table));
|
|
316
313
|
this.deps.requestRepaint();
|
|
317
314
|
}
|
|
318
315
|
setStyleRule(rule) {
|
|
@@ -472,7 +469,7 @@ export class DatasetImpl {
|
|
|
472
469
|
const source = this.source;
|
|
473
470
|
// A table of points has nothing for it (and its rows are not built into features for
|
|
474
471
|
// nothing)
|
|
475
|
-
if (source instanceof
|
|
472
|
+
if (source instanceof TableSource && source.table.onlyPoints)
|
|
476
473
|
return [];
|
|
477
474
|
const features = [];
|
|
478
475
|
for (let row = 0; row < source.length; row++) {
|
|
@@ -515,10 +512,10 @@ export class DatasetImpl {
|
|
|
515
512
|
// hidden rows)
|
|
516
513
|
return source.index.searchWhere(bounds, (row) => thinning.isDrawnRow(row) && source.thinningRole(row) !== 'skip');
|
|
517
514
|
}
|
|
518
|
-
|
|
519
|
-
if (!this.hasRow(
|
|
520
|
-
return
|
|
521
|
-
return this.styler.prepareIfStyled(this.source.featureAt(
|
|
515
|
+
getRow(index) {
|
|
516
|
+
if (!this.hasRow(index))
|
|
517
|
+
return undefined;
|
|
518
|
+
return this.styler.prepareIfStyled(this.source.featureAt(index));
|
|
522
519
|
}
|
|
523
520
|
getRowId(row) {
|
|
524
521
|
return this.hasRow(row) ? this.source.idOf(row) : null;
|
|
@@ -731,8 +728,8 @@ export class DatasetImpl {
|
|
|
731
728
|
/**
|
|
732
729
|
* Applies new contents (the chunks, the index and the caches come with them)
|
|
733
730
|
*
|
|
734
|
-
* The only triggers for rebuilding the retained batches are this path (
|
|
735
|
-
*
|
|
731
|
+
* The only triggers for rebuilding the retained batches are this path (setRows,
|
|
732
|
+
* setTable and applying a provider result) and setStyleRule / setBaseStyle.
|
|
736
733
|
*/
|
|
737
734
|
applySource(source) {
|
|
738
735
|
this.source = source;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -13,7 +13,10 @@ export function createDisplayInteractions(deps) {
|
|
|
13
13
|
function toCoordinate(event) {
|
|
14
14
|
return [event.lngLat.lng, event.lngLat.lat];
|
|
15
15
|
}
|
|
16
|
-
function
|
|
16
|
+
function toPoint(event) {
|
|
17
|
+
return { x: event.point.x, y: event.point.y };
|
|
18
|
+
}
|
|
19
|
+
function clearHover(lngLat, point) {
|
|
17
20
|
if (hoveredDatasetId === null)
|
|
18
21
|
return;
|
|
19
22
|
const previous = manager.getInternal(hoveredDatasetId);
|
|
@@ -21,7 +24,7 @@ export function createDisplayInteractions(deps) {
|
|
|
21
24
|
hoveredDatasetId = null;
|
|
22
25
|
hoveredFeatureId = null;
|
|
23
26
|
// Report with feature: null that it left the target
|
|
24
|
-
previous?.emit('hover', { datasetId, feature: null, row: null, lngLat });
|
|
27
|
+
previous?.emit('hover', { datasetId, feature: null, row: null, lngLat, point });
|
|
25
28
|
}
|
|
26
29
|
return {
|
|
27
30
|
handleClick(event) {
|
|
@@ -44,35 +47,43 @@ export function createDisplayInteractions(deps) {
|
|
|
44
47
|
feature: top.feature,
|
|
45
48
|
row,
|
|
46
49
|
lngLat: coordinate,
|
|
50
|
+
point: toPoint(event),
|
|
47
51
|
});
|
|
48
52
|
notifyClick?.({
|
|
49
53
|
datasetId: top.dataset.id,
|
|
50
54
|
feature: top.feature,
|
|
51
55
|
row,
|
|
52
56
|
lngLat: coordinate,
|
|
57
|
+
point: toPoint(event),
|
|
53
58
|
});
|
|
54
59
|
return;
|
|
55
60
|
}
|
|
56
61
|
// Nothing was there, or a non-interactive dataset merely blocked it: it is reported as
|
|
57
62
|
// a no-hit (the source of "click on empty space to deselect" on the host side)
|
|
58
|
-
notifyClick?.({
|
|
63
|
+
notifyClick?.({
|
|
64
|
+
datasetId: null,
|
|
65
|
+
feature: null,
|
|
66
|
+
row: null,
|
|
67
|
+
lngLat: coordinate,
|
|
68
|
+
point: toPoint(event),
|
|
69
|
+
});
|
|
59
70
|
},
|
|
60
71
|
handleMouseMove(event) {
|
|
61
72
|
const coordinate = toCoordinate(event);
|
|
62
73
|
if (!manager.hasAny()) {
|
|
63
|
-
clearHover(coordinate);
|
|
74
|
+
clearHover(coordinate, toPoint(event));
|
|
64
75
|
return;
|
|
65
76
|
}
|
|
66
77
|
const top = hitTestTopmost(event);
|
|
67
78
|
if (top?.kind !== 'dataset' || !top.feature) {
|
|
68
|
-
clearHover(coordinate);
|
|
79
|
+
clearHover(coordinate, toPoint(event));
|
|
69
80
|
return;
|
|
70
81
|
}
|
|
71
82
|
if (top.dataset.id === hoveredDatasetId && top.feature.id === hoveredFeatureId) {
|
|
72
83
|
// Nothing fires while the pointer only moves over the same feature
|
|
73
84
|
return;
|
|
74
85
|
}
|
|
75
|
-
clearHover(coordinate);
|
|
86
|
+
clearHover(coordinate, toPoint(event));
|
|
76
87
|
hoveredDatasetId = top.dataset.id;
|
|
77
88
|
hoveredFeatureId = top.feature.id;
|
|
78
89
|
manager.getInternal(top.dataset.id)?.emit('hover', {
|
|
@@ -80,6 +91,7 @@ export function createDisplayInteractions(deps) {
|
|
|
80
91
|
feature: top.feature,
|
|
81
92
|
row: top.row ?? null,
|
|
82
93
|
lngLat: coordinate,
|
|
94
|
+
point: toPoint(event),
|
|
83
95
|
});
|
|
84
96
|
},
|
|
85
97
|
reset() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -4,7 +4,7 @@ import type { RetainedRendererSet } from '../view/renderers/retained.js';
|
|
|
4
4
|
*
|
|
5
5
|
* What cannot be finished in one frame is advanced by the budget of the frame and handed on. The
|
|
6
6
|
* caller keeps drawing the batches of the previous version until it is finished
|
|
7
|
-
* (`
|
|
7
|
+
* (`dataset/chunk-set.ts`). It is built the same way as the one-shot build
|
|
8
8
|
* (`buildChunkBatches`); only the unit of bundling differs.
|
|
9
9
|
*/
|
|
10
10
|
export interface ChunkBuildJob {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
3
|
import { generateCirclePolygon } from '../shared/math/index.js';
|
|
4
|
+
import { coordinatesOf } from '../shared/utils/coordinates.js';
|
|
4
5
|
import { getCircleRadius, getCreatedZoom } from '../shared/utils/property.js';
|
|
5
6
|
import { toLineBatchItem, toPointInstanceData } from '../view/renderers/batch-manager.js';
|
|
6
7
|
import { NEUTRAL_DRAW_FACTORS } from '../view/renderers/draw-factors.js';
|
|
@@ -741,29 +742,29 @@ export function collectFeature(feature, draft, styles, isExternallyRenderedPoint
|
|
|
741
742
|
const skipSolid = skipDrapedFills && isDrapedGeometry(feature);
|
|
742
743
|
switch (feature.type) {
|
|
743
744
|
case 'Point':
|
|
744
|
-
collectPoint(feature, feature
|
|
745
|
+
collectPoint(feature, coordinatesOf(feature), draft, styles, isExternallyRenderedPoint);
|
|
745
746
|
return;
|
|
746
747
|
case 'MultiPoint':
|
|
747
748
|
// Whether the predicate applies to Point alone is up to the predicate itself (the test is
|
|
748
749
|
// in one place)
|
|
749
|
-
for (const coord of feature
|
|
750
|
+
for (const coord of coordinatesOf(feature)) {
|
|
750
751
|
collectPoint(feature, coord, draft, styles, isExternallyRenderedPoint);
|
|
751
752
|
}
|
|
752
753
|
return;
|
|
753
754
|
case 'LineString':
|
|
754
755
|
case 'Freehand':
|
|
755
|
-
collectLine(feature, feature
|
|
756
|
+
collectLine(feature, coordinatesOf(feature), draft, styles, skipSolid);
|
|
756
757
|
return;
|
|
757
758
|
case 'MultiLineString':
|
|
758
|
-
for (const coords of feature
|
|
759
|
+
for (const coords of coordinatesOf(feature)) {
|
|
759
760
|
collectLine(feature, coords, draft, styles, skipSolid);
|
|
760
761
|
}
|
|
761
762
|
return;
|
|
762
763
|
case 'Polygon':
|
|
763
|
-
collectPolygon(feature, feature
|
|
764
|
+
collectPolygon(feature, coordinatesOf(feature), draft, styles, 0, skipSolid);
|
|
764
765
|
return;
|
|
765
766
|
case 'MultiPolygon': {
|
|
766
|
-
const parts = feature
|
|
767
|
+
const parts = coordinatesOf(feature);
|
|
767
768
|
for (let i = 0; i < parts.length; i++) {
|
|
768
769
|
collectPolygon(feature, parts[i], draft, styles, i, skipSolid);
|
|
769
770
|
}
|
|
@@ -773,7 +774,7 @@ export function collectFeature(feature, draft, styles, isExternallyRenderedPoint
|
|
|
773
774
|
const radiusMeters = getCircleRadius(feature);
|
|
774
775
|
if (!radiusMeters || radiusMeters <= 0)
|
|
775
776
|
return;
|
|
776
|
-
const center = feature
|
|
777
|
+
const center = coordinatesOf(feature);
|
|
777
778
|
collectPolygon(feature, [generateCirclePolygon(center, radiusMeters)], draft, styles);
|
|
778
779
|
return;
|
|
779
780
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { coordinatesOf } from '../shared/utils/coordinates.js';
|
|
4
|
+
import { chunkTargetSizeFor } from '../table/partition.js';
|
|
3
5
|
import { computeFeatureBounds, partitionIntoChunks } from './chunk.js';
|
|
4
|
-
import { chunkTargetSizeFor } from './partition.js';
|
|
5
6
|
import { collectFeatures } from './retained.js';
|
|
6
7
|
import { maxStylePointRadiusOf } from './selection.js';
|
|
7
8
|
import { DisplaySpatialIndex } from './spatial.js';
|
|
@@ -59,6 +60,13 @@ export class FeatureArraySource {
|
|
|
59
60
|
writable: true,
|
|
60
61
|
value: null
|
|
61
62
|
});
|
|
63
|
+
/** The features of the rows with a geometry, found on the first request */
|
|
64
|
+
Object.defineProperty(this, "withGeometry", {
|
|
65
|
+
enumerable: true,
|
|
66
|
+
configurable: true,
|
|
67
|
+
writable: true,
|
|
68
|
+
value: null
|
|
69
|
+
});
|
|
62
70
|
this.length = list.length;
|
|
63
71
|
// The bboxes are shared by the spatial index and the chunk splitting (not computed twice)
|
|
64
72
|
this.bounds = computeFeatureBounds(list);
|
|
@@ -83,7 +91,7 @@ export class FeatureArraySource {
|
|
|
83
91
|
if (ids.size === 0)
|
|
84
92
|
return rows;
|
|
85
93
|
for (let row = 0; row < this.list.length; row++) {
|
|
86
|
-
if (ids.has(this.list[row].id))
|
|
94
|
+
if (ids.has(this.list[row].id) && this.hasGeometry(row))
|
|
87
95
|
rows.push(row);
|
|
88
96
|
}
|
|
89
97
|
return rows;
|
|
@@ -98,13 +106,18 @@ export class FeatureArraySource {
|
|
|
98
106
|
return this.rowById.get(id) ?? -1;
|
|
99
107
|
}
|
|
100
108
|
features() {
|
|
101
|
-
|
|
109
|
+
if (!this.withGeometry) {
|
|
110
|
+
// The rows without a geometry (NaN coordinates) are left out, as a table leaves them out
|
|
111
|
+
const all = this.list.every((_, row) => this.hasGeometry(row));
|
|
112
|
+
this.withGeometry = all ? this.list : this.list.filter((_, row) => this.hasGeometry(row));
|
|
113
|
+
}
|
|
114
|
+
return this.withGeometry;
|
|
102
115
|
}
|
|
103
116
|
thinningRole(row) {
|
|
104
117
|
return featureThinningRole(this.list[row]);
|
|
105
118
|
}
|
|
106
119
|
pointOf(row) {
|
|
107
|
-
return this.list[row]
|
|
120
|
+
return coordinatesOf(this.list[row]);
|
|
108
121
|
}
|
|
109
122
|
styleRadiusOf(row) {
|
|
110
123
|
return this.list[row].style?.pointRadius;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
import { buildPackedRTree, searchPackedRTree } from '
|
|
3
|
+
import { buildPackedRTree, searchPackedRTree } from '../table/packed-rtree.js';
|
|
4
4
|
/**
|
|
5
5
|
* Spatial index of a dataset
|
|
6
6
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -89,7 +89,7 @@ export class DisplayFeatureStyler {
|
|
|
89
89
|
const channel = getStyleRuleChannel(feature.type);
|
|
90
90
|
const ruleColor = this.styleCache.resolve(feature, this.styleRule);
|
|
91
91
|
const style = this.effectiveStyle(feature.style, ruleColor, channel);
|
|
92
|
-
const prepared = style === feature.style ? feature : { ...feature, style };
|
|
92
|
+
const prepared = style === feature.style ? feature : { ...feature, style: style ?? {} };
|
|
93
93
|
this.preparedCache.set(feature.id, prepared);
|
|
94
94
|
return prepared;
|
|
95
95
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,16 +1,38 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
2
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
/**
|
|
4
|
+
* The contents given as a table (`TableSource`)
|
|
5
|
+
*
|
|
6
|
+
* It implements the contract of `source.ts` over the typed arrays of the table. What a draw and a
|
|
7
|
+
* hit test need is read from the arrays as they are: the chunks and the spatial index come from
|
|
8
|
+
* `prepareTable` (computed in a Worker, or here when it was not given), and the rows of
|
|
9
|
+
* a chunk are packed straight into the GPU arrays. A feature is built only for a row that is
|
|
10
|
+
* asked for (a hit, the selection, `getFeatures`, the analytic drape, a row drawn in immediate
|
|
11
|
+
* mode).
|
|
12
|
+
*
|
|
13
|
+
* The styles are resolved once per geometry type and rule color, not per row: the rows have no
|
|
14
|
+
* individual style, so two rows of the same type with the same rule color look the same. The
|
|
15
|
+
* resolution goes through the same styler and the same resolver as the features, so a row looks
|
|
16
|
+
* exactly as its feature would.
|
|
17
|
+
*
|
|
18
|
+
* A row is read from the geometry column that holds it: the one column of a table of one type, or
|
|
19
|
+
* the child of a mixed geometry column that the row names, at the row within that child. Each row
|
|
20
|
+
* is collected as its type is (the decisions of `collectFeature`), so the rows of a mixed table
|
|
21
|
+
* are drawn in the order of the table whatever the order within the children.
|
|
22
|
+
*/
|
|
23
|
+
import { drawPropertyKey } from '../shared/properties.js';
|
|
24
|
+
import { geometryFromCoordinates } from '../shared/utils/coordinates.js';
|
|
25
|
+
import { isPreparedTable, prepareTable } from '../table/prepare.js';
|
|
26
|
+
import { columnValue, isDictionaryColumn, TableReader, } from '../table/table.js';
|
|
27
|
+
import { toPackedPointStyle } from '../view/renderers/batch-manager.js';
|
|
28
|
+
import { toLineInstanceColor } from '../view/renderers/line/line-geometry.js';
|
|
29
|
+
import { toInstancedPointShape } from '../view/renderers/point/point-instance.js';
|
|
30
|
+
import { evaluateStyleRuleValue, getStyleRuleChannel } from '../view/style-rule.js';
|
|
31
|
+
import { toDisplayChunks } from './chunk.js';
|
|
32
|
+
import { COLLECT_SLICE_ROWS, FIXED_WIDTH_ZOOM, isDrapedGeometry, PackedLinesBuilder, PackedPointsBuilder, pushFallback, } from './retained.js';
|
|
33
|
+
import { DisplaySpatialIndex } from './spatial.js';
|
|
12
34
|
/** The column the zoom of creation of a row is read from (the same key as on a feature) */
|
|
13
|
-
const CREATED_ZOOM_COLUMN = 'createdZoom';
|
|
35
|
+
const CREATED_ZOOM_COLUMN = drawPropertyKey('createdZoom');
|
|
14
36
|
/** The key of the slots for "no rule color" */
|
|
15
37
|
const NO_RULE_COLOR = '';
|
|
16
38
|
/** The slots of a geometry type (created on the first request) */
|
|
@@ -25,7 +47,7 @@ function slotsOfType(maps, type) {
|
|
|
25
47
|
/**
|
|
26
48
|
* The styles of the rows of a table, resolved once per geometry type and rule color
|
|
27
49
|
*/
|
|
28
|
-
class
|
|
50
|
+
class TableStyleSlots {
|
|
29
51
|
constructor(table, styler, resolver) {
|
|
30
52
|
Object.defineProperty(this, "table", {
|
|
31
53
|
enumerable: true,
|
|
@@ -150,27 +172,28 @@ class ColumnarStyleSlots {
|
|
|
150
172
|
return {
|
|
151
173
|
id: '',
|
|
152
174
|
type,
|
|
153
|
-
|
|
175
|
+
geometry: geometryFromCoordinates(type, []),
|
|
154
176
|
layerId: '',
|
|
177
|
+
groupId: undefined,
|
|
155
178
|
properties: {},
|
|
156
|
-
style: this.styler.effectiveStyle(undefined, color, getStyleRuleChannel(type)),
|
|
179
|
+
style: this.styler.effectiveStyle(undefined, color, getStyleRuleChannel(type)) ?? {},
|
|
157
180
|
locked: false,
|
|
158
181
|
visible: true,
|
|
159
182
|
};
|
|
160
183
|
}
|
|
161
184
|
}
|
|
162
185
|
/**
|
|
163
|
-
* The contents of a dataset given as a
|
|
186
|
+
* The contents of a dataset given as a table
|
|
164
187
|
*
|
|
165
188
|
* @internal
|
|
166
189
|
*/
|
|
167
|
-
export class
|
|
190
|
+
export class TableSource {
|
|
168
191
|
/**
|
|
169
|
-
* @param
|
|
170
|
-
*
|
|
171
|
-
* @throws when the table does not add up, or when
|
|
192
|
+
* @param given The table, or the result of `prepareTable` (the preparation is computed here
|
|
193
|
+
* for a bare table)
|
|
194
|
+
* @throws when the table does not add up, or when a prepared table does not match its table
|
|
172
195
|
*/
|
|
173
|
-
constructor(
|
|
196
|
+
constructor(given) {
|
|
174
197
|
Object.defineProperty(this, "table", {
|
|
175
198
|
enumerable: true,
|
|
176
199
|
configurable: true,
|
|
@@ -235,13 +258,18 @@ export class ColumnarSource {
|
|
|
235
258
|
writable: true,
|
|
236
259
|
value: null
|
|
237
260
|
});
|
|
238
|
-
|
|
261
|
+
const prepared = isPreparedTable(given) ? given : null;
|
|
262
|
+
const input = prepared ? prepared.table : given;
|
|
263
|
+
this.table = new TableReader(input);
|
|
239
264
|
this.length = this.table.length;
|
|
240
|
-
const ready = prepared ??
|
|
241
|
-
if (ready.
|
|
242
|
-
throw new Error(
|
|
265
|
+
const ready = prepared ?? prepareTable(input);
|
|
266
|
+
if (!(ready.rowBounds instanceof Float64Array) || !(ready.indexBoxes instanceof Float64Array)) {
|
|
267
|
+
throw new Error('Table: a prepared table must be made by prepareTable');
|
|
268
|
+
}
|
|
269
|
+
if (ready.length !== this.length || ready.rowBounds.length !== this.length * 4) {
|
|
270
|
+
throw new Error(`Table: the prepared table was made for ${ready.length} rows, the table has ${this.length}`);
|
|
243
271
|
}
|
|
244
|
-
this.bounds = ready.
|
|
272
|
+
this.bounds = ready.rowBounds;
|
|
245
273
|
this.chunks = toDisplayChunks({
|
|
246
274
|
rows: ready.chunkRows,
|
|
247
275
|
offsets: ready.chunkOffsets,
|
|
@@ -405,7 +433,7 @@ export class ColumnarSource {
|
|
|
405
433
|
key[0] !== context.styleKey ||
|
|
406
434
|
key[1] !== context.styler ||
|
|
407
435
|
key[2] !== resolver) {
|
|
408
|
-
this.slots = new
|
|
436
|
+
this.slots = new TableStyleSlots(this.table, context.styler, resolver);
|
|
409
437
|
this.slotsKey = [context.styleKey, context.styler, resolver];
|
|
410
438
|
}
|
|
411
439
|
return this.slots;
|