@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,381 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/** The number of offset arrays of each geometry type */
|
|
4
|
+
const OFFSET_LEVELS = {
|
|
5
|
+
Point: 0,
|
|
6
|
+
LineString: 1,
|
|
7
|
+
MultiPoint: 1,
|
|
8
|
+
Polygon: 2,
|
|
9
|
+
MultiLineString: 2,
|
|
10
|
+
MultiPolygon: 3,
|
|
11
|
+
};
|
|
12
|
+
/** The initial number of rows when no capacity is given */
|
|
13
|
+
const DEFAULT_CAPACITY = 64;
|
|
14
|
+
/** A Float64Array that grows as values are pushed */
|
|
15
|
+
class GrowingFloat64 {
|
|
16
|
+
constructor(capacity) {
|
|
17
|
+
Object.defineProperty(this, "data", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: void 0
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "length", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: 0
|
|
28
|
+
});
|
|
29
|
+
this.data = new Float64Array(Math.max(4, capacity));
|
|
30
|
+
}
|
|
31
|
+
push2(a, b) {
|
|
32
|
+
if (this.length + 2 > this.data.length) {
|
|
33
|
+
const next = new Float64Array(Math.max(this.data.length * 2, this.length + 2));
|
|
34
|
+
next.set(this.data);
|
|
35
|
+
this.data = next;
|
|
36
|
+
}
|
|
37
|
+
this.data[this.length++] = a;
|
|
38
|
+
this.data[this.length++] = b;
|
|
39
|
+
}
|
|
40
|
+
/** A copy of exactly the pushed values */
|
|
41
|
+
finish() {
|
|
42
|
+
return this.data.slice(0, this.length);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** An Int32Array that grows as values are pushed */
|
|
46
|
+
class GrowingInt32 {
|
|
47
|
+
constructor(capacity) {
|
|
48
|
+
Object.defineProperty(this, "data", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
configurable: true,
|
|
51
|
+
writable: true,
|
|
52
|
+
value: void 0
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(this, "length", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
configurable: true,
|
|
57
|
+
writable: true,
|
|
58
|
+
value: 0
|
|
59
|
+
});
|
|
60
|
+
this.data = new Int32Array(Math.max(4, capacity));
|
|
61
|
+
}
|
|
62
|
+
push(value) {
|
|
63
|
+
if (this.length + 1 > this.data.length) {
|
|
64
|
+
const next = new Int32Array(this.data.length * 2);
|
|
65
|
+
next.set(this.data);
|
|
66
|
+
this.data = next;
|
|
67
|
+
}
|
|
68
|
+
this.data[this.length++] = value;
|
|
69
|
+
}
|
|
70
|
+
get(index) {
|
|
71
|
+
return this.data[index];
|
|
72
|
+
}
|
|
73
|
+
/** The last value pushed */
|
|
74
|
+
last() {
|
|
75
|
+
return this.data[this.length - 1];
|
|
76
|
+
}
|
|
77
|
+
/** A copy of exactly the pushed values */
|
|
78
|
+
finish() {
|
|
79
|
+
return this.data.slice(0, this.length);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** The geometry column of one geometry type, collected row by row */
|
|
83
|
+
class GeometryColumnBuilder {
|
|
84
|
+
constructor(type, capacity) {
|
|
85
|
+
Object.defineProperty(this, "type", {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
configurable: true,
|
|
88
|
+
writable: true,
|
|
89
|
+
value: type
|
|
90
|
+
});
|
|
91
|
+
/** The number of rows collected */
|
|
92
|
+
Object.defineProperty(this, "rows", {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
configurable: true,
|
|
95
|
+
writable: true,
|
|
96
|
+
value: 0
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(this, "coords", {
|
|
99
|
+
enumerable: true,
|
|
100
|
+
configurable: true,
|
|
101
|
+
writable: true,
|
|
102
|
+
value: void 0
|
|
103
|
+
});
|
|
104
|
+
/** The offset arrays, outermost first; each starts with 0 */
|
|
105
|
+
Object.defineProperty(this, "offsets", {
|
|
106
|
+
enumerable: true,
|
|
107
|
+
configurable: true,
|
|
108
|
+
writable: true,
|
|
109
|
+
value: []
|
|
110
|
+
});
|
|
111
|
+
this.coords = new GrowingFloat64(capacity * 2);
|
|
112
|
+
for (let level = 0; level < OFFSET_LEVELS[type]; level++) {
|
|
113
|
+
const offsets = new GrowingInt32(capacity + 1);
|
|
114
|
+
offsets.push(0);
|
|
115
|
+
this.offsets.push(offsets);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** The number of coordinates collected */
|
|
119
|
+
get vertexCount() {
|
|
120
|
+
return this.coords.length / 2;
|
|
121
|
+
}
|
|
122
|
+
pushPositions(positions) {
|
|
123
|
+
for (const position of positions)
|
|
124
|
+
this.coords.push2(position[0], position[1]);
|
|
125
|
+
}
|
|
126
|
+
/** Closes an element of an offset level at the current end of the level below it */
|
|
127
|
+
close(level) {
|
|
128
|
+
const below = level + 1 < this.offsets.length ? this.offsets[level + 1].length - 1 : null;
|
|
129
|
+
this.offsets[level].push(below ?? this.vertexCount);
|
|
130
|
+
}
|
|
131
|
+
/** Adds the coordinates of one row, shaped as for the type of the column */
|
|
132
|
+
add(coordinates) {
|
|
133
|
+
switch (this.type) {
|
|
134
|
+
case 'Point': {
|
|
135
|
+
const position = coordinates;
|
|
136
|
+
this.coords.push2(position[0], position[1]);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 'LineString':
|
|
140
|
+
case 'MultiPoint':
|
|
141
|
+
this.pushPositions(coordinates);
|
|
142
|
+
this.close(0);
|
|
143
|
+
break;
|
|
144
|
+
case 'Polygon':
|
|
145
|
+
case 'MultiLineString':
|
|
146
|
+
for (const ring of coordinates) {
|
|
147
|
+
this.pushPositions(ring);
|
|
148
|
+
this.close(1);
|
|
149
|
+
}
|
|
150
|
+
this.close(0);
|
|
151
|
+
break;
|
|
152
|
+
case 'MultiPolygon':
|
|
153
|
+
for (const polygon of coordinates) {
|
|
154
|
+
for (const ring of polygon) {
|
|
155
|
+
this.pushPositions(ring);
|
|
156
|
+
this.close(2);
|
|
157
|
+
}
|
|
158
|
+
this.close(1);
|
|
159
|
+
}
|
|
160
|
+
this.close(0);
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
this.rows++;
|
|
164
|
+
}
|
|
165
|
+
/** The column as collected: one row per row added */
|
|
166
|
+
finish() {
|
|
167
|
+
const geometry = { type: this.type, coords: this.coords.finish() };
|
|
168
|
+
if (this.offsets.length > 0)
|
|
169
|
+
geometry.offsets = this.offsets.map((o) => o.finish());
|
|
170
|
+
return geometry;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The column spread over the rows of the table, with an empty run (NaN coordinates for a
|
|
174
|
+
* Point) for every row without a geometry
|
|
175
|
+
*
|
|
176
|
+
* @param childOf The child of every row of the table (negative for a row without a geometry)
|
|
177
|
+
* @param length The number of rows of the table
|
|
178
|
+
*/
|
|
179
|
+
finishSpread(childOf, length) {
|
|
180
|
+
if (this.type === 'Point') {
|
|
181
|
+
const source = this.coords.finish();
|
|
182
|
+
const coords = new Float64Array(length * 2);
|
|
183
|
+
let k = 0;
|
|
184
|
+
for (let row = 0; row < length; row++) {
|
|
185
|
+
if (childOf[row] < 0) {
|
|
186
|
+
coords[row * 2] = Number.NaN;
|
|
187
|
+
coords[row * 2 + 1] = Number.NaN;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
coords[row * 2] = source[k * 2];
|
|
191
|
+
coords[row * 2 + 1] = source[k * 2 + 1];
|
|
192
|
+
k++;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return { type: 'Point', coords };
|
|
196
|
+
}
|
|
197
|
+
const outer = this.offsets[0];
|
|
198
|
+
const first = new Int32Array(length + 1);
|
|
199
|
+
let k = 0;
|
|
200
|
+
for (let row = 0; row < length; row++) {
|
|
201
|
+
if (childOf[row] >= 0)
|
|
202
|
+
k++;
|
|
203
|
+
first[row + 1] = outer.get(k);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
type: this.type,
|
|
207
|
+
coords: this.coords.finish(),
|
|
208
|
+
offsets: [first, ...this.offsets.slice(1).map((o) => o.finish())],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Whether a GeoJSON geometry type is one a table holds */
|
|
213
|
+
function isTableGeometryType(type) {
|
|
214
|
+
return type in OFFSET_LEVELS;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Creates a builder that makes a table from rows added one at a time.
|
|
218
|
+
*
|
|
219
|
+
* The coordinates are collected into growing typed arrays in the layout of GeoArrow. When every
|
|
220
|
+
* row has the same geometry type the table has one geometry column of that type; otherwise it
|
|
221
|
+
* has a mixed geometry column. An attribute whose values are all numbers (or null) becomes a
|
|
222
|
+
* `Float64Array` with NaN for null; any other attribute becomes a plain array.
|
|
223
|
+
*
|
|
224
|
+
* @param options `geometryType` fixes the geometry type of every row (a geometry of another
|
|
225
|
+
* type throws), and gives the type of a table without any geometry. `capacity` is the
|
|
226
|
+
* expected number of rows, to size the arrays from the start. `columns` limits the attributes
|
|
227
|
+
* that become columns to these names (every one is created, even if no row has it)
|
|
228
|
+
* @returns A new builder
|
|
229
|
+
*/
|
|
230
|
+
export function createTableBuilder(options) {
|
|
231
|
+
const fixedType = options?.geometryType;
|
|
232
|
+
const capacity = Math.max(1, Math.floor(options?.capacity ?? DEFAULT_CAPACITY));
|
|
233
|
+
const fixedColumns = options?.columns !== undefined;
|
|
234
|
+
let length = 0;
|
|
235
|
+
let finished = false;
|
|
236
|
+
/** The child of every row (-1 for a row without a geometry) */
|
|
237
|
+
let childOf = new Int8Array(capacity);
|
|
238
|
+
/** The row within its child of every row */
|
|
239
|
+
let childRow = new Int32Array(capacity);
|
|
240
|
+
const children = [];
|
|
241
|
+
const childByType = new Map();
|
|
242
|
+
const columns = new Map();
|
|
243
|
+
for (const name of options?.columns ?? [])
|
|
244
|
+
columns.set(name, { values: [], numeric: true });
|
|
245
|
+
let ids = null;
|
|
246
|
+
const ensureRowCapacity = () => {
|
|
247
|
+
if (length < childOf.length)
|
|
248
|
+
return;
|
|
249
|
+
const nextOf = new Int8Array(childOf.length * 2);
|
|
250
|
+
nextOf.set(childOf);
|
|
251
|
+
childOf = nextOf;
|
|
252
|
+
const nextRow = new Int32Array(childRow.length * 2);
|
|
253
|
+
nextRow.set(childRow);
|
|
254
|
+
childRow = nextRow;
|
|
255
|
+
};
|
|
256
|
+
const childFor = (type) => {
|
|
257
|
+
let child = childByType.get(type);
|
|
258
|
+
if (child === undefined) {
|
|
259
|
+
child = children.length;
|
|
260
|
+
children.push(new GeometryColumnBuilder(type, capacity));
|
|
261
|
+
childByType.set(type, child);
|
|
262
|
+
}
|
|
263
|
+
return child;
|
|
264
|
+
};
|
|
265
|
+
const checkOpen = () => {
|
|
266
|
+
if (finished)
|
|
267
|
+
throw new Error('TableBuilder: finish was already called');
|
|
268
|
+
};
|
|
269
|
+
const add = (geometry, properties, id) => {
|
|
270
|
+
checkOpen();
|
|
271
|
+
ensureRowCapacity();
|
|
272
|
+
const row = length;
|
|
273
|
+
let child = -1;
|
|
274
|
+
if (geometry && isTableGeometryType(geometry.type)) {
|
|
275
|
+
if (fixedType !== undefined && geometry.type !== fixedType) {
|
|
276
|
+
throw new TypeError(`TableBuilder: row ${row} is a ${geometry.type}, but the table holds ${fixedType}`);
|
|
277
|
+
}
|
|
278
|
+
child = childFor(geometry.type);
|
|
279
|
+
childRow[row] = children[child].rows;
|
|
280
|
+
children[child].add(geometry.coordinates);
|
|
281
|
+
}
|
|
282
|
+
childOf[row] = child;
|
|
283
|
+
if (properties) {
|
|
284
|
+
for (const name of Object.keys(properties)) {
|
|
285
|
+
let column = columns.get(name);
|
|
286
|
+
if (!column) {
|
|
287
|
+
if (fixedColumns)
|
|
288
|
+
continue;
|
|
289
|
+
column = { values: new Array(row).fill(null), numeric: true };
|
|
290
|
+
columns.set(name, column);
|
|
291
|
+
}
|
|
292
|
+
const value = properties[name] ?? null;
|
|
293
|
+
if (value !== null && typeof value !== 'number')
|
|
294
|
+
column.numeric = false;
|
|
295
|
+
column.values.push(value);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
for (const column of columns.values()) {
|
|
299
|
+
if (column.values.length === row)
|
|
300
|
+
column.values.push(null);
|
|
301
|
+
}
|
|
302
|
+
if (id !== undefined && ids === null)
|
|
303
|
+
ids = Array.from({ length: row }, (_, i) => i);
|
|
304
|
+
if (ids !== null)
|
|
305
|
+
ids.push(id ?? row);
|
|
306
|
+
length++;
|
|
307
|
+
};
|
|
308
|
+
const finish = () => {
|
|
309
|
+
checkOpen();
|
|
310
|
+
finished = true;
|
|
311
|
+
const types = childOf.slice(0, length);
|
|
312
|
+
let geometry;
|
|
313
|
+
if (children.length === 0) {
|
|
314
|
+
geometry = emptyGeometry(fixedType ?? 'Point', length);
|
|
315
|
+
}
|
|
316
|
+
else if (children.length === 1) {
|
|
317
|
+
const only = children[0];
|
|
318
|
+
geometry = only.rows === length ? only.finish() : only.finishSpread(types, length);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
const offsets = childRow.slice(0, length);
|
|
322
|
+
for (let row = 0; row < length; row++)
|
|
323
|
+
if (types[row] < 0)
|
|
324
|
+
offsets[row] = 0;
|
|
325
|
+
geometry = {
|
|
326
|
+
type: 'Mixed',
|
|
327
|
+
types,
|
|
328
|
+
offsets,
|
|
329
|
+
children: children.map((child) => child.finish()),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const table = { length, geometry, columns: {} };
|
|
333
|
+
const out = table.columns;
|
|
334
|
+
for (const [name, column] of columns) {
|
|
335
|
+
out[name] = column.numeric
|
|
336
|
+
? Float64Array.from(column.values, (value) => value === null ? Number.NaN : value)
|
|
337
|
+
: column.values;
|
|
338
|
+
}
|
|
339
|
+
if (ids !== null)
|
|
340
|
+
table.ids = ids;
|
|
341
|
+
return table;
|
|
342
|
+
};
|
|
343
|
+
return { add, finish };
|
|
344
|
+
}
|
|
345
|
+
/** A geometry column of one type whose rows all have no geometry */
|
|
346
|
+
function emptyGeometry(type, length) {
|
|
347
|
+
if (type === 'Point') {
|
|
348
|
+
return { type, coords: new Float64Array(length * 2).fill(Number.NaN) };
|
|
349
|
+
}
|
|
350
|
+
const levels = OFFSET_LEVELS[type];
|
|
351
|
+
const offsets = [new Int32Array(length + 1)];
|
|
352
|
+
for (let level = 1; level < levels; level++)
|
|
353
|
+
offsets.push(new Int32Array(1));
|
|
354
|
+
return { type, coords: new Float64Array(0), offsets };
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Makes a table from an array of GeoJSON features.
|
|
358
|
+
*
|
|
359
|
+
* It is {@link createTableBuilder} with one `add` per feature: the geometry, the properties and
|
|
360
|
+
* the id of each feature become a row. Rows of different geometry types give a mixed geometry
|
|
361
|
+
* column.
|
|
362
|
+
*
|
|
363
|
+
* @param features The features, in row order
|
|
364
|
+
* @param options `columns` limits the properties that become columns to these names
|
|
365
|
+
* @returns The table
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* ```ts
|
|
369
|
+
* import { tableFromFeatures } from '@sakuzu/maplibre-gl-draw/table';
|
|
370
|
+
*
|
|
371
|
+
* const table = tableFromFeatures(collection.features, { columns: ['name', 'visitors'] });
|
|
372
|
+
* draw.datasets.add({ id: 'places', table });
|
|
373
|
+
* ```
|
|
374
|
+
*/
|
|
375
|
+
export function tableFromFeatures(features, options) {
|
|
376
|
+
const builder = createTableBuilder({ capacity: features.length, columns: options?.columns });
|
|
377
|
+
for (const feature of features) {
|
|
378
|
+
builder.add(feature.geometry, feature.properties, feature.id);
|
|
379
|
+
}
|
|
380
|
+
return builder.finish();
|
|
381
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a large table in a Worker and put it on the map.
|
|
3
|
+
*
|
|
4
|
+
* Use it when the data has hundreds of thousands of rows or more and comes from a file: read
|
|
5
|
+
* and prepare it in a Worker, and the main thread only receives it and passes it to
|
|
6
|
+
* `draw.datasets.add`. For a few thousand rows, passing an array of features as `rows` is
|
|
7
|
+
* simpler. It depends on neither maplibre nor WebGL nor the DOM, so a Worker can import it
|
|
8
|
+
* without pulling in the engine.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* // worker.ts
|
|
12
|
+
* import {
|
|
13
|
+
* tableFromFeatures, prepareTable, transferList,
|
|
14
|
+
* } from '@sakuzu/maplibre-gl-draw/table';
|
|
15
|
+
*
|
|
16
|
+
* const features = await readGeoJSON(url); // read it any way you like
|
|
17
|
+
* const prepared = prepareTable(tableFromFeatures(features));
|
|
18
|
+
* self.postMessage(prepared, { transfer: transferList(prepared) });
|
|
19
|
+
*
|
|
20
|
+
* // main.ts
|
|
21
|
+
* worker.onmessage = (e) =>
|
|
22
|
+
* draw.datasets.add({ id: 'places', table: e.data });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* Read next: the guide
|
|
26
|
+
* [showing large data](https://sakuzu.github.io/maplibre-gl-draw/guides/large-data). The
|
|
27
|
+
* functions used most are {@link tableFromFeatures}, {@link createTableBuilder},
|
|
28
|
+
* {@link prepareTable} and {@link transferList}.
|
|
29
|
+
*
|
|
30
|
+
* @module table
|
|
31
|
+
*/
|
|
32
|
+
export type { TableBuilder } from './builder.js';
|
|
33
|
+
export { createTableBuilder, tableFromFeatures } from './builder.js';
|
|
34
|
+
export type { Table } from './types.js';
|
|
35
|
+
export { prepareTable, transferList } from './prepare.js';
|
|
36
|
+
export type { PreparedTable } from './types.js';
|
|
37
|
+
export type { Column, DictionaryColumn, GeometryType, TableGeometry, TableMixedGeometry, } from './types.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* The rows are ordered along a Hilbert curve of the centers of their bboxes and grouped bottom up
|
|
7
7
|
* into nodes of a fixed size. The whole tree is three typed arrays, so it is built in one pass
|
|
8
8
|
* without an object per row, and it can be built in a Worker and sent to the main thread without
|
|
9
|
-
* a copy (`
|
|
9
|
+
* a copy (`prepareTable`). The contents of a dataset are replaced as a
|
|
10
10
|
* whole, so a tree that cannot be updated in place is enough.
|
|
11
11
|
*
|
|
12
12
|
* A pure module: it depends on nothing.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* The splitting of the rows of a dataset into spatial chunks
|
|
5
5
|
*
|
|
6
6
|
* A pure function over typed arrays: it depends on neither the features, nor maplibre, nor
|
|
7
|
-
* WebGL, so it runs in a Worker as well (`
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* WebGL, so it runs in a Worker as well (`prepareTable` calls it there). Both kinds of contents
|
|
8
|
+
* use it: the features (`dataset/chunk.ts` computes the per-row arrays from them) and the tables
|
|
9
|
+
* (`prepare.ts`).
|
|
10
10
|
*
|
|
11
11
|
* The rule: the rows are cut in half at the median of the centers of their bboxes (the way a k-d
|
|
12
12
|
* tree is built) until a range holds at most the target number of rows and the target number of
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PreparedTable, Table } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Computes the bboxes, the spatial chunks and the spatial index of a table, and returns them
|
|
4
|
+
* with the table.
|
|
5
|
+
*
|
|
6
|
+
* It is the work that the dataset would otherwise do on the main thread when it is given the
|
|
7
|
+
* table. Call it where the table is read (in a Worker), send the result to the main thread and
|
|
8
|
+
* pass it as `table` to `draw.datasets.add` or to `Dataset.setTable`. It uses neither maplibre nor
|
|
9
|
+
* WebGL, so it runs in any Worker.
|
|
10
|
+
*
|
|
11
|
+
* @param table The table
|
|
12
|
+
* @returns The table with its prepared arrays, which belong to this table only
|
|
13
|
+
* @throws when the shape of the table does not add up (the same checks as `Dataset.setTable`)
|
|
14
|
+
*
|
|
15
|
+
* @example In a Worker
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { prepareTable, transferList } from '@sakuzu/maplibre-gl-draw/table';
|
|
18
|
+
*
|
|
19
|
+
* self.onmessage = async (event) => {
|
|
20
|
+
* const table = await readTable(event.data); // your reader, which returns a Table
|
|
21
|
+
* const prepared = prepareTable(table);
|
|
22
|
+
* self.postMessage(prepared, { transfer: transferList(prepared) });
|
|
23
|
+
* };
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function prepareTable(table: Table): PreparedTable;
|
|
27
|
+
/**
|
|
28
|
+
* Lists the buffers of a table, or of a prepared table, for the transfer list of `postMessage`.
|
|
29
|
+
*
|
|
30
|
+
* The buffers move to the other thread without a copy. The geometry arrays of every child of a
|
|
31
|
+
* mixed geometry column are listed too, and for a prepared table the prepared arrays as well.
|
|
32
|
+
* Each buffer appears once, even when several arrays share it. A `SharedArrayBuffer` is left
|
|
33
|
+
* out (it is shared, not moved). After the transfer the arrays are empty on the sending side.
|
|
34
|
+
*
|
|
35
|
+
* @param table The table, or the result of {@link prepareTable}
|
|
36
|
+
* @returns The buffers to pass as the transfer list
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* const prepared = prepareTable(tableFromFeatures(features));
|
|
41
|
+
* self.postMessage(prepared, { transfer: transferList(prepared) });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function transferList(table: Table | PreparedTable): ArrayBuffer[];
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { buildPackedRTree } from './packed-rtree.js';
|
|
4
|
+
import { partitionRows } from './partition.js';
|
|
5
|
+
import { isDictionaryColumn, TableReader } from './table.js';
|
|
6
|
+
/**
|
|
7
|
+
* Computes the bboxes, the spatial chunks and the spatial index of a table, and returns them
|
|
8
|
+
* with the table.
|
|
9
|
+
*
|
|
10
|
+
* It is the work that the dataset would otherwise do on the main thread when it is given the
|
|
11
|
+
* table. Call it where the table is read (in a Worker), send the result to the main thread and
|
|
12
|
+
* pass it as `table` to `draw.datasets.add` or to `Dataset.setTable`. It uses neither maplibre nor
|
|
13
|
+
* WebGL, so it runs in any Worker.
|
|
14
|
+
*
|
|
15
|
+
* @param table The table
|
|
16
|
+
* @returns The table with its prepared arrays, which belong to this table only
|
|
17
|
+
* @throws when the shape of the table does not add up (the same checks as `Dataset.setTable`)
|
|
18
|
+
*
|
|
19
|
+
* @example In a Worker
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { prepareTable, transferList } from '@sakuzu/maplibre-gl-draw/table';
|
|
22
|
+
*
|
|
23
|
+
* self.onmessage = async (event) => {
|
|
24
|
+
* const table = await readTable(event.data); // your reader, which returns a Table
|
|
25
|
+
* const prepared = prepareTable(table);
|
|
26
|
+
* self.postMessage(prepared, { transfer: transferList(prepared) });
|
|
27
|
+
* };
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function prepareTable(table) {
|
|
31
|
+
const reader = new TableReader(table);
|
|
32
|
+
const rowBounds = reader.computeBounds();
|
|
33
|
+
const chunks = partitionRows(rowBounds, reader.computeVertexCounts());
|
|
34
|
+
const index = buildPackedRTree(rowBounds);
|
|
35
|
+
return {
|
|
36
|
+
table,
|
|
37
|
+
length: reader.length,
|
|
38
|
+
bounds: extentOf(rowBounds),
|
|
39
|
+
rowBounds,
|
|
40
|
+
chunkRows: chunks.rows,
|
|
41
|
+
chunkOffsets: chunks.offsets,
|
|
42
|
+
chunkBounds: chunks.bounds,
|
|
43
|
+
indexNodeSize: index.nodeSize,
|
|
44
|
+
indexItemCount: index.numItems,
|
|
45
|
+
indexBoxes: index.boxes,
|
|
46
|
+
indexEntries: index.indices,
|
|
47
|
+
indexLevels: index.levelBounds,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** The extent of the bboxes of the rows (NaN for a row without a geometry), or null */
|
|
51
|
+
function extentOf(rowBounds) {
|
|
52
|
+
let west = Number.POSITIVE_INFINITY;
|
|
53
|
+
let south = Number.POSITIVE_INFINITY;
|
|
54
|
+
let east = Number.NEGATIVE_INFINITY;
|
|
55
|
+
let north = Number.NEGATIVE_INFINITY;
|
|
56
|
+
for (let i = 0; i < rowBounds.length; i += 4) {
|
|
57
|
+
if (Number.isNaN(rowBounds[i]))
|
|
58
|
+
continue;
|
|
59
|
+
west = Math.min(west, rowBounds[i]);
|
|
60
|
+
south = Math.min(south, rowBounds[i + 1]);
|
|
61
|
+
east = Math.max(east, rowBounds[i + 2]);
|
|
62
|
+
north = Math.max(north, rowBounds[i + 3]);
|
|
63
|
+
}
|
|
64
|
+
return west <= east ? [west, south, east, north] : null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Whether a value is a prepared table rather than a bare table
|
|
68
|
+
*
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
export function isPreparedTable(value) {
|
|
72
|
+
return 'table' in value && typeof value.table === 'object' && value.table !== null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Lists the buffers of a table, or of a prepared table, for the transfer list of `postMessage`.
|
|
76
|
+
*
|
|
77
|
+
* The buffers move to the other thread without a copy. The geometry arrays of every child of a
|
|
78
|
+
* mixed geometry column are listed too, and for a prepared table the prepared arrays as well.
|
|
79
|
+
* Each buffer appears once, even when several arrays share it. A `SharedArrayBuffer` is left
|
|
80
|
+
* out (it is shared, not moved). After the transfer the arrays are empty on the sending side.
|
|
81
|
+
*
|
|
82
|
+
* @param table The table, or the result of {@link prepareTable}
|
|
83
|
+
* @returns The buffers to pass as the transfer list
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const prepared = prepareTable(tableFromFeatures(features));
|
|
88
|
+
* self.postMessage(prepared, { transfer: transferList(prepared) });
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export function transferList(table) {
|
|
92
|
+
const buffers = new Set();
|
|
93
|
+
const add = (view) => {
|
|
94
|
+
if (view && view.buffer instanceof ArrayBuffer)
|
|
95
|
+
buffers.add(view.buffer);
|
|
96
|
+
};
|
|
97
|
+
const addColumn = (column) => {
|
|
98
|
+
if (!column)
|
|
99
|
+
return;
|
|
100
|
+
if (isDictionaryColumn(column))
|
|
101
|
+
add(column.codes);
|
|
102
|
+
else if (ArrayBuffer.isView(column))
|
|
103
|
+
add(column);
|
|
104
|
+
};
|
|
105
|
+
const addGeometry = (geometry) => {
|
|
106
|
+
add(geometry.coords);
|
|
107
|
+
for (const offsets of geometry.offsets ?? [])
|
|
108
|
+
add(offsets);
|
|
109
|
+
};
|
|
110
|
+
const prepared = isPreparedTable(table) ? table : null;
|
|
111
|
+
const input = prepared ? prepared.table : table;
|
|
112
|
+
const geometry = input.geometry;
|
|
113
|
+
if (geometry.type === 'Mixed') {
|
|
114
|
+
add(geometry.types);
|
|
115
|
+
add(geometry.offsets);
|
|
116
|
+
for (const child of geometry.children)
|
|
117
|
+
addGeometry(child);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
addGeometry(geometry);
|
|
121
|
+
}
|
|
122
|
+
add(input.validity);
|
|
123
|
+
addColumn(input.ids);
|
|
124
|
+
for (const column of Object.values(input.columns ?? {}))
|
|
125
|
+
addColumn(column);
|
|
126
|
+
if (prepared) {
|
|
127
|
+
add(prepared.rowBounds);
|
|
128
|
+
add(prepared.chunkRows);
|
|
129
|
+
add(prepared.chunkOffsets);
|
|
130
|
+
add(prepared.chunkBounds);
|
|
131
|
+
add(prepared.indexBoxes);
|
|
132
|
+
add(prepared.indexEntries);
|
|
133
|
+
add(prepared.indexLevels);
|
|
134
|
+
}
|
|
135
|
+
return [...buffers];
|
|
136
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|