@sakuzu/maplibre-gl-draw 1.0.0 → 2.1.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 +1109 -2
- package/README.ja.md +83 -50
- package/README.md +89 -53
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/dist/api/datasets.d.ts +263 -0
- package/dist/api/document.d.ts +66 -0
- package/dist/api/draw.d.ts +137 -0
- package/dist/api/draw.js +20 -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 +316 -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 +405 -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 +423 -0
- package/dist/api/impl/extension-host.js +364 -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 +851 -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 +21 -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 +84 -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 +154 -70
- package/dist/dispatcher/normalizer.js +25 -4
- 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 +85 -0
- package/dist/geometry/geojson.js +173 -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 +66 -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 +12 -6
- package/dist/view/layer/attach.js +86 -10
- 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 +38 -15
- 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
|
@@ -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;
|
|
@@ -7,16 +7,6 @@
|
|
|
7
7
|
* polygons and MultiPoint are always drawn. The overlap is tested with the size actually drawn
|
|
8
8
|
* (the radius + the outline + `marginPx`), and the winners are picked greedily from the front
|
|
9
9
|
* of the draw order for each integer zoom band, so panning does not swap them.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```ts
|
|
13
|
-
* const places = draw.addDataset({
|
|
14
|
-
* id: 'places',
|
|
15
|
-
* features,
|
|
16
|
-
* collisionThinning: { enabled: true, fullDisplayZoom: 17, marginPx: 2 },
|
|
17
|
-
* });
|
|
18
|
-
* const { total, visible } = places.getThinningStats(); // "showing 1,200 of 50,000"
|
|
19
|
-
* ```
|
|
20
10
|
*/
|
|
21
11
|
export interface DatasetCollisionThinning {
|
|
22
12
|
/** Whether the thinning is enabled (false by default = everything is drawn as before) */
|
|
@@ -1,5 +1,6 @@
|
|
|
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
|
/**
|
|
4
5
|
* The zoom at which the thinning stops (default). At or above it every feature is drawn
|
|
5
6
|
*
|
|
@@ -476,7 +477,7 @@ export function selectCollisionWinners(input) {
|
|
|
476
477
|
const rows = {
|
|
477
478
|
length: features.length,
|
|
478
479
|
thinningRole: (row) => featureThinningRole(features[row]),
|
|
479
|
-
pointOf: (row) => features[row]
|
|
480
|
+
pointOf: (row) => coordinatesOf(features[row]),
|
|
480
481
|
styleRadiusOf: (row) => features[row].style?.pointRadius,
|
|
481
482
|
idOf: (row) => features[row].id,
|
|
482
483
|
};
|
|
@@ -498,7 +499,7 @@ export function featureThinningRole(feature) {
|
|
|
498
499
|
return 'skip';
|
|
499
500
|
if (feature.type !== 'Point')
|
|
500
501
|
return 'winner';
|
|
501
|
-
const coord = feature
|
|
502
|
+
const coord = coordinatesOf(feature);
|
|
502
503
|
if (!Array.isArray(coord) || typeof coord[0] !== 'number' || typeof coord[1] !== 'number') {
|
|
503
504
|
return 'winner';
|
|
504
505
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
Binary file
|
|
@@ -1,6 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions of the datasets
|
|
3
|
+
*
|
|
4
|
+
* It defines the types for showing large numbers of features that are not being edited, quickly
|
|
5
|
+
* and with attribute-driven styles. It is a path independent of the Store (editing, undo,
|
|
6
|
+
* events), and there is no editing API here.
|
|
7
|
+
*/
|
|
8
|
+
import type { Feature as GeoJSONFeature, Geometry as GeoJSONGeometry } from 'geojson';
|
|
1
9
|
import type { BoundingBox, Coordinate, Feature, StyleRule } from '../shared/types/model.js';
|
|
10
|
+
import type { PreparedTable, Table } from '../table/types.js';
|
|
2
11
|
import type { StyleRuleChannel } from '../view/style-rule.js';
|
|
3
|
-
import type { DatasetColumnarInput, DatasetColumnarPrepared } from './columnar/types.js';
|
|
4
12
|
import type { DatasetCollisionThinning, DatasetThinningStats, ResolvedCollisionThinning } from './thinning.js';
|
|
5
13
|
/**
|
|
6
14
|
* The default style of a dataset, per geometry channel.
|
|
@@ -14,34 +22,22 @@ import type { DatasetCollisionThinning, DatasetThinningStats, ResolvedCollisionT
|
|
|
14
22
|
*/
|
|
15
23
|
export type DatasetBaseStyle = Partial<Record<StyleRuleChannel, Feature['style']>>;
|
|
16
24
|
/**
|
|
17
|
-
* A
|
|
25
|
+
* A row passed to a dataset: a GeoJSON feature.
|
|
18
26
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* `
|
|
23
|
-
*
|
|
27
|
+
* The geometry is a GeoJSON geometry of any type but `GeometryCollection`. A null geometry (or a
|
|
28
|
+
* `GeometryCollection`) gives a row without a geometry: it keeps its place and its id but is
|
|
29
|
+
* neither drawn nor hit. Positions with a third element (an elevation) are truncated to
|
|
30
|
+
* `[lng, lat]`. The id is turned into a string with `String()` (the row number as a string when
|
|
31
|
+
* omitted) and should be unique within the dataset. The properties are what the style rule
|
|
32
|
+
* reads.
|
|
33
|
+
*
|
|
34
|
+
* Besides the members of GeoJSON, a row may carry `style`, its individual style, which wins
|
|
35
|
+
* over the rule color and the base style.
|
|
24
36
|
*/
|
|
25
|
-
export
|
|
26
|
-
/** The
|
|
27
|
-
id: string;
|
|
28
|
-
/** The geometry type, the same values as a feature of the Store */
|
|
29
|
-
type: Feature['type'];
|
|
30
|
-
/** The coordinates in `[lng, lat]` degrees, shaped as for `type` (holes and Multi included) */
|
|
31
|
-
coordinates: Feature['coordinates'];
|
|
32
|
-
/** The attributes the style rule reads (`{}` when omitted) */
|
|
33
|
-
properties?: Record<string, unknown>;
|
|
34
|
-
/** The individual style; it wins over the rule color and the base style */
|
|
37
|
+
export type DatasetRow = GeoJSONFeature<GeoJSONGeometry | null> & {
|
|
38
|
+
/** The individual style of the row; it wins over the rule color and the base style */
|
|
35
39
|
style?: Feature['style'];
|
|
36
|
-
|
|
37
|
-
layerId?: string;
|
|
38
|
-
/** The group id. Kept on the feature; the dataset does not use it */
|
|
39
|
-
groupId?: string;
|
|
40
|
-
/** The lock flag (`false` when omitted). Kept on the feature; nothing is edited here */
|
|
41
|
-
locked?: boolean;
|
|
42
|
-
/** `false` hides this feature (`true` when omitted) */
|
|
43
|
-
visible?: boolean;
|
|
44
|
-
}
|
|
40
|
+
};
|
|
45
41
|
/**
|
|
46
42
|
* Where a dataset is drawn relative to the layers of the Store.
|
|
47
43
|
*
|
|
@@ -56,7 +52,7 @@ export interface DatasetFeatureInput {
|
|
|
56
52
|
*/
|
|
57
53
|
export type DatasetOrder = 'below-store' | 'above-store' | 'layer-order';
|
|
58
54
|
/**
|
|
59
|
-
* The destination of
|
|
55
|
+
* The destination of a move of a dataset (`draw.datasets.move`): a side and a position
|
|
60
56
|
* within it.
|
|
61
57
|
*
|
|
62
58
|
* order is the side (in front of or behind the Store) and index is the position within that
|
|
@@ -77,26 +73,16 @@ export interface DatasetPlacement {
|
|
|
77
73
|
index?: number;
|
|
78
74
|
}
|
|
79
75
|
/**
|
|
80
|
-
* Fetches the
|
|
76
|
+
* Fetches the rows of a dataset for the displayed range.
|
|
81
77
|
*
|
|
82
78
|
* It is called, debounced by 200 ms, when the displayed range changes. `bbox` is the range in
|
|
83
79
|
* degrees rounded out to the boundaries of the tiles at the integer zoom, and `zoom` is the
|
|
84
80
|
* zoom at the time of the call. A result is cached per rounded range, so a small pan or zoom
|
|
85
81
|
* causes no call; {@link Dataset.invalidateProviderCache} discards the cache. Only
|
|
86
82
|
* the result of the last request is applied, and a rejected promise is logged with
|
|
87
|
-
* `console.error` and leaves the
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* ```ts
|
|
91
|
-
* const provider: DatasetFeatureProvider = async (bbox, zoom) => {
|
|
92
|
-
* const url = `/api/parcels?bbox=${bbox.minX},${bbox.minY},${bbox.maxX},${bbox.maxY}&z=${zoom}`;
|
|
93
|
-
* const response = await fetch(url);
|
|
94
|
-
* return response.json(); // DatasetFeatureInput[]
|
|
95
|
-
* };
|
|
96
|
-
* draw.addDataset({ id: 'parcels', provider });
|
|
97
|
-
* ```
|
|
83
|
+
* `console.error` and leaves the rows shown as they are.
|
|
98
84
|
*/
|
|
99
|
-
export type DatasetFeatureProvider = (bbox: BoundingBox, zoom: number) => Promise<
|
|
85
|
+
export type DatasetFeatureProvider = (bbox: BoundingBox, zoom: number) => Promise<DatasetRow[]>;
|
|
100
86
|
/**
|
|
101
87
|
* Returns the size and opacity factors of a dataset for a zoom.
|
|
102
88
|
*
|
|
@@ -121,39 +107,35 @@ export type DatasetZoomScale = (zoom: number) => {
|
|
|
121
107
|
opacity: number;
|
|
122
108
|
};
|
|
123
109
|
/**
|
|
124
|
-
* The options of
|
|
110
|
+
* The options of a dataset the engine adds (`draw.datasets.add` checks and translates them).
|
|
125
111
|
*
|
|
126
|
-
* Only `id` is required. Give at most one of `
|
|
127
|
-
* columns of typed arrays) and `provider` (fetched for the displayed range).
|
|
112
|
+
* Only `id` is required. Give at most one of `rows` (static GeoJSON features), `table`
|
|
113
|
+
* (static, as columns of typed arrays) and `provider` (fetched for the displayed range).
|
|
128
114
|
*/
|
|
129
115
|
export interface DatasetOptions {
|
|
130
116
|
/**
|
|
131
117
|
* The dataset id. It must be unique among the datasets of the draw
|
|
132
|
-
* instance; a duplicate makes
|
|
118
|
+
* instance; a duplicate makes the addition throw. With `order: 'layer-order'` it is
|
|
133
119
|
* also the id placed in the layer order of the Store
|
|
134
120
|
*/
|
|
135
121
|
id: string;
|
|
136
122
|
/**
|
|
137
|
-
* The static features, drawn in array order (the last in front). Cannot be
|
|
138
|
-
* with `
|
|
139
|
-
* {@link Dataset.
|
|
123
|
+
* The static rows as GeoJSON features, drawn in array order (the last in front). Cannot be
|
|
124
|
+
* given together with `table` or `provider` (it throws). Replace them later with
|
|
125
|
+
* {@link Dataset.setRows}
|
|
140
126
|
*/
|
|
141
|
-
|
|
127
|
+
rows?: readonly DatasetRow[];
|
|
142
128
|
/**
|
|
143
|
-
* The static rows as
|
|
144
|
-
* fast way in for a large table, read in a Worker if need be.
|
|
145
|
-
*
|
|
146
|
-
*
|
|
129
|
+
* The static rows as a table (from `@sakuzu/maplibre-gl-draw/table`), drawn in row order (the
|
|
130
|
+
* last in front); the fast way in for a large table, read in a Worker if need be. A table
|
|
131
|
+
* prepared with `prepareTable` is taken as it is, and the dataset computes none of the
|
|
132
|
+
* preparation on the main thread. Cannot be given together with `rows` or `provider` (it
|
|
133
|
+
* throws). Replace it later with {@link Dataset.setTable}
|
|
147
134
|
*/
|
|
148
|
-
|
|
135
|
+
table?: Table | PreparedTable;
|
|
149
136
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*/
|
|
153
|
-
prepared?: DatasetColumnarPrepared;
|
|
154
|
-
/**
|
|
155
|
-
* Fetches the features for the displayed range. Cannot be given together with `features` or
|
|
156
|
-
* `columnar` (it throws)
|
|
137
|
+
* Fetches the rows for the displayed range. Cannot be given together with `rows` or `table`
|
|
138
|
+
* (it throws)
|
|
157
139
|
*/
|
|
158
140
|
provider?: DatasetFeatureProvider;
|
|
159
141
|
/**
|
|
@@ -205,13 +187,18 @@ export interface DatasetClickPayload {
|
|
|
205
187
|
/** The feature that was hit, as normalized by the dataset */
|
|
206
188
|
feature: Feature;
|
|
207
189
|
/**
|
|
208
|
-
* The row of the feature: its index in the
|
|
209
|
-
*
|
|
190
|
+
* The row of the feature: its index in the rows given to the dataset (or in the result of
|
|
191
|
+
* the provider), or its row in the table. A host that keeps its own columns reads
|
|
210
192
|
* the values of the row from them
|
|
211
193
|
*/
|
|
212
194
|
row: number;
|
|
213
195
|
/** The clicked position `[lng, lat]` in degrees */
|
|
214
196
|
lngLat: Coordinate;
|
|
197
|
+
/** The clicked point on the screen, in CSS pixels */
|
|
198
|
+
point?: {
|
|
199
|
+
x: number;
|
|
200
|
+
y: number;
|
|
201
|
+
};
|
|
215
202
|
}
|
|
216
203
|
/**
|
|
217
204
|
* The payload of the `hover` event of a {@link Dataset}.
|
|
@@ -228,6 +215,11 @@ export interface DatasetHoverPayload {
|
|
|
228
215
|
row: number | null;
|
|
229
216
|
/** The pointer position `[lng, lat]` in degrees */
|
|
230
217
|
lngLat: Coordinate;
|
|
218
|
+
/** The pointer position on the screen, in CSS pixels */
|
|
219
|
+
point?: {
|
|
220
|
+
x: number;
|
|
221
|
+
y: number;
|
|
222
|
+
};
|
|
231
223
|
}
|
|
232
224
|
/**
|
|
233
225
|
* The payload of the `change` event of a {@link Dataset}.
|
|
@@ -236,8 +228,8 @@ export interface DatasetHoverPayload {
|
|
|
236
228
|
* changed. It exists so that a host that builds another representation from the contents of a
|
|
237
229
|
* dataset, such as label rendering, gets a trigger to rebuild it.
|
|
238
230
|
*
|
|
239
|
-
* - features: the
|
|
240
|
-
*
|
|
231
|
+
* - features: the rows were replaced (setRows, setTable, or a provider result applied). The
|
|
232
|
+
* rows are new, and so are the drawn rows
|
|
241
233
|
* - style: the style rule or the base style changed (the drawn rows may have changed with it)
|
|
242
234
|
* - visibility: it was actually switched between shown and hidden
|
|
243
235
|
* - selection: the selected features actually changed
|
|
@@ -268,40 +260,10 @@ export interface DatasetEventMap {
|
|
|
268
260
|
*
|
|
269
261
|
* It is meant for overlaying tens of thousands of read-only records, such as parcels or a
|
|
270
262
|
* table of places. The features never enter the Store, so none of the following applies to
|
|
271
|
-
* them: editing, undo / redo, the
|
|
272
|
-
* `
|
|
273
|
-
* `
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
* @example
|
|
277
|
-
* ```ts
|
|
278
|
-
* const parcels = draw.addDataset({
|
|
279
|
-
* id: 'parcels',
|
|
280
|
-
* features: [
|
|
281
|
-
* {
|
|
282
|
-
* id: 'p1',
|
|
283
|
-
* type: 'Polygon',
|
|
284
|
-
* coordinates: [[[139.76, 35.68], [139.77, 35.68], [139.77, 35.69], [139.76, 35.68]]],
|
|
285
|
-
* properties: { population: 4200 },
|
|
286
|
-
* },
|
|
287
|
-
* ],
|
|
288
|
-
* styleRule: {
|
|
289
|
-
* kind: 'graduated',
|
|
290
|
-
* property: 'population',
|
|
291
|
-
* breaks: [1000, 5000],
|
|
292
|
-
* colors: ['#eff3ff', '#6baed6', '#2171b5'],
|
|
293
|
-
* other: '#cccccc',
|
|
294
|
-
* },
|
|
295
|
-
* interactive: true,
|
|
296
|
-
* });
|
|
297
|
-
*
|
|
298
|
-
* const unsubscribe = parcels.on('click', ({ feature }) => {
|
|
299
|
-
* console.log(feature.id, feature.properties);
|
|
300
|
-
* });
|
|
301
|
-
*
|
|
302
|
-
* parcels.setVisible(false); // hide without discarding the features
|
|
303
|
-
* parcels.remove(); // the same as draw.removeDataset('parcels')
|
|
304
|
-
* ```
|
|
263
|
+
* them: editing, undo / redo, the events of the features, the selection UI, and
|
|
264
|
+
* `draw.features.list()` / `draw.document`. A caller who wants to edit one copies it into the
|
|
265
|
+
* document with `draw.features.create`; the library does not relate the two. The public
|
|
266
|
+
* `Dataset` of `draw.datasets` is built on it.
|
|
305
267
|
*/
|
|
306
268
|
export interface Dataset {
|
|
307
269
|
/** The dataset id given at creation */
|
|
@@ -309,7 +271,7 @@ export interface Dataset {
|
|
|
309
271
|
/**
|
|
310
272
|
* Where it is drawn relative to the Store (the current side)
|
|
311
273
|
*
|
|
312
|
-
* When the side is changed
|
|
274
|
+
* When the side is changed by a move, this value becomes the new side.
|
|
313
275
|
*/
|
|
314
276
|
readonly order: DatasetOrder;
|
|
315
277
|
/** Whether click / hover are fired (hits are blocked even with false) */
|
|
@@ -324,28 +286,28 @@ export interface Dataset {
|
|
|
324
286
|
*/
|
|
325
287
|
setVisible(visible: boolean): void;
|
|
326
288
|
/**
|
|
327
|
-
* Replaces all the
|
|
328
|
-
* drops the ids that disappear
|
|
289
|
+
* Replaces all the rows that are shown with GeoJSON features (there is no partial update).
|
|
290
|
+
* The selection drops the ids that disappear
|
|
329
291
|
*/
|
|
330
|
-
|
|
292
|
+
setRows(rows: readonly DatasetRow[]): void;
|
|
331
293
|
/**
|
|
332
|
-
* Replaces all the rows that are shown with a
|
|
333
|
-
*
|
|
294
|
+
* Replaces all the rows that are shown with a table (there is no partial update). The
|
|
295
|
+
* selection drops the ids that disappear
|
|
334
296
|
*
|
|
335
297
|
* The arrays are kept and read as they are, not copied. The rows are packed straight into the
|
|
336
298
|
* GPU arrays, and a row becomes a feature only when it is asked for (a hit, the selection,
|
|
337
299
|
* `getFeatures`, `collectVisible`). The bboxes, the spatial chunks and the spatial index of the
|
|
338
|
-
* hit testing are computed here unless
|
|
300
|
+
* hit testing are computed here, unless the table was prepared with `prepareTable`.
|
|
339
301
|
*
|
|
340
|
-
* @param
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* @throws when the shape of the table does not add up, or when `prepared` was made for a table
|
|
344
|
-
* of another length
|
|
302
|
+
* @param table The table, or the result of `prepareTable` (from
|
|
303
|
+
* `@sakuzu/maplibre-gl-draw/table`), typically computed in the Worker that read it
|
|
304
|
+
* @throws when the shape of the table does not add up
|
|
345
305
|
*/
|
|
346
|
-
|
|
306
|
+
setTable(table: Table | PreparedTable): void;
|
|
347
307
|
/** Replaces the style rule (undefined clears it) */
|
|
348
308
|
setStyleRule(rule: StyleRule | undefined): void;
|
|
309
|
+
/** The style rule in effect (undefined when not set) */
|
|
310
|
+
getStyleRule(): StyleRule | undefined;
|
|
349
311
|
/**
|
|
350
312
|
* Replaces the zoom-dependent drawing factors (null clears them)
|
|
351
313
|
*
|
|
@@ -380,7 +342,7 @@ export interface Dataset {
|
|
|
380
342
|
* The features currently held, in draw order, as normalized by the dataset. The rule
|
|
381
343
|
* colors and the base style are not merged in (use `collectVisible` for that)
|
|
382
344
|
*
|
|
383
|
-
* For a
|
|
345
|
+
* For a table every row with a geometry is built into a feature on the first call
|
|
384
346
|
* (and kept), which costs as much as giving the rows as features in the first place.
|
|
385
347
|
*/
|
|
386
348
|
getFeatures(): Feature[];
|
|
@@ -414,10 +376,10 @@ export interface Dataset {
|
|
|
414
376
|
* The narrowing uses the spatial index and builds no feature, so the cost is proportional to
|
|
415
377
|
* the number of rows in the range. It is the entry point for code that walks only what is
|
|
416
378
|
* drawn, such as placing text next to points: choose rows with the `getRow*` reads and build
|
|
417
|
-
* the features of the chosen ones alone with `
|
|
379
|
+
* the features of the chosen ones alone with `getRow`.
|
|
418
380
|
*
|
|
419
|
-
* A row is the one reported as `row` by `click` and `hover`: the index in the
|
|
420
|
-
*
|
|
381
|
+
* A row is the one reported as `row` by `click` and `hover`: the index in the rows given (or
|
|
382
|
+
* in the result of the provider), or the row of the table. The numbers hold until
|
|
421
383
|
* the contents are replaced (a `change` with the reason `features`).
|
|
422
384
|
*
|
|
423
385
|
* @param bounds The range in degrees (`minX` / `maxX` are longitudes, `minY` / `maxY`
|
|
@@ -426,14 +388,15 @@ export interface Dataset {
|
|
|
426
388
|
*/
|
|
427
389
|
collectDrawnRows(bounds: BoundingBox): Int32Array;
|
|
428
390
|
/**
|
|
429
|
-
*
|
|
391
|
+
* Reads a row as a feature, with the rule colors and the base style applied (the same feature
|
|
430
392
|
* `collectVisible` returns for that row)
|
|
431
393
|
*
|
|
432
|
-
* A row of a
|
|
394
|
+
* A row of a table is built into a feature on each call.
|
|
433
395
|
*
|
|
434
|
-
* @
|
|
396
|
+
* @param index The row
|
|
397
|
+
* @returns undefined when the row is out of range
|
|
435
398
|
*/
|
|
436
|
-
|
|
399
|
+
getRow(index: number): Feature | undefined;
|
|
437
400
|
/**
|
|
438
401
|
* The id of a row, without building its feature
|
|
439
402
|
*
|
|
@@ -478,7 +441,7 @@ export interface Dataset {
|
|
|
478
441
|
* of the retained rendering. The retained batches are not touched, so switching the selection
|
|
479
442
|
* never rebuilds a GPU resource.
|
|
480
443
|
*
|
|
481
|
-
* An id that is not held is ignored. An id that disappears through
|
|
444
|
+
* An id that is not held is ignored. An id that disappears through setRows, setTable or a
|
|
482
445
|
* provider result is dropped from the selection automatically.
|
|
483
446
|
*/
|
|
484
447
|
setSelectedIds(ids: string[]): void;
|
|
@@ -554,7 +517,7 @@ export interface Dataset {
|
|
|
554
517
|
off<K extends keyof DatasetEventMap>(event: K, handler: (payload: DatasetEventMap[K]) => void): void;
|
|
555
518
|
/**
|
|
556
519
|
* Removes the dataset and releases its GPU resources; the same as
|
|
557
|
-
*
|
|
520
|
+
* `draw.datasets.remove`, including the `dataset.removed` event.
|
|
558
521
|
* Calling it again does nothing
|
|
559
522
|
*/
|
|
560
523
|
remove(): void;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** Recursively checks whether it contains a position with 3 or more elements */
|
|
4
|
+
function hasExtraPositionElements(value) {
|
|
5
|
+
if (typeof value[0] === 'number') {
|
|
6
|
+
return value.length !== 2;
|
|
7
|
+
}
|
|
8
|
+
return value.some(hasExtraPositionElements);
|
|
9
|
+
}
|
|
10
|
+
/** Returns a copy with every position truncated to the 2 elements [longitude, latitude] */
|
|
11
|
+
function truncatePositions(value) {
|
|
12
|
+
if (typeof value[0] === 'number') {
|
|
13
|
+
return [value[0], value[1]];
|
|
14
|
+
}
|
|
15
|
+
return value.map(truncatePositions);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalizes a row into a feature of the same shape as in the Store
|
|
19
|
+
*
|
|
20
|
+
* It fills in the fields a row does not have and, since it is not put into the Store, layerId is
|
|
21
|
+
* an empty string. A row without a geometry (null, or a GeometryCollection) becomes a hidden
|
|
22
|
+
* Point with NaN coordinates, so it keeps its place but is neither drawn nor hit. The
|
|
23
|
+
* coordinates may contain 3-element positions (with an elevation), so a copy truncated to 2
|
|
24
|
+
* elements is made only when they do (ordinary input with only 2 elements is not copied).
|
|
25
|
+
*
|
|
26
|
+
* @param input The row
|
|
27
|
+
* @param index The row number, the id of a row without one
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export function normalizeDisplayFeature(input, index) {
|
|
31
|
+
const id = input.id === undefined || input.id === null ? String(index) : String(input.id);
|
|
32
|
+
const properties = (input.properties ?? {});
|
|
33
|
+
const geometry = input.geometry;
|
|
34
|
+
if (!geometry || geometry.type === 'GeometryCollection') {
|
|
35
|
+
return {
|
|
36
|
+
id,
|
|
37
|
+
type: 'Point',
|
|
38
|
+
geometry: { type: 'Point', coordinates: [Number.NaN, Number.NaN] },
|
|
39
|
+
layerId: '',
|
|
40
|
+
groupId: undefined,
|
|
41
|
+
properties,
|
|
42
|
+
style: input.style ?? {},
|
|
43
|
+
locked: false,
|
|
44
|
+
visible: false,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const coords = geometry.coordinates;
|
|
48
|
+
return {
|
|
49
|
+
id,
|
|
50
|
+
type: geometry.type,
|
|
51
|
+
geometry: hasExtraPositionElements(coords)
|
|
52
|
+
? { type: geometry.type, coordinates: truncatePositions(coords) }
|
|
53
|
+
: geometry,
|
|
54
|
+
layerId: '',
|
|
55
|
+
groupId: undefined,
|
|
56
|
+
properties,
|
|
57
|
+
style: input.style ?? {},
|
|
58
|
+
locked: false,
|
|
59
|
+
visible: true,
|
|
60
|
+
};
|
|
61
|
+
}
|