@sakuzu/maplibre-gl-draw 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { AreaCoordinates, Coordinate, MultiPolygonCoordinates } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the intersection point of two segments on the lng/lat plane.
|
|
4
|
+
*
|
|
5
|
+
* Returns null when they do not cross. Parallel segments and collinear segments are
|
|
6
|
+
* null as well. An interval that overlaps collinearly cannot be expressed by a single
|
|
7
|
+
* point, so it is not treated as an intersection (the endpoints of the overlap are not
|
|
8
|
+
* returned either). A touch between endpoints, and a T-shaped touch where an endpoint
|
|
9
|
+
* lies in the interior of the other, are returned as intersections. A segment of length
|
|
10
|
+
* 0 has no direction, so it is always null.
|
|
11
|
+
*
|
|
12
|
+
* The test is whether the parameter is between 0 and 1 inclusive, with both ends
|
|
13
|
+
* loosened by the rounding error.
|
|
14
|
+
*
|
|
15
|
+
* @param a1 The start of segment A, `[lng, lat]` in degrees
|
|
16
|
+
* @param a2 The end of segment A, `[lng, lat]` in degrees
|
|
17
|
+
* @param b1 The start of segment B, `[lng, lat]` in degrees
|
|
18
|
+
* @param b2 The end of segment B, `[lng, lat]` in degrees
|
|
19
|
+
* @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
|
|
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
|
+
*/
|
|
30
|
+
export declare function segmentIntersection(a1: Coordinate, a2: Coordinate, b1: Coordinate, b2: Coordinate): Coordinate | null;
|
|
31
|
+
/**
|
|
32
|
+
* Cuts a polygon with a polyline and returns each resulting part.
|
|
33
|
+
*
|
|
34
|
+
* When the line does not pass through the polygon (it does not cross, it stops inside the
|
|
35
|
+
* polygon, it only touches an edge or a vertex, or it runs only inside a hole), the
|
|
36
|
+
* original polygon is returned as a single part without splitting. When the line crosses several times, the result is
|
|
37
|
+
* divided into one part per spatially connected mass. When only a portion of a
|
|
38
|
+
* MultiPolygon is cut, the parts that were not cut are returned as separate parts as
|
|
39
|
+
* well.
|
|
40
|
+
*
|
|
41
|
+
* Each part is MultiPolygon coordinates with the orientations and the degeneracies
|
|
42
|
+
* tidied up (a part with a hole comes with its inner ring). An empty array is returned
|
|
43
|
+
* for an input that has no area.
|
|
44
|
+
*
|
|
45
|
+
* A stretch where the line runs collinear with the outline is not treated as a crossing,
|
|
46
|
+
* and positions closer than 1e-9 degrees (about 0.1 mm) count as the same position.
|
|
47
|
+
*
|
|
48
|
+
* @param area The Polygon or MultiPolygon coordinates to cut, in degrees
|
|
49
|
+
* @param line The cutting polyline `[lng, lat][]` in degrees. Fewer than 2 positions cut
|
|
50
|
+
* nothing
|
|
51
|
+
* @returns The normalized MultiPolygon coordinates of each part. A single element (the
|
|
52
|
+
* input normalized) when it is not split. An empty array when the input has no area
|
|
53
|
+
* @throws {@link GeometryError} when the boolean operation engine fails even after the
|
|
54
|
+
* 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
|
+
*/
|
|
68
|
+
export declare function splitArea(area: AreaCoordinates, line: Coordinate[]): MultiPolygonCoordinates[];
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Splitting by a line
|
|
5
|
+
*
|
|
6
|
+
* Cuts a polygon with a polyline and divides it into several parts. The body is a
|
|
7
|
+
* planar arrangement.
|
|
8
|
+
*
|
|
9
|
+
* 1. Find every intersection of the outline of the polygon and the cutting line, and
|
|
10
|
+
* chop the segments at the intersections (noding)
|
|
11
|
+
* 2. Assemble the chopped segments as a planar graph and drop the dead ends (dangles)
|
|
12
|
+
* 3. Extract the minimal cycles (faces) of the graph
|
|
13
|
+
* 4. Take the intersection of each cycle and the original polygon, and make it a part
|
|
14
|
+
*
|
|
15
|
+
* Because the intersection with the original polygon is taken in step 4, the holes (the
|
|
16
|
+
* inner rings) are restored automatically. A cycle itself is a simple ring with no
|
|
17
|
+
* holes, and a cycle that lies inside a hole has an empty intersection and is dropped.
|
|
18
|
+
*
|
|
19
|
+
* The measure of dropping the dead ends is what realizes "a line that does not pass
|
|
20
|
+
* through does not split". A line that breaks off inside the polygon always has an end
|
|
21
|
+
* of degree 1, so it disappears without contributing to a cycle.
|
|
22
|
+
*
|
|
23
|
+
* The limitations are the same as those of the whole geometry module (crossing the ±180
|
|
24
|
+
* degree meridian and the vicinity of the poles are out of scope). In addition, when
|
|
25
|
+
* the cutting line has an interval that overlaps the outline of the polygon collinearly,
|
|
26
|
+
* that overlap is not treated as an intersection (because a collinear overlap cannot be
|
|
27
|
+
* expressed by a single point).
|
|
28
|
+
*/
|
|
29
|
+
import { intersection, normalizeArea } from './boolean.js';
|
|
30
|
+
import { signedRingArea } from './simplify.js';
|
|
31
|
+
/**
|
|
32
|
+
* The error allowed in the parameter of a segment
|
|
33
|
+
*
|
|
34
|
+
* In a T-shaped touch where an endpoint lies on the other segment, the parameter can
|
|
35
|
+
* fall slightly outside 0 / 1 because of the rounding error. That much is allowed.
|
|
36
|
+
*/
|
|
37
|
+
const PARAMETER_EPSILON = 1e-12;
|
|
38
|
+
/**
|
|
39
|
+
* The step of the quantization that identifies a node (degrees)
|
|
40
|
+
*
|
|
41
|
+
* 1e-9 degrees is roughly 0.1mm at the equator. An intersection uses the same value on
|
|
42
|
+
* the outline side and on the line side, so the two match exactly, but in a T-shaped
|
|
43
|
+
* touch that passes over a vertex the computed intersection differs from the original
|
|
44
|
+
* vertex by the least significant digit alone. A key rounded by this step makes them
|
|
45
|
+
* count as the same node.
|
|
46
|
+
*/
|
|
47
|
+
const NODE_QUANTUM = 1e-9;
|
|
48
|
+
/**
|
|
49
|
+
* Returns the intersection point of two segments on the lng/lat plane.
|
|
50
|
+
*
|
|
51
|
+
* Returns null when they do not cross. Parallel segments and collinear segments are
|
|
52
|
+
* null as well. An interval that overlaps collinearly cannot be expressed by a single
|
|
53
|
+
* point, so it is not treated as an intersection (the endpoints of the overlap are not
|
|
54
|
+
* returned either). A touch between endpoints, and a T-shaped touch where an endpoint
|
|
55
|
+
* lies in the interior of the other, are returned as intersections. A segment of length
|
|
56
|
+
* 0 has no direction, so it is always null.
|
|
57
|
+
*
|
|
58
|
+
* The test is whether the parameter is between 0 and 1 inclusive, with both ends
|
|
59
|
+
* loosened by the rounding error.
|
|
60
|
+
*
|
|
61
|
+
* @param a1 The start of segment A, `[lng, lat]` in degrees
|
|
62
|
+
* @param a2 The end of segment A, `[lng, lat]` in degrees
|
|
63
|
+
* @param b1 The start of segment B, `[lng, lat]` in degrees
|
|
64
|
+
* @param b2 The end of segment B, `[lng, lat]` in degrees
|
|
65
|
+
* @returns The intersection `[lng, lat]`, taken on segment A. `null` when they do not
|
|
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
|
+
*/
|
|
76
|
+
export function segmentIntersection(a1, a2, b1, b2) {
|
|
77
|
+
const ax = a2[0] - a1[0];
|
|
78
|
+
const ay = a2[1] - a1[1];
|
|
79
|
+
const bx = b2[0] - b1[0];
|
|
80
|
+
const by = b2[1] - b1[1];
|
|
81
|
+
// When the cross product is 0, the two segments are parallel (collinear included) or
|
|
82
|
+
// one of them is degenerate
|
|
83
|
+
const denominator = ax * by - ay * bx;
|
|
84
|
+
if (denominator === 0)
|
|
85
|
+
return null;
|
|
86
|
+
const dx = b1[0] - a1[0];
|
|
87
|
+
const dy = b1[1] - a1[1];
|
|
88
|
+
const t = (dx * by - dy * bx) / denominator;
|
|
89
|
+
const u = (dx * ay - dy * ax) / denominator;
|
|
90
|
+
if (t < -PARAMETER_EPSILON || t > 1 + PARAMETER_EPSILON)
|
|
91
|
+
return null;
|
|
92
|
+
if (u < -PARAMETER_EPSILON || u > 1 + PARAMETER_EPSILON)
|
|
93
|
+
return null;
|
|
94
|
+
// Pull what fell outside because of the error back onto the segment
|
|
95
|
+
const clamped = Math.min(1, Math.max(0, t));
|
|
96
|
+
return [a1[0] + clamped * ax, a1[1] + clamped * ay];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Cuts a polygon with a polyline and returns each resulting part.
|
|
100
|
+
*
|
|
101
|
+
* When the line does not pass through the polygon (it does not cross, it stops inside the
|
|
102
|
+
* polygon, it only touches an edge or a vertex, or it runs only inside a hole), the
|
|
103
|
+
* original polygon is returned as a single part without splitting. When the line crosses several times, the result is
|
|
104
|
+
* divided into one part per spatially connected mass. When only a portion of a
|
|
105
|
+
* MultiPolygon is cut, the parts that were not cut are returned as separate parts as
|
|
106
|
+
* well.
|
|
107
|
+
*
|
|
108
|
+
* Each part is MultiPolygon coordinates with the orientations and the degeneracies
|
|
109
|
+
* tidied up (a part with a hole comes with its inner ring). An empty array is returned
|
|
110
|
+
* for an input that has no area.
|
|
111
|
+
*
|
|
112
|
+
* A stretch where the line runs collinear with the outline is not treated as a crossing,
|
|
113
|
+
* and positions closer than 1e-9 degrees (about 0.1 mm) count as the same position.
|
|
114
|
+
*
|
|
115
|
+
* @param area The Polygon or MultiPolygon coordinates to cut, in degrees
|
|
116
|
+
* @param line The cutting polyline `[lng, lat][]` in degrees. Fewer than 2 positions cut
|
|
117
|
+
* nothing
|
|
118
|
+
* @returns The normalized MultiPolygon coordinates of each part. A single element (the
|
|
119
|
+
* input normalized) when it is not split. An empty array when the input has no area
|
|
120
|
+
* @throws {@link GeometryError} when the boolean operation engine fails even after the
|
|
121
|
+
* 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
|
+
*/
|
|
135
|
+
export function splitArea(area, line) {
|
|
136
|
+
const normalized = normalizeArea(area);
|
|
137
|
+
if (normalized.length === 0)
|
|
138
|
+
return [];
|
|
139
|
+
if (line.length < 2)
|
|
140
|
+
return [normalized];
|
|
141
|
+
const arrangement = buildArrangement(normalized, line);
|
|
142
|
+
if (arrangement === null)
|
|
143
|
+
return [normalized];
|
|
144
|
+
const parts = [];
|
|
145
|
+
for (const face of extractFaces(arrangement)) {
|
|
146
|
+
// A cycle is a simple ring with no holes. The intersection with the original
|
|
147
|
+
// polygon drops the holes and the outside
|
|
148
|
+
const part = intersection([face], normalized);
|
|
149
|
+
if (part.length > 0)
|
|
150
|
+
parts.push(part);
|
|
151
|
+
}
|
|
152
|
+
// If only one mass comes out, the line has not divided the polygon
|
|
153
|
+
return parts.length > 1 ? parts : [normalized];
|
|
154
|
+
}
|
|
155
|
+
/** The key that identifies a node */
|
|
156
|
+
function nodeKey(coordinate) {
|
|
157
|
+
return `${Math.round(coordinate[0] / NODE_QUANTUM)},${Math.round(coordinate[1] / NODE_QUANTUM)}`;
|
|
158
|
+
}
|
|
159
|
+
/** Pushes only the segments whose length is not 0 */
|
|
160
|
+
function pushSegment(segments, a, b) {
|
|
161
|
+
if (a[0] === b[0] && a[1] === b[1])
|
|
162
|
+
return;
|
|
163
|
+
segments.push({ a, b });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Expands every ring of the polygon into segments
|
|
167
|
+
*
|
|
168
|
+
* A ring that is not closed is treated as closed as well.
|
|
169
|
+
*/
|
|
170
|
+
function ringSegments(area) {
|
|
171
|
+
const segments = [];
|
|
172
|
+
for (const polygon of area) {
|
|
173
|
+
for (const ring of polygon) {
|
|
174
|
+
if (ring.length < 3)
|
|
175
|
+
continue;
|
|
176
|
+
for (let i = 0; i + 1 < ring.length; i++) {
|
|
177
|
+
pushSegment(segments, ring[i], ring[i + 1]);
|
|
178
|
+
}
|
|
179
|
+
pushSegment(segments, ring[ring.length - 1], ring[0]);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return segments;
|
|
183
|
+
}
|
|
184
|
+
/** Expands a polyline into segments */
|
|
185
|
+
function lineSegments(line) {
|
|
186
|
+
const segments = [];
|
|
187
|
+
for (let i = 0; i + 1 < line.length; i++) {
|
|
188
|
+
pushSegment(segments, line[i], line[i + 1]);
|
|
189
|
+
}
|
|
190
|
+
return segments;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Divides a segment at the points that chop it, making a coordinate sequence from end
|
|
194
|
+
* to end
|
|
195
|
+
*
|
|
196
|
+
* The points are ordered by the distance from the start point, and both ends as well as
|
|
197
|
+
* duplicates at the same position are dropped.
|
|
198
|
+
*/
|
|
199
|
+
function chainOf(segment, cuts) {
|
|
200
|
+
if (cuts.length === 0)
|
|
201
|
+
return [segment.a, segment.b];
|
|
202
|
+
const startKey = nodeKey(segment.a);
|
|
203
|
+
const endKey = nodeKey(segment.b);
|
|
204
|
+
const seen = new Set([startKey, endKey]);
|
|
205
|
+
const inner = [];
|
|
206
|
+
for (const cut of cuts) {
|
|
207
|
+
const key = nodeKey(cut);
|
|
208
|
+
if (seen.has(key))
|
|
209
|
+
continue;
|
|
210
|
+
seen.add(key);
|
|
211
|
+
const dx = cut[0] - segment.a[0];
|
|
212
|
+
const dy = cut[1] - segment.a[1];
|
|
213
|
+
inner.push({ coordinate: cut, distance: dx * dx + dy * dy });
|
|
214
|
+
}
|
|
215
|
+
inner.sort((left, right) => left.distance - right.distance);
|
|
216
|
+
return [segment.a, ...inner.map((entry) => entry.coordinate), segment.b];
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Assembles the noded planar graph and drops the dangles
|
|
220
|
+
*
|
|
221
|
+
* The outlines of the polygon do not cross one another (normalizeArea guarantees this),
|
|
222
|
+
* so only "line x outline" and "line x line" are examined for intersections.
|
|
223
|
+
*
|
|
224
|
+
* @returns The graph when an edge of the cutting line remains. null when none remains
|
|
225
|
+
* (no passing through)
|
|
226
|
+
*/
|
|
227
|
+
function buildArrangement(area, line) {
|
|
228
|
+
const ringSegs = ringSegments(area);
|
|
229
|
+
const lineSegs = lineSegments(line);
|
|
230
|
+
if (ringSegs.length === 0 || lineSegs.length === 0)
|
|
231
|
+
return null;
|
|
232
|
+
const ringCuts = ringSegs.map(() => []);
|
|
233
|
+
const lineCuts = lineSegs.map(() => []);
|
|
234
|
+
for (let i = 0; i < lineSegs.length; i++) {
|
|
235
|
+
for (let j = 0; j < ringSegs.length; j++) {
|
|
236
|
+
const point = segmentIntersection(lineSegs[i].a, lineSegs[i].b, ringSegs[j].a, ringSegs[j].b);
|
|
237
|
+
if (point === null)
|
|
238
|
+
continue;
|
|
239
|
+
lineCuts[i].push(point);
|
|
240
|
+
ringCuts[j].push(point);
|
|
241
|
+
}
|
|
242
|
+
// A self-intersection of the line can also form a cycle, so make it a node
|
|
243
|
+
for (let k = i + 1; k < lineSegs.length; k++) {
|
|
244
|
+
const point = segmentIntersection(lineSegs[i].a, lineSegs[i].b, lineSegs[k].a, lineSegs[k].b);
|
|
245
|
+
if (point === null)
|
|
246
|
+
continue;
|
|
247
|
+
lineCuts[i].push(point);
|
|
248
|
+
lineCuts[k].push(point);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const nodes = [];
|
|
252
|
+
const nodeIds = new Map();
|
|
253
|
+
const edges = [];
|
|
254
|
+
const edgeIds = new Map();
|
|
255
|
+
const adjacency = [];
|
|
256
|
+
const idOf = (coordinate) => {
|
|
257
|
+
const key = nodeKey(coordinate);
|
|
258
|
+
const existing = nodeIds.get(key);
|
|
259
|
+
if (existing !== undefined)
|
|
260
|
+
return existing;
|
|
261
|
+
const id = nodes.length;
|
|
262
|
+
nodes.push(coordinate);
|
|
263
|
+
nodeIds.set(key, id);
|
|
264
|
+
adjacency.push([]);
|
|
265
|
+
return id;
|
|
266
|
+
};
|
|
267
|
+
const addEdge = (a, b, fromLine) => {
|
|
268
|
+
var _a, _b;
|
|
269
|
+
// An edge whose ends fell onto the same node by the quantization has no length
|
|
270
|
+
if (a === b)
|
|
271
|
+
return;
|
|
272
|
+
const key = a < b ? `${a}-${b}` : `${b}-${a}`;
|
|
273
|
+
const existing = edgeIds.get(key);
|
|
274
|
+
if (existing !== undefined) {
|
|
275
|
+
// A line that overlaps the outline is not a "cutting edge"
|
|
276
|
+
(_a = edges[existing]).fromLine || (_a.fromLine = fromLine);
|
|
277
|
+
(_b = edges[existing]).fromRing || (_b.fromRing = !fromLine);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const id = edges.length;
|
|
281
|
+
edges.push({ a, b, fromLine, fromRing: !fromLine, removed: false });
|
|
282
|
+
edgeIds.set(key, id);
|
|
283
|
+
adjacency[a].push(id);
|
|
284
|
+
adjacency[b].push(id);
|
|
285
|
+
};
|
|
286
|
+
const addChain = (segments, cuts, fromLine) => {
|
|
287
|
+
for (let i = 0; i < segments.length; i++) {
|
|
288
|
+
const chain = chainOf(segments[i], cuts[i]);
|
|
289
|
+
let previous = idOf(chain[0]);
|
|
290
|
+
for (let j = 1; j < chain.length; j++) {
|
|
291
|
+
const current = idOf(chain[j]);
|
|
292
|
+
addEdge(previous, current, fromLine);
|
|
293
|
+
previous = current;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
// Insert the outlines first so that the representative coordinate of a node is
|
|
298
|
+
// aligned with the original vertex
|
|
299
|
+
addChain(ringSegs, ringCuts, false);
|
|
300
|
+
addChain(lineSegs, lineCuts, true);
|
|
301
|
+
const arrangement = { nodes, edges, adjacency };
|
|
302
|
+
removeDangles(arrangement);
|
|
303
|
+
const hasCut = edges.some((edge) => !edge.removed && edge.fromLine && !edge.fromRing);
|
|
304
|
+
return hasCut ? arrangement : null;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Drops the dead-end edges
|
|
308
|
+
*
|
|
309
|
+
* Erasing the nodes of degree 1 and their edges is repeated until nothing more is
|
|
310
|
+
* erased. A line that sticks out beyond the polygon and a line that breaks off inside
|
|
311
|
+
* the polygon stop contributing to a cycle this way.
|
|
312
|
+
*/
|
|
313
|
+
function removeDangles(arrangement) {
|
|
314
|
+
const { edges, adjacency } = arrangement;
|
|
315
|
+
const degree = adjacency.map((edgeIds) => edgeIds.length);
|
|
316
|
+
const queue = [];
|
|
317
|
+
for (let node = 0; node < degree.length; node++) {
|
|
318
|
+
if (degree[node] <= 1)
|
|
319
|
+
queue.push(node);
|
|
320
|
+
}
|
|
321
|
+
while (queue.length > 0) {
|
|
322
|
+
const node = queue.pop();
|
|
323
|
+
if (degree[node] > 1)
|
|
324
|
+
continue;
|
|
325
|
+
for (const edgeId of adjacency[node]) {
|
|
326
|
+
const edge = edges[edgeId];
|
|
327
|
+
if (edge.removed)
|
|
328
|
+
continue;
|
|
329
|
+
edge.removed = true;
|
|
330
|
+
degree[node]--;
|
|
331
|
+
const other = edge.a === node ? edge.b : edge.a;
|
|
332
|
+
degree[other]--;
|
|
333
|
+
if (degree[other] <= 1)
|
|
334
|
+
queue.push(other);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/** The key of a directed edge (the edge ID and the direction) */
|
|
339
|
+
function directedKey(edgeId, forward) {
|
|
340
|
+
return forward ? `${edgeId}+` : `${edgeId}-`;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Extracts the minimal cycles (faces)
|
|
344
|
+
*
|
|
345
|
+
* Traversing every directed edge once each yields, per connected component, the "inner
|
|
346
|
+
* faces (counter-clockwise)" and the "outer boundary (clockwise)". Only the cycles
|
|
347
|
+
* whose area is positive are returned.
|
|
348
|
+
*/
|
|
349
|
+
function extractFaces(arrangement) {
|
|
350
|
+
const { edges } = arrangement;
|
|
351
|
+
const visited = new Set();
|
|
352
|
+
const faces = [];
|
|
353
|
+
for (let edgeId = 0; edgeId < edges.length; edgeId++) {
|
|
354
|
+
if (edges[edgeId].removed)
|
|
355
|
+
continue;
|
|
356
|
+
for (const forward of [true, false]) {
|
|
357
|
+
if (visited.has(directedKey(edgeId, forward)))
|
|
358
|
+
continue;
|
|
359
|
+
const ring = traceFace(arrangement, edgeId, forward, visited);
|
|
360
|
+
if (ring !== null && signedRingArea(ring) > 0)
|
|
361
|
+
faces.push(ring);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return faces;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Traces one minimal cycle from a directed edge
|
|
368
|
+
*
|
|
369
|
+
* At each node, it proceeds to "the edge nearest in the clockwise direction from the
|
|
370
|
+
* direction it came in". Under this rule the inner faces close counter-clockwise.
|
|
371
|
+
*/
|
|
372
|
+
function traceFace(arrangement, startEdge, startForward, visited) {
|
|
373
|
+
const { nodes, edges } = arrangement;
|
|
374
|
+
const ring = [];
|
|
375
|
+
let edgeId = startEdge;
|
|
376
|
+
let forward = startForward;
|
|
377
|
+
// A directed edge is used only once each, so it closes within this count for certain
|
|
378
|
+
for (let step = 0; step <= edges.length * 2; step++) {
|
|
379
|
+
const key = directedKey(edgeId, forward);
|
|
380
|
+
if (visited.has(key))
|
|
381
|
+
break;
|
|
382
|
+
visited.add(key);
|
|
383
|
+
const edge = edges[edgeId];
|
|
384
|
+
const from = forward ? edge.a : edge.b;
|
|
385
|
+
const to = forward ? edge.b : edge.a;
|
|
386
|
+
ring.push(nodes[from]);
|
|
387
|
+
const next = nextDirectedEdge(arrangement, to, from);
|
|
388
|
+
if (next === null)
|
|
389
|
+
return null;
|
|
390
|
+
edgeId = next.edgeId;
|
|
391
|
+
forward = next.forward;
|
|
392
|
+
}
|
|
393
|
+
if (ring.length < 3)
|
|
394
|
+
return null;
|
|
395
|
+
ring.push(ring[0]);
|
|
396
|
+
return ring;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Chooses the next directed edge
|
|
400
|
+
*
|
|
401
|
+
* Taking the reverse of the edge it came in on (the direction looking from at toward
|
|
402
|
+
* previous) as the base, it chooses the edge nearest in the clockwise direction. After
|
|
403
|
+
* the dangle removal the degree is 2 or more, so a candidate other than going back
|
|
404
|
+
* always exists.
|
|
405
|
+
*/
|
|
406
|
+
function nextDirectedEdge(arrangement, at, previous) {
|
|
407
|
+
const { nodes, edges, adjacency } = arrangement;
|
|
408
|
+
const base = Math.atan2(nodes[previous][1] - nodes[at][1], nodes[previous][0] - nodes[at][0]);
|
|
409
|
+
let bestEdge = -1;
|
|
410
|
+
let bestForward = true;
|
|
411
|
+
let bestDifference = Number.POSITIVE_INFINITY;
|
|
412
|
+
for (const edgeId of adjacency[at]) {
|
|
413
|
+
const edge = edges[edgeId];
|
|
414
|
+
if (edge.removed)
|
|
415
|
+
continue;
|
|
416
|
+
const other = edge.a === at ? edge.b : edge.a;
|
|
417
|
+
const angle = Math.atan2(nodes[other][1] - nodes[at][1], nodes[other][0] - nodes[at][0]);
|
|
418
|
+
// The clockwise angle difference from the base (0 means going back, so make it the
|
|
419
|
+
// last candidate)
|
|
420
|
+
let difference = base - angle;
|
|
421
|
+
while (difference <= 0)
|
|
422
|
+
difference += Math.PI * 2;
|
|
423
|
+
if (difference < bestDifference) {
|
|
424
|
+
bestDifference = difference;
|
|
425
|
+
bestEdge = edgeId;
|
|
426
|
+
bestForward = edge.a === at;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return bestEdge < 0 ? null : { edgeId: bestEdge, forward: bestForward };
|
|
430
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions of the geometry module
|
|
3
|
+
*
|
|
4
|
+
* GeoJSON-compatible array representations. They match the shape of the coordinates of
|
|
5
|
+
* a core Feature structurally, so they can be passed through as they are with no
|
|
6
|
+
* conversion. The geometry module does not depend on external type definitions; the
|
|
7
|
+
* coordinate types are self-contained in this file alone.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* A position as `[longitude, latitude]` in degrees (WGS84, the GeoJSON order).
|
|
11
|
+
*
|
|
12
|
+
* Longitude comes first. No altitude is carried; the functions of this module read only the
|
|
13
|
+
* first two elements.
|
|
14
|
+
*/
|
|
15
|
+
export type Coordinate = [number, number];
|
|
16
|
+
/**
|
|
17
|
+
* The outline of a polygon: a closed coordinate sequence whose first and last positions are
|
|
18
|
+
* equal.
|
|
19
|
+
*
|
|
20
|
+
* The functions of this module accept a ring in either orientation. A ring with fewer than
|
|
21
|
+
* 3 positions, or with a position that is not finite, cannot bound an area and is dropped
|
|
22
|
+
* by every function that takes polygons.
|
|
23
|
+
*/
|
|
24
|
+
export type Ring = Coordinate[];
|
|
25
|
+
/**
|
|
26
|
+
* The coordinates of a Polygon: index 0 is the outer ring and the rest are holes (inner
|
|
27
|
+
* rings).
|
|
28
|
+
*/
|
|
29
|
+
export type PolygonCoordinates = Ring[];
|
|
30
|
+
/** The coordinates of a MultiPolygon: an array of Polygon coordinates, one per part. */
|
|
31
|
+
export type MultiPolygonCoordinates = PolygonCoordinates[];
|
|
32
|
+
/**
|
|
33
|
+
* Either Polygon coordinates or MultiPolygon coordinates.
|
|
34
|
+
*
|
|
35
|
+
* The functions that take polygons accept both shapes (Ring[] and Ring[][]) and tell them
|
|
36
|
+
* apart with {@link isMultiPolygonCoordinates}, so the caller does not need to normalize
|
|
37
|
+
* them. The functions that return polygons always return MultiPolygon coordinates.
|
|
38
|
+
*/
|
|
39
|
+
export type AreaCoordinates = PolygonCoordinates | MultiPolygonCoordinates;
|
|
40
|
+
/**
|
|
41
|
+
* A bounding box as `[minLng, minLat, maxLng, maxLat]` in degrees.
|
|
42
|
+
*
|
|
43
|
+
* A box never crosses the ±180 degree meridian: `minLng <= maxLng` always holds.
|
|
44
|
+
*/
|
|
45
|
+
export type BBox = [number, number, number, number];
|
|
46
|
+
/** A GeoJSON Point geometry without `bbox`. */
|
|
47
|
+
export interface PointGeometry {
|
|
48
|
+
/** The geometry type */
|
|
49
|
+
type: 'Point';
|
|
50
|
+
/** The position `[lng, lat]` */
|
|
51
|
+
coordinates: Coordinate;
|
|
52
|
+
}
|
|
53
|
+
/** A GeoJSON MultiPoint geometry without `bbox`. */
|
|
54
|
+
export interface MultiPointGeometry {
|
|
55
|
+
/** The geometry type */
|
|
56
|
+
type: 'MultiPoint';
|
|
57
|
+
/** The positions `[lng, lat]` */
|
|
58
|
+
coordinates: Coordinate[];
|
|
59
|
+
}
|
|
60
|
+
/** A GeoJSON LineString geometry without `bbox`. */
|
|
61
|
+
export interface LineStringGeometry {
|
|
62
|
+
/** The geometry type */
|
|
63
|
+
type: 'LineString';
|
|
64
|
+
/** The vertices `[lng, lat]` in drawing order */
|
|
65
|
+
coordinates: Coordinate[];
|
|
66
|
+
}
|
|
67
|
+
/** A GeoJSON MultiLineString geometry without `bbox`. */
|
|
68
|
+
export interface MultiLineStringGeometry {
|
|
69
|
+
/** The geometry type */
|
|
70
|
+
type: 'MultiLineString';
|
|
71
|
+
/** The lines, each a vertex sequence `[lng, lat][]` */
|
|
72
|
+
coordinates: Coordinate[][];
|
|
73
|
+
}
|
|
74
|
+
/** A GeoJSON Polygon geometry without `bbox`. */
|
|
75
|
+
export interface PolygonGeometry {
|
|
76
|
+
/** The geometry type */
|
|
77
|
+
type: 'Polygon';
|
|
78
|
+
/** The outer ring followed by the holes */
|
|
79
|
+
coordinates: PolygonCoordinates;
|
|
80
|
+
}
|
|
81
|
+
/** A GeoJSON MultiPolygon geometry without `bbox`. */
|
|
82
|
+
export interface MultiPolygonGeometry {
|
|
83
|
+
/** The geometry type */
|
|
84
|
+
type: 'MultiPolygon';
|
|
85
|
+
/** The parts, each an outer ring followed by its holes */
|
|
86
|
+
coordinates: MultiPolygonCoordinates;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A whole geometry, as taken by {@link buffer}.
|
|
90
|
+
*
|
|
91
|
+
* The GeoJSON Geometry types without `bbox` and without GeometryCollection. The
|
|
92
|
+
* coordinates of a Point, LineString or Polygon feature have the same shape, so they can
|
|
93
|
+
* be passed with no conversion.
|
|
94
|
+
*/
|
|
95
|
+
export type GeometryInput = PointGeometry | MultiPointGeometry | LineStringGeometry | MultiLineStringGeometry | PolygonGeometry | MultiPolygonGeometry;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit conversion and geodetic constants
|
|
3
|
+
*
|
|
4
|
+
* The spherical-approximation constants and the angle conversions shared across the
|
|
5
|
+
* whole geometry module.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The radius of the sphere every geodesic function of this module uses, in meters.
|
|
9
|
+
*
|
|
10
|
+
* The value is the mean Earth radius, 6,371,000 m. Distances, bearings, areas, circles and
|
|
11
|
+
* buffers all assume this sphere rather than an ellipsoid, so a result differs from an
|
|
12
|
+
* ellipsoidal computation by up to about 0.5%.
|
|
13
|
+
*/
|
|
14
|
+
export declare const EARTH_RADIUS_METERS = 6371000;
|
|
15
|
+
/**
|
|
16
|
+
* Converts an angle in degrees to radians.
|
|
17
|
+
*
|
|
18
|
+
* @param degrees The angle in degrees
|
|
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
|
+
*/
|
|
28
|
+
export declare function toRadians(degrees: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Converts an angle in radians to degrees.
|
|
31
|
+
*
|
|
32
|
+
* @param radians The angle in radians
|
|
33
|
+
* @returns The angle in degrees. NaN and infinities pass through unchanged
|
|
34
|
+
*/
|
|
35
|
+
export declare function toDegrees(radians: number): number;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Unit conversion and geodetic constants
|
|
5
|
+
*
|
|
6
|
+
* The spherical-approximation constants and the angle conversions shared across the
|
|
7
|
+
* whole geometry module.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The radius of the sphere every geodesic function of this module uses, in meters.
|
|
11
|
+
*
|
|
12
|
+
* The value is the mean Earth radius, 6,371,000 m. Distances, bearings, areas, circles and
|
|
13
|
+
* buffers all assume this sphere rather than an ellipsoid, so a result differs from an
|
|
14
|
+
* ellipsoidal computation by up to about 0.5%.
|
|
15
|
+
*/
|
|
16
|
+
export const EARTH_RADIUS_METERS = 6371000;
|
|
17
|
+
/**
|
|
18
|
+
* Converts an angle in degrees to radians.
|
|
19
|
+
*
|
|
20
|
+
* @param degrees The angle in degrees
|
|
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
|
+
*/
|
|
30
|
+
export function toRadians(degrees) {
|
|
31
|
+
return (degrees * Math.PI) / 180;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Converts an angle in radians to degrees.
|
|
35
|
+
*
|
|
36
|
+
* @param radians The angle in radians
|
|
37
|
+
* @returns The angle in degrees. NaN and infinities pass through unchanged
|
|
38
|
+
*/
|
|
39
|
+
export function toDegrees(radians) {
|
|
40
|
+
return (radians * 180) / Math.PI;
|
|
41
|
+
}
|