@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
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test: the public predicates between points, lines and polygons
|
|
3
|
+
*
|
|
4
|
+
* The tests run on the lng/lat plane. A point or a line is contained when it lies inside the
|
|
5
|
+
* polygon or on its boundary; a polygon is contained when no part of it lies outside.
|
|
6
|
+
*/
|
|
7
|
+
import type { Geometry, MultiPolygon, Point, Polygon, Position } from 'geojson';
|
|
8
|
+
/**
|
|
9
|
+
* Determines whether a point lies inside a polygon, holes taken into account.
|
|
10
|
+
*
|
|
11
|
+
* @param point The point, a position `[lng, lat]` in degrees or a Point
|
|
12
|
+
* @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
|
|
13
|
+
* in degrees
|
|
14
|
+
* @returns `true` when the point lies inside an outer ring and inside none of its holes. The
|
|
15
|
+
* result for a point exactly on the boundary is not defined
|
|
16
|
+
* @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected type
|
|
17
|
+
*/
|
|
18
|
+
export declare function pointInPolygon(point: Position | Point, polygon: Polygon | MultiPolygon | {
|
|
19
|
+
readonly geometry: Geometry;
|
|
20
|
+
}): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Determines whether two polygons share an area.
|
|
23
|
+
*
|
|
24
|
+
* @param a The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
|
|
25
|
+
* degrees
|
|
26
|
+
* @param b The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
|
|
27
|
+
* degrees
|
|
28
|
+
* @returns `true` when the common part has an area. `false` when they only touch along an edge
|
|
29
|
+
* or at a vertex
|
|
30
|
+
* @throws {@link GeometryError} (`invalid-input`) when an argument is not a Polygon or a
|
|
31
|
+
* MultiPolygon, and (`engine-failure`) when the boolean operation fails
|
|
32
|
+
*/
|
|
33
|
+
export declare function overlaps(a: Polygon | MultiPolygon | {
|
|
34
|
+
readonly geometry: Geometry;
|
|
35
|
+
}, b: Polygon | MultiPolygon | {
|
|
36
|
+
readonly geometry: Geometry;
|
|
37
|
+
}): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Determines whether a polygon completely contains a geometry.
|
|
40
|
+
*
|
|
41
|
+
* @param outer The containing Polygon or MultiPolygon, or a feature whose geometry is one;
|
|
42
|
+
* coordinates in degrees
|
|
43
|
+
* @param inner The contained geometry, or a feature whose geometry it is; coordinates in
|
|
44
|
+
* degrees. It may share the boundary of `outer`
|
|
45
|
+
* @returns `true` when no part of `inner` lies outside `outer`. `false` for a polygon without
|
|
46
|
+
* an area and for an empty geometry
|
|
47
|
+
* @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected
|
|
48
|
+
* type, and (`engine-failure`) when the boolean operation fails
|
|
49
|
+
*/
|
|
50
|
+
export declare function contains(outer: Polygon | MultiPolygon | {
|
|
51
|
+
readonly geometry: Geometry;
|
|
52
|
+
}, inner: Geometry | {
|
|
53
|
+
readonly geometry: Geometry;
|
|
54
|
+
}): boolean;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { usableAreaParts } from './coords.js';
|
|
4
|
+
import { withOperation } from './errors.js';
|
|
5
|
+
import { areaOf, geometryOf, positionOf } from './geojson.js';
|
|
6
|
+
import { contains as containsArea, intersects, pointInPolygon as pointInArea, } from './predicates.js';
|
|
7
|
+
import { segmentIntersection } from './split.js';
|
|
8
|
+
/**
|
|
9
|
+
* Determines whether a point lies inside a polygon, holes taken into account.
|
|
10
|
+
*
|
|
11
|
+
* @param point The point, a position `[lng, lat]` in degrees or a Point
|
|
12
|
+
* @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
|
|
13
|
+
* in degrees
|
|
14
|
+
* @returns `true` when the point lies inside an outer ring and inside none of its holes. The
|
|
15
|
+
* result for a point exactly on the boundary is not defined
|
|
16
|
+
* @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected type
|
|
17
|
+
*/
|
|
18
|
+
export function pointInPolygon(point, polygon) {
|
|
19
|
+
return pointInArea(positionOf(point, 'pointInPolygon'), areaOf(polygon, 'pointInPolygon'));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Determines whether two polygons share an area.
|
|
23
|
+
*
|
|
24
|
+
* @param a The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
|
|
25
|
+
* degrees
|
|
26
|
+
* @param b The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates in
|
|
27
|
+
* degrees
|
|
28
|
+
* @returns `true` when the common part has an area. `false` when they only touch along an edge
|
|
29
|
+
* or at a vertex
|
|
30
|
+
* @throws {@link GeometryError} (`invalid-input`) when an argument is not a Polygon or a
|
|
31
|
+
* MultiPolygon, and (`engine-failure`) when the boolean operation fails
|
|
32
|
+
*/
|
|
33
|
+
export function overlaps(a, b) {
|
|
34
|
+
const left = areaOf(a, 'overlaps');
|
|
35
|
+
const right = areaOf(b, 'overlaps');
|
|
36
|
+
return withOperation('overlaps', () => intersects(left, right));
|
|
37
|
+
}
|
|
38
|
+
/** The distance in degrees within which a point counts as on the boundary */
|
|
39
|
+
const BOUNDARY_EPSILON = 1e-12;
|
|
40
|
+
/** The square of the planar distance from a point to a segment */
|
|
41
|
+
function squaredSegmentDistance(p, a, b) {
|
|
42
|
+
const dx = b[0] - a[0];
|
|
43
|
+
const dy = b[1] - a[1];
|
|
44
|
+
const lengthSquared = dx * dx + dy * dy;
|
|
45
|
+
const t = lengthSquared === 0
|
|
46
|
+
? 0
|
|
47
|
+
: Math.min(1, Math.max(0, ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / lengthSquared));
|
|
48
|
+
const x = p[0] - (a[0] + t * dx);
|
|
49
|
+
const y = p[1] - (a[1] + t * dy);
|
|
50
|
+
return x * x + y * y;
|
|
51
|
+
}
|
|
52
|
+
/** Calls a function with every edge of every ring, the closing edge included */
|
|
53
|
+
function forEachEdge(parts, visit) {
|
|
54
|
+
for (const part of parts) {
|
|
55
|
+
for (const ring of part) {
|
|
56
|
+
for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
|
|
57
|
+
if (visit(ring[j], ring[i]) === true)
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
function onBoundary(point, parts) {
|
|
65
|
+
const limit = BOUNDARY_EPSILON * BOUNDARY_EPSILON;
|
|
66
|
+
return forEachEdge(parts, (a, b) => squaredSegmentDistance(point, a, b) <= limit);
|
|
67
|
+
}
|
|
68
|
+
function coversPoint(parts, point) {
|
|
69
|
+
return pointInArea(point, parts) || onBoundary(point, parts);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Whether a line lies inside the polygon or on its boundary
|
|
73
|
+
*
|
|
74
|
+
* Each segment is cut where it crosses an edge; every vertex and the middle of every piece
|
|
75
|
+
* must be covered.
|
|
76
|
+
*/
|
|
77
|
+
function coversLine(parts, line) {
|
|
78
|
+
if (line.length === 0)
|
|
79
|
+
return false;
|
|
80
|
+
if (!line.every((vertex) => coversPoint(parts, vertex)))
|
|
81
|
+
return false;
|
|
82
|
+
for (let i = 0; i < line.length - 1; i++) {
|
|
83
|
+
const a = line[i];
|
|
84
|
+
const b = line[i + 1];
|
|
85
|
+
const dx = b[0] - a[0];
|
|
86
|
+
const dy = b[1] - a[1];
|
|
87
|
+
const alongX = Math.abs(dx) >= Math.abs(dy);
|
|
88
|
+
const cuts = [0, 1];
|
|
89
|
+
forEachEdge(parts, (c, d) => {
|
|
90
|
+
const crossing = segmentIntersection(a, b, c, d);
|
|
91
|
+
if (crossing !== null) {
|
|
92
|
+
cuts.push(alongX ? (crossing[0] - a[0]) / dx : (crossing[1] - a[1]) / dy);
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
});
|
|
96
|
+
cuts.sort((x, y) => x - y);
|
|
97
|
+
for (let k = 0; k < cuts.length - 1; k++) {
|
|
98
|
+
if (cuts[k + 1] - cuts[k] <= BOUNDARY_EPSILON)
|
|
99
|
+
continue;
|
|
100
|
+
const t = (cuts[k] + cuts[k + 1]) / 2;
|
|
101
|
+
if (!coversPoint(parts, [a[0] + t * dx, a[1] + t * dy]))
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function containsGeometry(outer, inner) {
|
|
108
|
+
const parts = usableAreaParts(outer);
|
|
109
|
+
switch (inner.type) {
|
|
110
|
+
case 'Polygon':
|
|
111
|
+
case 'MultiPolygon':
|
|
112
|
+
return containsArea(outer, inner.coordinates);
|
|
113
|
+
case 'Point':
|
|
114
|
+
return coversPoint(parts, inner.coordinates);
|
|
115
|
+
case 'MultiPoint':
|
|
116
|
+
return (inner.coordinates.length > 0 &&
|
|
117
|
+
inner.coordinates.every((point) => coversPoint(parts, point)));
|
|
118
|
+
case 'LineString':
|
|
119
|
+
return coversLine(parts, inner.coordinates);
|
|
120
|
+
case 'MultiLineString':
|
|
121
|
+
return (inner.coordinates.length > 0 &&
|
|
122
|
+
inner.coordinates.every((line) => coversLine(parts, line)));
|
|
123
|
+
case 'GeometryCollection':
|
|
124
|
+
return (inner.geometries.length > 0 &&
|
|
125
|
+
inner.geometries.every((member) => containsGeometry(outer, geometryOf(member, 'contains'))));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Determines whether a polygon completely contains a geometry.
|
|
130
|
+
*
|
|
131
|
+
* @param outer The containing Polygon or MultiPolygon, or a feature whose geometry is one;
|
|
132
|
+
* coordinates in degrees
|
|
133
|
+
* @param inner The contained geometry, or a feature whose geometry it is; coordinates in
|
|
134
|
+
* degrees. It may share the boundary of `outer`
|
|
135
|
+
* @returns `true` when no part of `inner` lies outside `outer`. `false` for a polygon without
|
|
136
|
+
* an area and for an empty geometry
|
|
137
|
+
* @throws {@link GeometryError} (`invalid-input`) when an argument is not of the expected
|
|
138
|
+
* type, and (`engine-failure`) when the boolean operation fails
|
|
139
|
+
*/
|
|
140
|
+
export function contains(outer, inner) {
|
|
141
|
+
const area = areaOf(outer, 'contains');
|
|
142
|
+
const geometry = geometryOf(inner, 'contains');
|
|
143
|
+
return withOperation('contains', () => containsGeometry(area, geometry));
|
|
144
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repair: the public functions that tidy polygons and reduce vertices
|
|
3
|
+
*/
|
|
4
|
+
import type { Geometry, LineString, MultiPolygon, Polygon } from 'geojson';
|
|
5
|
+
/**
|
|
6
|
+
* Returns a polygon with its self-intersections resolved, its rings oriented and its rings
|
|
7
|
+
* without an area removed.
|
|
8
|
+
*
|
|
9
|
+
* @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
|
|
10
|
+
* in degrees. A ring with fewer than 3 positions or a position that is not finite is dropped
|
|
11
|
+
* @returns A Polygon, or a MultiPolygon when the result falls apart (a figure eight becomes two
|
|
12
|
+
* parts), with outer rings counter-clockwise and holes clockwise. null when nothing with an
|
|
13
|
+
* area remains
|
|
14
|
+
* @throws {@link GeometryError} (`invalid-input`) when the input is not a Polygon or a
|
|
15
|
+
* MultiPolygon, and (`engine-failure`) when the boolean operation fails
|
|
16
|
+
*/
|
|
17
|
+
export declare function makeValid(polygon: Polygon | MultiPolygon | {
|
|
18
|
+
readonly geometry: Geometry;
|
|
19
|
+
}): Polygon | MultiPolygon | null;
|
|
20
|
+
/**
|
|
21
|
+
* Returns a polygon with its rings oriented as RFC 7946 recommends: outer rings
|
|
22
|
+
* counter-clockwise and holes clockwise.
|
|
23
|
+
*
|
|
24
|
+
* @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
|
|
25
|
+
* in degrees. Only the orientation changes; self-intersections are left as they are (see
|
|
26
|
+
* {@link makeValid})
|
|
27
|
+
* @returns A geometry of the same type as the input
|
|
28
|
+
* @throws {@link GeometryError} (`invalid-input`) when the input is not a Polygon or a
|
|
29
|
+
* MultiPolygon
|
|
30
|
+
*/
|
|
31
|
+
export declare function rewind(polygon: Polygon | {
|
|
32
|
+
readonly geometry: Polygon;
|
|
33
|
+
}): Polygon;
|
|
34
|
+
export declare function rewind(polygon: MultiPolygon | {
|
|
35
|
+
readonly geometry: MultiPolygon;
|
|
36
|
+
}): MultiPolygon;
|
|
37
|
+
export declare function rewind(polygon: Polygon | MultiPolygon | {
|
|
38
|
+
readonly geometry: Geometry;
|
|
39
|
+
}): Polygon | MultiPolygon;
|
|
40
|
+
/**
|
|
41
|
+
* Reduces the vertices of a line or a polygon with the Douglas-Peucker algorithm and a
|
|
42
|
+
* tolerance in meters.
|
|
43
|
+
*
|
|
44
|
+
* @param geometry The LineString, Polygon or MultiPolygon, or a feature whose geometry is one;
|
|
45
|
+
* coordinates in degrees
|
|
46
|
+
* @param toleranceMeters The largest distance in meters a removed vertex may lie from the
|
|
47
|
+
* simplified line, measured on a plane at the latitude of the center of the bounding box. 0
|
|
48
|
+
* or less removes nothing
|
|
49
|
+
* @returns A geometry of the same type. The ends of a line always remain, and a ring that
|
|
50
|
+
* would keep fewer than 4 positions is kept as it is. The result may intersect itself (see
|
|
51
|
+
* {@link makeValid})
|
|
52
|
+
* @throws {@link GeometryError} (`invalid-input`) when the input is not a LineString, a
|
|
53
|
+
* Polygon or a MultiPolygon, and when the tolerance is not a finite number
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { simplify } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
58
|
+
*
|
|
59
|
+
* // The middle vertex lies about 1 m off the line, within the 5 m tolerance
|
|
60
|
+
* simplify({ type: 'LineString', coordinates: [[0, 0], [0.001, 0.00001], [0.002, 0]] }, 5);
|
|
61
|
+
* // { type: 'LineString', coordinates: [[0, 0], [0.002, 0]] }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function simplify(geometry: LineString | {
|
|
65
|
+
readonly geometry: LineString;
|
|
66
|
+
}, toleranceMeters: number): LineString;
|
|
67
|
+
export declare function simplify(geometry: Polygon | {
|
|
68
|
+
readonly geometry: Polygon;
|
|
69
|
+
}, toleranceMeters: number): Polygon;
|
|
70
|
+
export declare function simplify(geometry: MultiPolygon | {
|
|
71
|
+
readonly geometry: MultiPolygon;
|
|
72
|
+
}, toleranceMeters: number): MultiPolygon;
|
|
73
|
+
export declare function simplify(geometry: LineString | Polygon | MultiPolygon | {
|
|
74
|
+
readonly geometry: Geometry;
|
|
75
|
+
}, toleranceMeters: number): LineString | Polygon | MultiPolygon;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { coordinatesBBox } from './bbox.js';
|
|
4
|
+
import { normalizeArea } from './boolean.js';
|
|
5
|
+
import { invalidInput, withOperation } from './errors.js';
|
|
6
|
+
import { areaGeometryOf, areaOf, geometryOf, positionsOf, toAreaGeometry } from './geojson.js';
|
|
7
|
+
import { normalizeMultiPolygonOrientation, normalizePolygonOrientation, simplify as simplifyPath, } from './simplify.js';
|
|
8
|
+
import { metersToDegrees, toRadians } from './units.js';
|
|
9
|
+
/**
|
|
10
|
+
* Returns a polygon with its self-intersections resolved, its rings oriented and its rings
|
|
11
|
+
* without an area removed.
|
|
12
|
+
*
|
|
13
|
+
* @param polygon The Polygon or MultiPolygon, or a feature whose geometry is one; coordinates
|
|
14
|
+
* in degrees. A ring with fewer than 3 positions or a position that is not finite is dropped
|
|
15
|
+
* @returns A Polygon, or a MultiPolygon when the result falls apart (a figure eight becomes two
|
|
16
|
+
* parts), with outer rings counter-clockwise and holes clockwise. null when nothing with an
|
|
17
|
+
* area remains
|
|
18
|
+
* @throws {@link GeometryError} (`invalid-input`) when the input is not a Polygon or a
|
|
19
|
+
* MultiPolygon, and (`engine-failure`) when the boolean operation fails
|
|
20
|
+
*/
|
|
21
|
+
export function makeValid(polygon) {
|
|
22
|
+
const coordinates = areaOf(polygon, 'makeValid');
|
|
23
|
+
return withOperation('makeValid', () => toAreaGeometry(normalizeArea(coordinates)));
|
|
24
|
+
}
|
|
25
|
+
export function rewind(polygon) {
|
|
26
|
+
const geometry = areaGeometryOf(polygon, 'rewind');
|
|
27
|
+
if (geometry.type === 'Polygon') {
|
|
28
|
+
return {
|
|
29
|
+
type: 'Polygon',
|
|
30
|
+
coordinates: normalizePolygonOrientation(geometry.coordinates),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
type: 'MultiPolygon',
|
|
35
|
+
coordinates: normalizeMultiPolygonOrientation(geometry.coordinates),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Simplifies a path with a tolerance in meters: the path is scaled to a local plane in which
|
|
40
|
+
* a degree of longitude is `cos(latitude)` degrees of latitude, and the tolerance is taken in
|
|
41
|
+
* degrees of latitude
|
|
42
|
+
*/
|
|
43
|
+
function simplifyInMeters(path, toleranceDegrees, lngScale) {
|
|
44
|
+
const scaled = path.map((position) => [position[0] * lngScale, position[1]]);
|
|
45
|
+
const indexOf = new Map();
|
|
46
|
+
scaled.forEach((position, index) => {
|
|
47
|
+
indexOf.set(position, index);
|
|
48
|
+
});
|
|
49
|
+
return simplifyPath(scaled, toleranceDegrees).map((position) => [
|
|
50
|
+
...path[indexOf.get(position) ?? 0],
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
export function simplify(geometry, toleranceMeters) {
|
|
54
|
+
const input = geometryOf(geometry, 'simplify');
|
|
55
|
+
if (input.type !== 'LineString' && input.type !== 'Polygon' && input.type !== 'MultiPolygon') {
|
|
56
|
+
throw invalidInput('simplify', 'the input is not a LineString, a Polygon or a MultiPolygon');
|
|
57
|
+
}
|
|
58
|
+
if (!Number.isFinite(toleranceMeters)) {
|
|
59
|
+
throw invalidInput('simplify', 'the tolerance is not a finite number');
|
|
60
|
+
}
|
|
61
|
+
const box = coordinatesBBox(positionsOf(input));
|
|
62
|
+
const latitude = box === null ? 0 : (box[1] + box[3]) / 2;
|
|
63
|
+
const toleranceDegrees = metersToDegrees(toleranceMeters, latitude).lat;
|
|
64
|
+
const lngScale = Math.cos(toRadians(latitude));
|
|
65
|
+
const path = (positions) => simplifyInMeters(positions, toleranceDegrees, lngScale);
|
|
66
|
+
switch (input.type) {
|
|
67
|
+
case 'LineString':
|
|
68
|
+
return { type: 'LineString', coordinates: path(input.coordinates) };
|
|
69
|
+
case 'Polygon':
|
|
70
|
+
return { type: 'Polygon', coordinates: input.coordinates.map(path) };
|
|
71
|
+
case 'MultiPolygon':
|
|
72
|
+
return {
|
|
73
|
+
type: 'MultiPolygon',
|
|
74
|
+
coordinates: input.coordinates.map((polygon) => polygon.map(path)),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -14,13 +14,6 @@ import type { Coordinate, MultiPolygonCoordinates, PolygonCoordinates, Ring } fr
|
|
|
14
14
|
* simplified line
|
|
15
15
|
* @returns The simplified vertices as a new array. A copy of the input for 2 positions or
|
|
16
16
|
* fewer, for a tolerance that is not positive, and for a ring that would collapse
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* import { simplify } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
21
|
-
*
|
|
22
|
-
* simplify([[0, 0], [1, 0.00001], [2, 0], [3, 1]], 0.001); // [[0, 0], [2, 0], [3, 1]]
|
|
23
|
-
* ```
|
|
24
17
|
*/
|
|
25
18
|
export declare function simplify(path: Coordinate[], toleranceDegrees: number): Coordinate[];
|
|
26
19
|
/**
|
|
@@ -69,13 +69,6 @@ function markKeep(path, first, last, squaredTolerance, keep) {
|
|
|
69
69
|
* simplified line
|
|
70
70
|
* @returns The simplified vertices as a new array. A copy of the input for 2 positions or
|
|
71
71
|
* fewer, for a tolerance that is not positive, and for a ring that would collapse
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* ```ts
|
|
75
|
-
* import { simplify } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
76
|
-
*
|
|
77
|
-
* simplify([[0, 0], [1, 0.00001], [2, 0], [3, 1]], 0.001); // [[0, 0], [2, 0], [3, 1]]
|
|
78
|
-
* ```
|
|
79
72
|
*/
|
|
80
73
|
export function simplify(path, toleranceDegrees) {
|
|
81
74
|
if (path.length <= 2 || !(toleranceDegrees > 0)) {
|
package/dist/geometry/split.d.ts
CHANGED
|
@@ -18,14 +18,6 @@ import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates } from './typ
|
|
|
18
18
|
* @param b2 The end of segment B, `[lng, lat]` in degrees
|
|
19
19
|
* @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
|
|
20
20
|
* cross, are parallel or collinear, or either has length 0
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```ts
|
|
24
|
-
* import { segmentIntersection } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
25
|
-
*
|
|
26
|
-
* segmentIntersection([0, 0], [2, 2], [0, 2], [2, 0]); // [1, 1]
|
|
27
|
-
* segmentIntersection([0, 0], [1, 0], [0, 1], [1, 1]); // null (parallel)
|
|
28
|
-
* ```
|
|
29
21
|
*/
|
|
30
22
|
export declare function segmentIntersection(a1: Coordinate, a2: Coordinate, b1: Coordinate, b2: Coordinate): Coordinate | null;
|
|
31
23
|
/**
|
|
@@ -52,17 +44,5 @@ export declare function segmentIntersection(a1: Coordinate, a2: Coordinate, b1:
|
|
|
52
44
|
* input normalized) when it is not split. An empty array when the input has no area
|
|
53
45
|
* @throws {@link GeometryError} when the boolean operation engine fails even after the
|
|
54
46
|
* retry on the 1e-9 degree grid
|
|
55
|
-
*
|
|
56
|
-
* @example
|
|
57
|
-
* ```ts
|
|
58
|
-
* import { splitArea } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
59
|
-
*
|
|
60
|
-
* const square: [number, number][][] = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
|
|
61
|
-
* const parts = splitArea(square, [[0.5, -1], [0.5, 2]]);
|
|
62
|
-
* parts.length; // 2: the halves west and east of longitude 0.5
|
|
63
|
-
* if (parts.length === 1) {
|
|
64
|
-
* // Not split: the line does not cross the polygon
|
|
65
|
-
* }
|
|
66
|
-
* ```
|
|
67
47
|
*/
|
|
68
48
|
export declare function splitArea(area: AreaCoordinates, line: Coordinate[]): MultiPolygonCoordinates[];
|
package/dist/geometry/split.js
CHANGED
|
@@ -64,14 +64,6 @@ const NODE_QUANTUM = 1e-9;
|
|
|
64
64
|
* @param b2 The end of segment B, `[lng, lat]` in degrees
|
|
65
65
|
* @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
|
|
66
66
|
* cross, are parallel or collinear, or either has length 0
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* ```ts
|
|
70
|
-
* import { segmentIntersection } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
71
|
-
*
|
|
72
|
-
* segmentIntersection([0, 0], [2, 2], [0, 2], [2, 0]); // [1, 1]
|
|
73
|
-
* segmentIntersection([0, 0], [1, 0], [0, 1], [1, 1]); // null (parallel)
|
|
74
|
-
* ```
|
|
75
67
|
*/
|
|
76
68
|
export function segmentIntersection(a1, a2, b1, b2) {
|
|
77
69
|
const ax = a2[0] - a1[0];
|
|
@@ -119,18 +111,6 @@ export function segmentIntersection(a1, a2, b1, b2) {
|
|
|
119
111
|
* input normalized) when it is not split. An empty array when the input has no area
|
|
120
112
|
* @throws {@link GeometryError} when the boolean operation engine fails even after the
|
|
121
113
|
* retry on the 1e-9 degree grid
|
|
122
|
-
*
|
|
123
|
-
* @example
|
|
124
|
-
* ```ts
|
|
125
|
-
* import { splitArea } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
126
|
-
*
|
|
127
|
-
* const square: [number, number][][] = [[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]];
|
|
128
|
-
* const parts = splitArea(square, [[0.5, -1], [0.5, 2]]);
|
|
129
|
-
* parts.length; // 2: the halves west and east of longitude 0.5
|
|
130
|
-
* if (parts.length === 1) {
|
|
131
|
-
* // Not split: the line does not cross the polygon
|
|
132
|
-
* }
|
|
133
|
-
* ```
|
|
134
114
|
*/
|
|
135
115
|
export function splitArea(area, line) {
|
|
136
116
|
const normalized = normalizeArea(area);
|
package/dist/geometry/units.d.ts
CHANGED
|
@@ -5,25 +5,18 @@
|
|
|
5
5
|
* whole geometry module.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
* The radius of the sphere every
|
|
8
|
+
* The radius in meters of the sphere on which every function of this entry measures.
|
|
9
9
|
*
|
|
10
|
-
* The value is the mean Earth radius, 6,371,
|
|
11
|
-
* buffers all assume this sphere rather than an ellipsoid, so a result differs from
|
|
12
|
-
* ellipsoidal computation by up to about 0.5%.
|
|
10
|
+
* The value is the mean Earth radius of the IUGG, 6,371,008.8 m. Distances, bearings, areas,
|
|
11
|
+
* circles and buffers all assume this sphere rather than an ellipsoid, so a result differs from
|
|
12
|
+
* an ellipsoidal computation by up to about 0.5%.
|
|
13
13
|
*/
|
|
14
|
-
export declare const EARTH_RADIUS_METERS =
|
|
14
|
+
export declare const EARTH_RADIUS_METERS = 6371008.8;
|
|
15
15
|
/**
|
|
16
16
|
* Converts an angle in degrees to radians.
|
|
17
17
|
*
|
|
18
18
|
* @param degrees The angle in degrees
|
|
19
19
|
* @returns The angle in radians. NaN and infinities pass through unchanged
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```ts
|
|
23
|
-
* import { toRadians } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
24
|
-
*
|
|
25
|
-
* toRadians(180); // Math.PI
|
|
26
|
-
* ```
|
|
27
20
|
*/
|
|
28
21
|
export declare function toRadians(degrees: number): number;
|
|
29
22
|
/**
|
|
@@ -33,3 +26,18 @@ export declare function toRadians(degrees: number): number;
|
|
|
33
26
|
* @returns The angle in degrees. NaN and infinities pass through unchanged
|
|
34
27
|
*/
|
|
35
28
|
export declare function toDegrees(radians: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Converts a distance at a latitude into degrees of longitude and latitude.
|
|
31
|
+
*
|
|
32
|
+
* On the sphere of {@link EARTH_RADIUS_METERS}: a degree of latitude is always the same
|
|
33
|
+
* length, and a degree of longitude shrinks with the cosine of the latitude. Use it to turn a
|
|
34
|
+
* tolerance in meters into one in degrees. Near the poles the longitude grows without bound.
|
|
35
|
+
*
|
|
36
|
+
* @param meters The distance in meters
|
|
37
|
+
* @param latitude The latitude in degrees at which the distance is taken
|
|
38
|
+
* @returns The distance in degrees of longitude (`lng`) and of latitude (`lat`)
|
|
39
|
+
*/
|
|
40
|
+
export declare function metersToDegrees(meters: number, latitude: number): {
|
|
41
|
+
lng: number;
|
|
42
|
+
lat: number;
|
|
43
|
+
};
|
package/dist/geometry/units.js
CHANGED
|
@@ -7,25 +7,18 @@
|
|
|
7
7
|
* whole geometry module.
|
|
8
8
|
*/
|
|
9
9
|
/**
|
|
10
|
-
* The radius of the sphere every
|
|
10
|
+
* The radius in meters of the sphere on which every function of this entry measures.
|
|
11
11
|
*
|
|
12
|
-
* The value is the mean Earth radius, 6,371,
|
|
13
|
-
* buffers all assume this sphere rather than an ellipsoid, so a result differs from
|
|
14
|
-
* ellipsoidal computation by up to about 0.5%.
|
|
12
|
+
* The value is the mean Earth radius of the IUGG, 6,371,008.8 m. Distances, bearings, areas,
|
|
13
|
+
* circles and buffers all assume this sphere rather than an ellipsoid, so a result differs from
|
|
14
|
+
* an ellipsoidal computation by up to about 0.5%.
|
|
15
15
|
*/
|
|
16
|
-
export const EARTH_RADIUS_METERS =
|
|
16
|
+
export const EARTH_RADIUS_METERS = 6371008.8;
|
|
17
17
|
/**
|
|
18
18
|
* Converts an angle in degrees to radians.
|
|
19
19
|
*
|
|
20
20
|
* @param degrees The angle in degrees
|
|
21
21
|
* @returns The angle in radians. NaN and infinities pass through unchanged
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```ts
|
|
25
|
-
* import { toRadians } from '@sakuzu/maplibre-gl-draw/geometry';
|
|
26
|
-
*
|
|
27
|
-
* toRadians(180); // Math.PI
|
|
28
|
-
* ```
|
|
29
22
|
*/
|
|
30
23
|
export function toRadians(degrees) {
|
|
31
24
|
return (degrees * Math.PI) / 180;
|
|
@@ -39,3 +32,18 @@ export function toRadians(degrees) {
|
|
|
39
32
|
export function toDegrees(radians) {
|
|
40
33
|
return (radians * 180) / Math.PI;
|
|
41
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Converts a distance at a latitude into degrees of longitude and latitude.
|
|
37
|
+
*
|
|
38
|
+
* On the sphere of {@link EARTH_RADIUS_METERS}: a degree of latitude is always the same
|
|
39
|
+
* length, and a degree of longitude shrinks with the cosine of the latitude. Use it to turn a
|
|
40
|
+
* tolerance in meters into one in degrees. Near the poles the longitude grows without bound.
|
|
41
|
+
*
|
|
42
|
+
* @param meters The distance in meters
|
|
43
|
+
* @param latitude The latitude in degrees at which the distance is taken
|
|
44
|
+
* @returns The distance in degrees of longitude (`lng`) and of latitude (`lat`)
|
|
45
|
+
*/
|
|
46
|
+
export function metersToDegrees(meters, latitude) {
|
|
47
|
+
const lat = toDegrees(meters / EARTH_RADIUS_METERS);
|
|
48
|
+
return { lng: lat / Math.cos(toRadians(latitude)), lat };
|
|
49
|
+
}
|