@scoova/mgl 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/LICENSE.txt +116 -0
- package/README.md +174 -0
- package/build/banner.ts +12 -0
- package/build/bump-version-changelog.js +26 -0
- package/build/check-bundle-size.js +77 -0
- package/build/generate-dist-package.js +26 -0
- package/build/generate-doc-images.ts +78 -0
- package/build/generate-docs.ts +190 -0
- package/build/generate-shaders.ts +68 -0
- package/build/generate-struct-arrays.ts +438 -0
- package/build/generate-style-code.ts +283 -0
- package/build/readme.md +56 -0
- package/build/release-notes.js +45 -0
- package/build/rollup/bundle_prelude.js +29 -0
- package/build/rollup/maplibregl.js +22 -0
- package/build/rollup_plugins.ts +58 -0
- package/dist/LICENSE.txt +116 -0
- package/dist/maplibre-gl.css +1 -0
- package/dist/maplibre-gl.d.ts +13304 -0
- package/dist/maplibre-gl.js +59 -0
- package/dist/maplibre-gl.js.map +1 -0
- package/dist/package.json +1 -0
- package/package.json +192 -0
- package/src/css/maplibre-gl.css +854 -0
- package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
- package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
- package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
- package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
- package/src/data/array_types.g.ts +1130 -0
- package/src/data/bucket/circle_attributes.ts +8 -0
- package/src/data/bucket/circle_bucket.ts +197 -0
- package/src/data/bucket/fill_attributes.ts +8 -0
- package/src/data/bucket/fill_bucket.test.ts +95 -0
- package/src/data/bucket/fill_bucket.ts +228 -0
- package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
- package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
- package/src/data/bucket/heatmap_bucket.ts +12 -0
- package/src/data/bucket/line_attributes.ts +8 -0
- package/src/data/bucket/line_attributes_ext.ts +8 -0
- package/src/data/bucket/line_bucket.test.ts +142 -0
- package/src/data/bucket/line_bucket.ts +592 -0
- package/src/data/bucket/pattern_attributes.ts +9 -0
- package/src/data/bucket/pattern_bucket_features.ts +57 -0
- package/src/data/bucket/symbol_attributes.ts +122 -0
- package/src/data/bucket/symbol_bucket.test.ts +243 -0
- package/src/data/bucket/symbol_bucket.ts +975 -0
- package/src/data/bucket.ts +123 -0
- package/src/data/dem_data.test.ts +237 -0
- package/src/data/dem_data.ts +171 -0
- package/src/data/evaluation_feature.ts +18 -0
- package/src/data/extent.ts +13 -0
- package/src/data/feature_index.ts +337 -0
- package/src/data/feature_position_map.test.ts +33 -0
- package/src/data/feature_position_map.ts +126 -0
- package/src/data/index_array_type.ts +9 -0
- package/src/data/load_geometry.test.ts +49 -0
- package/src/data/load_geometry.ts +44 -0
- package/src/data/pos3d_attributes.ts +5 -0
- package/src/data/pos_attributes.ts +5 -0
- package/src/data/program_configuration.ts +735 -0
- package/src/data/raster_bounds_attributes.ts +6 -0
- package/src/data/segment.ts +89 -0
- package/src/geo/edge_insets.test.ts +83 -0
- package/src/geo/edge_insets.ts +146 -0
- package/src/geo/lng_lat.test.ts +65 -0
- package/src/geo/lng_lat.ts +169 -0
- package/src/geo/lng_lat_bounds.test.ts +357 -0
- package/src/geo/lng_lat_bounds.ts +356 -0
- package/src/geo/mercator_coordinate.test.ts +34 -0
- package/src/geo/mercator_coordinate.ts +157 -0
- package/src/geo/projection/projection.ts +72 -0
- package/src/geo/transform.test.ts +509 -0
- package/src/geo/transform.ts +1072 -0
- package/src/gl/color_mode.ts +31 -0
- package/src/gl/context.ts +321 -0
- package/src/gl/cull_face_mode.ts +22 -0
- package/src/gl/depth_mode.ts +26 -0
- package/src/gl/framebuffer.ts +48 -0
- package/src/gl/index_buffer.ts +55 -0
- package/src/gl/render_pool.test.ts +69 -0
- package/src/gl/render_pool.ts +93 -0
- package/src/gl/state.test.ts +125 -0
- package/src/gl/stencil_mode.ts +27 -0
- package/src/gl/types.ts +59 -0
- package/src/gl/value.ts +534 -0
- package/src/gl/vertex_buffer.test.ts +57 -0
- package/src/gl/vertex_buffer.ts +111 -0
- package/src/gl/webgl2.ts +12 -0
- package/src/index.test.ts +121 -0
- package/src/index.ts +250 -0
- package/src/render/draw_background.ts +53 -0
- package/src/render/draw_circle.ts +113 -0
- package/src/render/draw_collision_debug.ts +168 -0
- package/src/render/draw_custom.test.ts +73 -0
- package/src/render/draw_custom.ts +45 -0
- package/src/render/draw_debug.test.ts +122 -0
- package/src/render/draw_debug.ts +148 -0
- package/src/render/draw_fill.test.ts +137 -0
- package/src/render/draw_fill.ts +128 -0
- package/src/render/draw_fill_extrusion.ts +97 -0
- package/src/render/draw_heatmap.ts +228 -0
- package/src/render/draw_hillshade.ts +119 -0
- package/src/render/draw_line.ts +125 -0
- package/src/render/draw_raster.ts +133 -0
- package/src/render/draw_sky.ts +44 -0
- package/src/render/draw_symbol.test.ts +223 -0
- package/src/render/draw_symbol.ts +499 -0
- package/src/render/draw_terrain.ts +99 -0
- package/src/render/glyph_atlas.ts +83 -0
- package/src/render/glyph_manager.test.ts +147 -0
- package/src/render/glyph_manager.ts +198 -0
- package/src/render/image_atlas.ts +159 -0
- package/src/render/image_manager.ts +337 -0
- package/src/render/line_atlas.test.ts +38 -0
- package/src/render/line_atlas.ts +214 -0
- package/src/render/mesh.ts +25 -0
- package/src/render/painter.test.ts +51 -0
- package/src/render/painter.ts +666 -0
- package/src/render/program/background_program.ts +100 -0
- package/src/render/program/circle_program.ts +61 -0
- package/src/render/program/clipping_mask_program.ts +19 -0
- package/src/render/program/collision_program.ts +47 -0
- package/src/render/program/debug_program.ts +29 -0
- package/src/render/program/fill_extrusion_program.ts +120 -0
- package/src/render/program/fill_program.ts +121 -0
- package/src/render/program/heatmap_program.ts +76 -0
- package/src/render/program/hillshade_program.ts +116 -0
- package/src/render/program/line_program.ts +207 -0
- package/src/render/program/pattern.ts +102 -0
- package/src/render/program/program_uniforms.ts +46 -0
- package/src/render/program/raster_program.ts +88 -0
- package/src/render/program/sky_program.ts +28 -0
- package/src/render/program/symbol_program.ts +266 -0
- package/src/render/program/terrain_program.ts +116 -0
- package/src/render/program.ts +233 -0
- package/src/render/render_to_texture.test.ts +151 -0
- package/src/render/render_to_texture.ts +197 -0
- package/src/render/terrain.test.ts +322 -0
- package/src/render/terrain.ts +464 -0
- package/src/render/texture.ts +114 -0
- package/src/render/uniform_binding.test.ts +122 -0
- package/src/render/uniform_binding.ts +157 -0
- package/src/render/update_pattern_positions_in_program.test.ts +74 -0
- package/src/render/update_pattern_positions_in_program.ts +50 -0
- package/src/render/vertex_array_object.ts +163 -0
- package/src/shaders/README.md +42 -0
- package/src/shaders/_prelude.fragment.glsl +19 -0
- package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
- package/src/shaders/_prelude.vertex.glsl +148 -0
- package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
- package/src/shaders/background.fragment.glsl +10 -0
- package/src/shaders/background.fragment.glsl.g.ts +2 -0
- package/src/shaders/background.vertex.glsl +7 -0
- package/src/shaders/background.vertex.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.fragment.glsl +28 -0
- package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.vertex.glsl +19 -0
- package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/circle.fragment.glsl +34 -0
- package/src/shaders/circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/circle.vertex.glsl +68 -0
- package/src/shaders/circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.fragment.glsl +3 -0
- package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.vertex.glsl +7 -0
- package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_box.fragment.glsl +20 -0
- package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_box.vertex.glsl +27 -0
- package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.fragment.glsl +17 -0
- package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.vertex.glsl +59 -0
- package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/debug.fragment.glsl +9 -0
- package/src/shaders/debug.fragment.glsl.g.ts +2 -0
- package/src/shaders/debug.vertex.glsl +12 -0
- package/src/shaders/debug.vertex.glsl.g.ts +2 -0
- package/src/shaders/encode_attribute.test.ts +11 -0
- package/src/shaders/encode_attribute.ts +13 -0
- package/src/shaders/fill.fragment.glsl +13 -0
- package/src/shaders/fill.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill.vertex.glsl +13 -0
- package/src/shaders/fill.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.fragment.glsl +9 -0
- package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.vertex.glsl +84 -0
- package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.fragment.glsl +17 -0
- package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.vertex.glsl +17 -0
- package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.fragment.glsl +39 -0
- package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.vertex.glsl +39 -0
- package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap.fragment.glsl +22 -0
- package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap.vertex.glsl +54 -0
- package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.fragment.glsl +15 -0
- package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.vertex.glsl +11 -0
- package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade.fragment.glsl +52 -0
- package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade.vertex.glsl +11 -0
- package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
- package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
- package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
- package/src/shaders/line.fragment.glsl +30 -0
- package/src/shaders/line.fragment.glsl.g.ts +2 -0
- package/src/shaders/line.vertex.glsl +89 -0
- package/src/shaders/line.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.fragment.glsl +34 -0
- package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.vertex.glsl +92 -0
- package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.fragment.glsl +77 -0
- package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.vertex.glsl +103 -0
- package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.fragment.glsl +45 -0
- package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.vertex.glsl +101 -0
- package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/raster.fragment.glsl +53 -0
- package/src/shaders/raster.fragment.glsl.g.ts +2 -0
- package/src/shaders/raster.vertex.glsl +21 -0
- package/src/shaders/raster.vertex.glsl.g.ts +2 -0
- package/src/shaders/shaders.ts +197 -0
- package/src/shaders/sky.fragment.glsl +17 -0
- package/src/shaders/sky.fragment.glsl.g.ts +2 -0
- package/src/shaders/sky.vertex.glsl +5 -0
- package/src/shaders/sky.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.fragment.glsl +17 -0
- package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.vertex.glsl +117 -0
- package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.fragment.glsl +58 -0
- package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.vertex.glsl +142 -0
- package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain.fragment.glsl +32 -0
- package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain.vertex.glsl +17 -0
- package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.fragment.glsl +11 -0
- package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.vertex.glsl +13 -0
- package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.fragment.glsl +15 -0
- package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.vertex.glsl +13 -0
- package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
- package/src/source/canvas_source.test.ts +210 -0
- package/src/source/canvas_source.ts +227 -0
- package/src/source/geojson_source.test.ts +492 -0
- package/src/source/geojson_source.ts +431 -0
- package/src/source/geojson_source_diff.test.ts +364 -0
- package/src/source/geojson_source_diff.ts +172 -0
- package/src/source/geojson_worker_source.test.ts +399 -0
- package/src/source/geojson_worker_source.ts +303 -0
- package/src/source/geojson_wrapper.test.ts +32 -0
- package/src/source/geojson_wrapper.ts +81 -0
- package/src/source/image_source.test.ts +235 -0
- package/src/source/image_source.ts +338 -0
- package/src/source/load_tilejson.ts +47 -0
- package/src/source/pixels_to_tile_units.ts +25 -0
- package/src/source/protocol_crud.ts +48 -0
- package/src/source/query_features.test.ts +31 -0
- package/src/source/query_features.ts +252 -0
- package/src/source/raster_dem_tile_source.test.ts +158 -0
- package/src/source/raster_dem_tile_source.ts +166 -0
- package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
- package/src/source/raster_dem_tile_worker_source.ts +38 -0
- package/src/source/raster_tile_source.test.ts +206 -0
- package/src/source/raster_tile_source.ts +227 -0
- package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
- package/src/source/rtl_text_plugin_main_thread.ts +89 -0
- package/src/source/rtl_text_plugin_status.ts +33 -0
- package/src/source/rtl_text_plugin_worker.ts +49 -0
- package/src/source/source.test.ts +41 -0
- package/src/source/source.ts +186 -0
- package/src/source/source_cache.test.ts +2069 -0
- package/src/source/source_cache.ts +1102 -0
- package/src/source/source_state.ts +157 -0
- package/src/source/terrain_source_cache.test.ts +105 -0
- package/src/source/terrain_source_cache.ts +204 -0
- package/src/source/tile.test.ts +290 -0
- package/src/source/tile.ts +478 -0
- package/src/source/tile_bounds.ts +34 -0
- package/src/source/tile_cache.test.ts +130 -0
- package/src/source/tile_cache.ts +208 -0
- package/src/source/tile_id.test.ts +112 -0
- package/src/source/tile_id.ts +221 -0
- package/src/source/vector_tile_source.test.ts +401 -0
- package/src/source/vector_tile_source.ts +283 -0
- package/src/source/vector_tile_worker_source.test.ts +396 -0
- package/src/source/vector_tile_worker_source.ts +199 -0
- package/src/source/video_source.test.ts +124 -0
- package/src/source/video_source.ts +204 -0
- package/src/source/worker.test.ts +233 -0
- package/src/source/worker.ts +301 -0
- package/src/source/worker_source.ts +117 -0
- package/src/source/worker_tile.test.ts +226 -0
- package/src/source/worker_tile.ts +208 -0
- package/src/style/create_style_layer.ts +39 -0
- package/src/style/evaluation_parameters.ts +62 -0
- package/src/style/format_section_override.test.ts +62 -0
- package/src/style/format_section_override.ts +50 -0
- package/src/style/light.test.ts +86 -0
- package/src/style/light.ts +135 -0
- package/src/style/load_glyph_range.test.ts +40 -0
- package/src/style/load_glyph_range.ts +32 -0
- package/src/style/load_sprite.test.ts +227 -0
- package/src/style/load_sprite.ts +71 -0
- package/src/style/parse_glyph_pbf.ts +42 -0
- package/src/style/pauseable_placement.ts +138 -0
- package/src/style/properties.ts +726 -0
- package/src/style/query_utils.test.ts +107 -0
- package/src/style/query_utils.ts +70 -0
- package/src/style/sky.ts +127 -0
- package/src/style/style.test.ts +2654 -0
- package/src/style/style.ts +1814 -0
- package/src/style/style_glyph.ts +25 -0
- package/src/style/style_image.ts +188 -0
- package/src/style/style_layer/background_style_layer.ts +17 -0
- package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
- package/src/style/style_layer/circle_style_layer.ts +98 -0
- package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
- package/src/style/style_layer/custom_style_layer.ts +233 -0
- package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
- package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/fill_style_layer.test.ts +37 -0
- package/src/style/style_layer/fill_style_layer.ts +65 -0
- package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
- package/src/style/style_layer/heatmap_style_layer.ts +74 -0
- package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
- package/src/style/style_layer/hillshade_style_layer.ts +21 -0
- package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
- package/src/style/style_layer/line_style_layer.test.ts +50 -0
- package/src/style/style_layer/line_style_layer.ts +131 -0
- package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
- package/src/style/style_layer/overlap_mode.test.ts +57 -0
- package/src/style/style_layer/overlap_mode.ts +25 -0
- package/src/style/style_layer/raster_style_layer.ts +17 -0
- package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/symbol_style_layer.ts +195 -0
- package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
- package/src/style/style_layer/typed_style_layer.ts +9 -0
- package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
- package/src/style/style_layer/variable_text_anchor.ts +163 -0
- package/src/style/style_layer.test.ts +372 -0
- package/src/style/style_layer.ts +287 -0
- package/src/style/style_layer_index.test.ts +99 -0
- package/src/style/style_layer_index.ts +78 -0
- package/src/style/validate_style.ts +53 -0
- package/src/style/zoom_history.ts +40 -0
- package/src/symbol/anchor.test.ts +14 -0
- package/src/symbol/anchor.ts +22 -0
- package/src/symbol/check_max_angle.test.ts +54 -0
- package/src/symbol/check_max_angle.ts +76 -0
- package/src/symbol/clip_line.test.ts +154 -0
- package/src/symbol/clip_line.ts +66 -0
- package/src/symbol/collision_feature.test.ts +98 -0
- package/src/symbol/collision_feature.ts +114 -0
- package/src/symbol/collision_index.test.ts +19 -0
- package/src/symbol/collision_index.ts +618 -0
- package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
- package/src/symbol/cross_tile_symbol_index.ts +367 -0
- package/src/symbol/get_anchors.test.ts +113 -0
- package/src/symbol/get_anchors.ts +167 -0
- package/src/symbol/grid_index.test.ts +75 -0
- package/src/symbol/grid_index.ts +414 -0
- package/src/symbol/merge_lines.test.ts +30 -0
- package/src/symbol/merge_lines.ts +80 -0
- package/src/symbol/one_em.ts +3 -0
- package/src/symbol/opacity_state.ts +23 -0
- package/src/symbol/path_interpolator.test.ts +134 -0
- package/src/symbol/path_interpolator.ts +55 -0
- package/src/symbol/placement.ts +1371 -0
- package/src/symbol/projection.test.ts +171 -0
- package/src/symbol/projection.ts +833 -0
- package/src/symbol/quads.test.ts +157 -0
- package/src/symbol/quads.ts +349 -0
- package/src/symbol/shaping.test.ts +360 -0
- package/src/symbol/shaping.ts +911 -0
- package/src/symbol/symbol_layout.ts +739 -0
- package/src/symbol/symbol_size.ts +129 -0
- package/src/symbol/symbol_style_layer.test.ts +103 -0
- package/src/symbol/transform_text.ts +27 -0
- package/src/ui/anchor.ts +27 -0
- package/src/ui/camera.test.ts +2301 -0
- package/src/ui/camera.ts +1520 -0
- package/src/ui/control/attribution_control.test.ts +543 -0
- package/src/ui/control/attribution_control.ts +209 -0
- package/src/ui/control/control.ts +67 -0
- package/src/ui/control/fullscreen_control.test.ts +114 -0
- package/src/ui/control/fullscreen_control.ts +189 -0
- package/src/ui/control/geolocate_control.test.ts +619 -0
- package/src/ui/control/geolocate_control.ts +725 -0
- package/src/ui/control/logo_control.test.ts +88 -0
- package/src/ui/control/logo_control.ts +86 -0
- package/src/ui/control/navigation_control.test.ts +238 -0
- package/src/ui/control/navigation_control.ts +294 -0
- package/src/ui/control/scale_control.test.ts +52 -0
- package/src/ui/control/scale_control.ts +152 -0
- package/src/ui/control/terrain_control.test.ts +58 -0
- package/src/ui/control/terrain_control.ts +74 -0
- package/src/ui/default_locale.ts +25 -0
- package/src/ui/events.ts +758 -0
- package/src/ui/handler/box_zoom.test.ts +163 -0
- package/src/ui/handler/box_zoom.ts +171 -0
- package/src/ui/handler/click_zoom.ts +55 -0
- package/src/ui/handler/cooperative_gestures.test.ts +338 -0
- package/src/ui/handler/cooperative_gestures.ts +111 -0
- package/src/ui/handler/dblclick_zoom.test.ts +151 -0
- package/src/ui/handler/drag_handler.ts +174 -0
- package/src/ui/handler/drag_move_state_manager.ts +115 -0
- package/src/ui/handler/drag_pan.test.ts +487 -0
- package/src/ui/handler/drag_rotate.test.ts +859 -0
- package/src/ui/handler/handler_util.ts +10 -0
- package/src/ui/handler/keyboard.test.ts +235 -0
- package/src/ui/handler/keyboard.ts +212 -0
- package/src/ui/handler/map_event.test.ts +158 -0
- package/src/ui/handler/map_event.ts +161 -0
- package/src/ui/handler/mouse.ts +92 -0
- package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
- package/src/ui/handler/mouse_rotate.test.ts +62 -0
- package/src/ui/handler/one_finger_touch_drag.ts +45 -0
- package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
- package/src/ui/handler/scroll_zoom.test.ts +382 -0
- package/src/ui/handler/scroll_zoom.ts +379 -0
- package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
- package/src/ui/handler/shim/drag_pan.ts +104 -0
- package/src/ui/handler/shim/drag_rotate.ts +76 -0
- package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
- package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
- package/src/ui/handler/tap_drag_zoom.ts +112 -0
- package/src/ui/handler/tap_recognizer.ts +138 -0
- package/src/ui/handler/tap_zoom.ts +98 -0
- package/src/ui/handler/touch_pan.ts +115 -0
- package/src/ui/handler/transform-provider.ts +44 -0
- package/src/ui/handler/two_fingers_touch.test.ts +283 -0
- package/src/ui/handler/two_fingers_touch.ts +336 -0
- package/src/ui/handler_inertia.ts +157 -0
- package/src/ui/handler_manager.ts +637 -0
- package/src/ui/hash.test.ts +404 -0
- package/src/ui/hash.ts +153 -0
- package/src/ui/map.ts +3393 -0
- package/src/ui/map_tests/map_animation.test.ts +61 -0
- package/src/ui/map_tests/map_basic.test.ts +223 -0
- package/src/ui/map_tests/map_bounds.test.ts +123 -0
- package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
- package/src/ui/map_tests/map_canvas.test.ts +59 -0
- package/src/ui/map_tests/map_control.test.ts +61 -0
- package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
- package/src/ui/map_tests/map_events.test.ts +1001 -0
- package/src/ui/map_tests/map_feature_state.test.ts +421 -0
- package/src/ui/map_tests/map_images.test.ts +175 -0
- package/src/ui/map_tests/map_is_moving.test.ts +164 -0
- package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
- package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
- package/src/ui/map_tests/map_layer.test.ts +457 -0
- package/src/ui/map_tests/map_options.test.ts +64 -0
- package/src/ui/map_tests/map_pitch.test.ts +90 -0
- package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
- package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
- package/src/ui/map_tests/map_render.test.ts +90 -0
- package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
- package/src/ui/map_tests/map_resize.test.ts +120 -0
- package/src/ui/map_tests/map_style.test.ts +541 -0
- package/src/ui/map_tests/map_terrian.test.ts +104 -0
- package/src/ui/map_tests/map_webgl.test.ts +72 -0
- package/src/ui/map_tests/map_world_copies.test.ts +103 -0
- package/src/ui/map_tests/map_zoom.test.ts +95 -0
- package/src/ui/marker.test.ts +1149 -0
- package/src/ui/marker.ts +880 -0
- package/src/ui/popup.test.ts +827 -0
- package/src/ui/popup.ts +717 -0
- package/src/util/abort_error.ts +21 -0
- package/src/util/actor.test.ts +218 -0
- package/src/util/actor.ts +241 -0
- package/src/util/actor_messages.ts +149 -0
- package/src/util/ajax.test.ts +237 -0
- package/src/util/ajax.ts +297 -0
- package/src/util/browser.test.ts +23 -0
- package/src/util/browser.ts +63 -0
- package/src/util/color_ramp.test.ts +105 -0
- package/src/util/color_ramp.ts +56 -0
- package/src/util/config.ts +29 -0
- package/src/util/dictionary_coder.ts +23 -0
- package/src/util/dispatcher.test.ts +76 -0
- package/src/util/dispatcher.ts +78 -0
- package/src/util/dom.ts +135 -0
- package/src/util/evented.test.ts +231 -0
- package/src/util/evented.ts +178 -0
- package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
- package/src/util/find_pole_of_inaccessibility.ts +130 -0
- package/src/util/geolocation_support.test.ts +43 -0
- package/src/util/geolocation_support.ts +23 -0
- package/src/util/global_worker_pool.ts +65 -0
- package/src/util/image.ts +150 -0
- package/src/util/image_request.test.ts +408 -0
- package/src/util/image_request.ts +246 -0
- package/src/util/intersection_tests.ts +206 -0
- package/src/util/is_char_in_unicode_block.test.ts +15 -0
- package/src/util/is_char_in_unicode_block.ts +345 -0
- package/src/util/offscreen_canvas_distorted.test.ts +13 -0
- package/src/util/offscreen_canvas_distorted.ts +39 -0
- package/src/util/offscreen_canvas_supported.ts +11 -0
- package/src/util/performance.ts +117 -0
- package/src/util/primitives.test.ts +140 -0
- package/src/util/primitives.ts +143 -0
- package/src/util/request_manager.ts +42 -0
- package/src/util/resolve_tokens.test.ts +45 -0
- package/src/util/resolve_tokens.ts +17 -0
- package/src/util/script_detection.test.ts +138 -0
- package/src/util/script_detection.ts +376 -0
- package/src/util/smart_wrap.test.ts +97 -0
- package/src/util/smart_wrap.ts +58 -0
- package/src/util/struct_array.test.ts +101 -0
- package/src/util/struct_array.ts +246 -0
- package/src/util/style.test.ts +34 -0
- package/src/util/style.ts +28 -0
- package/src/util/task_queue.test.ts +114 -0
- package/src/util/task_queue.ts +64 -0
- package/src/util/test/util.ts +185 -0
- package/src/util/throttle.test.ts +42 -0
- package/src/util/throttle.ts +28 -0
- package/src/util/throttled_invoker.ts +41 -0
- package/src/util/transferable_grid_index.test.ts +56 -0
- package/src/util/transferable_grid_index.ts +214 -0
- package/src/util/util.test.ts +414 -0
- package/src/util/util.ts +724 -0
- package/src/util/vectortile_to_geojson.ts +72 -0
- package/src/util/verticalize_punctuation.ts +110 -0
- package/src/util/web_worker.ts +16 -0
- package/src/util/web_worker_transfer.test.ts +153 -0
- package/src/util/web_worker_transfer.ts +254 -0
- package/src/util/webp_supported.ts +63 -0
- package/src/util/worker_pool.test.ts +43 -0
- package/src/util/worker_pool.ts +58 -0
- package/src/util/world_bounds.test.ts +59 -0
- package/src/util/world_bounds.ts +46 -0
package/src/util/util.ts
ADDED
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
import Point from '@mapbox/point-geometry';
|
|
2
|
+
import UnitBezier from '@mapbox/unitbezier';
|
|
3
|
+
import {isOffscreenCanvasDistorted} from './offscreen_canvas_distorted';
|
|
4
|
+
import type {Size} from './image';
|
|
5
|
+
import type {WorkerGlobalScopeInterface} from './web_worker';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* For a given collection of 2D points, returns their axis-aligned bounding box,
|
|
9
|
+
* in the format [minX, minY, maxX, maxY].
|
|
10
|
+
*/
|
|
11
|
+
export function getAABB(points: Array<Point>): [number, number, number, number] {
|
|
12
|
+
let tlX = Infinity;
|
|
13
|
+
let tlY = Infinity;
|
|
14
|
+
let brX = -Infinity;
|
|
15
|
+
let brY = -Infinity;
|
|
16
|
+
|
|
17
|
+
for (const p of points) {
|
|
18
|
+
tlX = Math.min(tlX, p.x);
|
|
19
|
+
tlY = Math.min(tlY, p.y);
|
|
20
|
+
brX = Math.max(brX, p.x);
|
|
21
|
+
brY = Math.max(brY, p.y);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return [tlX, tlY, brX, brY];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Given a value `t` that varies between 0 and 1, return
|
|
29
|
+
* an interpolation function that eases between 0 and 1 in a pleasing
|
|
30
|
+
* cubic in-out fashion.
|
|
31
|
+
*/
|
|
32
|
+
export function easeCubicInOut(t: number): number {
|
|
33
|
+
if (t <= 0) return 0;
|
|
34
|
+
if (t >= 1) return 1;
|
|
35
|
+
const t2 = t * t,
|
|
36
|
+
t3 = t2 * t;
|
|
37
|
+
return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Given given (x, y), (x1, y1) control points for a bezier curve,
|
|
42
|
+
* return a function that interpolates along that curve.
|
|
43
|
+
*
|
|
44
|
+
* @param p1x - control point 1 x coordinate
|
|
45
|
+
* @param p1y - control point 1 y coordinate
|
|
46
|
+
* @param p2x - control point 2 x coordinate
|
|
47
|
+
* @param p2y - control point 2 y coordinate
|
|
48
|
+
*/
|
|
49
|
+
export function bezier(p1x: number, p1y: number, p2x: number, p2y: number): (t: number) => number {
|
|
50
|
+
const bezier = new UnitBezier(p1x, p1y, p2x, p2y);
|
|
51
|
+
return (t: number) => {
|
|
52
|
+
return bezier.solve(t);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* A default bezier-curve powered easing function with
|
|
58
|
+
* control points (0.25, 0.1) and (0.25, 1)
|
|
59
|
+
*/
|
|
60
|
+
export const defaultEasing = bezier(0.25, 0.1, 0.25, 1);
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* constrain n to the given range via min + max
|
|
64
|
+
*
|
|
65
|
+
* @param n - value
|
|
66
|
+
* @param min - the minimum value to be returned
|
|
67
|
+
* @param max - the maximum value to be returned
|
|
68
|
+
* @returns the clamped value
|
|
69
|
+
*/
|
|
70
|
+
export function clamp(n: number, min: number, max: number): number {
|
|
71
|
+
return Math.min(max, Math.max(min, n));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* constrain n to the given range, excluding the minimum, via modular arithmetic
|
|
76
|
+
*
|
|
77
|
+
* @param n - value
|
|
78
|
+
* @param min - the minimum value to be returned, exclusive
|
|
79
|
+
* @param max - the maximum value to be returned, inclusive
|
|
80
|
+
* @returns constrained number
|
|
81
|
+
*/
|
|
82
|
+
export function wrap(n: number, min: number, max: number): number {
|
|
83
|
+
const d = max - min;
|
|
84
|
+
const w = ((n - min) % d + d) % d + min;
|
|
85
|
+
return (w === min) ? max : w;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Compute the difference between the keys in one object and the keys
|
|
90
|
+
* in another object.
|
|
91
|
+
*
|
|
92
|
+
* @returns keys difference
|
|
93
|
+
*/
|
|
94
|
+
export function keysDifference<S, T>(
|
|
95
|
+
obj: {[key: string]: S},
|
|
96
|
+
other: {[key: string]: T}
|
|
97
|
+
): Array<string> {
|
|
98
|
+
const difference = [];
|
|
99
|
+
for (const i in obj) {
|
|
100
|
+
if (!(i in other)) {
|
|
101
|
+
difference.push(i);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return difference;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Given a destination object and optionally many source objects,
|
|
109
|
+
* copy all properties from the source objects into the destination.
|
|
110
|
+
* The last source object given overrides properties from previous
|
|
111
|
+
* source objects.
|
|
112
|
+
*
|
|
113
|
+
* @param dest - destination object
|
|
114
|
+
* @param sources - sources from which properties are pulled
|
|
115
|
+
*/
|
|
116
|
+
export function extend<T extends {}, U>(dest: T, source: U): T & U;
|
|
117
|
+
export function extend<T extends {}, U, V>(dest: T, source1: U, source2: V): T & U & V;
|
|
118
|
+
export function extend<T extends {}, U, V, W>(dest: T, source1: U, source2: V, source3: W): T & U & V & W;
|
|
119
|
+
export function extend(dest: object, ...sources: Array<any>): any;
|
|
120
|
+
export function extend(dest: object, ...sources: Array<any>): any {
|
|
121
|
+
for (const src of sources) {
|
|
122
|
+
for (const k in src) {
|
|
123
|
+
dest[k] = src[k];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return dest;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// See https://stackoverflow.com/questions/49401866/all-possible-keys-of-an-union-type
|
|
130
|
+
type KeysOfUnion<T> = T extends T ? keyof T: never;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Given an object and a number of properties as strings, return version
|
|
134
|
+
* of that object with only those properties.
|
|
135
|
+
*
|
|
136
|
+
* @param src - the object
|
|
137
|
+
* @param properties - an array of property names chosen
|
|
138
|
+
* to appear on the resulting object.
|
|
139
|
+
* @returns object with limited properties.
|
|
140
|
+
* @example
|
|
141
|
+
* ```ts
|
|
142
|
+
* let foo = { name: 'Charlie', age: 10 };
|
|
143
|
+
* let justName = pick(foo, ['name']); // justName = { name: 'Charlie' }
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export function pick<T extends object>(src: T, properties: Array<KeysOfUnion<T>>): Partial<T> {
|
|
147
|
+
const result: Partial<T> = {};
|
|
148
|
+
for (let i = 0; i < properties.length; i++) {
|
|
149
|
+
const k = properties[i];
|
|
150
|
+
if (k in src) {
|
|
151
|
+
result[k] = src[k];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
let id = 1;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Return a unique numeric id, starting at 1 and incrementing with
|
|
161
|
+
* each call.
|
|
162
|
+
*
|
|
163
|
+
* @returns unique numeric id.
|
|
164
|
+
*/
|
|
165
|
+
export function uniqueId(): number {
|
|
166
|
+
return id++;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Return whether a given value is a power of two
|
|
171
|
+
*/
|
|
172
|
+
export function isPowerOfTwo(value: number): boolean {
|
|
173
|
+
return (Math.log(value) / Math.LN2) % 1 === 0;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Return the next power of two, or the input value if already a power of two
|
|
178
|
+
*/
|
|
179
|
+
export function nextPowerOfTwo(value: number): number {
|
|
180
|
+
if (value <= 1) return 1;
|
|
181
|
+
return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Create an object by mapping all the values of an existing object while
|
|
186
|
+
* preserving their keys.
|
|
187
|
+
*/
|
|
188
|
+
export function mapObject(input: any, iterator: Function, context?: any): any {
|
|
189
|
+
const output = {};
|
|
190
|
+
for (const key in input) {
|
|
191
|
+
output[key] = iterator.call(context || this, input[key], key, input);
|
|
192
|
+
}
|
|
193
|
+
return output;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Create an object by filtering out values of an existing object.
|
|
198
|
+
*/
|
|
199
|
+
export function filterObject(input: any, iterator: Function, context?: any): any {
|
|
200
|
+
const output = {};
|
|
201
|
+
for (const key in input) {
|
|
202
|
+
if (iterator.call(context || this, input[key], key, input)) {
|
|
203
|
+
output[key] = input[key];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return output;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Deeply compares two object literals.
|
|
211
|
+
* @param a - first object literal to be compared
|
|
212
|
+
* @param b - second object literal to be compared
|
|
213
|
+
* @returns true if the two object literals are deeply equal, false otherwise
|
|
214
|
+
*/
|
|
215
|
+
export function deepEqual(a?: unknown | null, b?: unknown | null): boolean {
|
|
216
|
+
if (Array.isArray(a)) {
|
|
217
|
+
if (!Array.isArray(b) || a.length !== b.length) return false;
|
|
218
|
+
for (let i = 0; i < a.length; i++) {
|
|
219
|
+
if (!deepEqual(a[i], b[i])) return false;
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
if (typeof a === 'object' && a !== null && b !== null) {
|
|
224
|
+
if (!(typeof b === 'object')) return false;
|
|
225
|
+
const keys = Object.keys(a);
|
|
226
|
+
if (keys.length !== Object.keys(b).length) return false;
|
|
227
|
+
for (const key in a) {
|
|
228
|
+
if (!deepEqual(a[key], b[key])) return false;
|
|
229
|
+
}
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
return a === b;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Deeply clones two objects.
|
|
237
|
+
*/
|
|
238
|
+
export function clone<T>(input: T): T {
|
|
239
|
+
if (Array.isArray(input)) {
|
|
240
|
+
return input.map(clone) as any as T;
|
|
241
|
+
} else if (typeof input === 'object' && input) {
|
|
242
|
+
return mapObject(input, clone) as any as T;
|
|
243
|
+
} else {
|
|
244
|
+
return input;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Check if two arrays have at least one common element.
|
|
250
|
+
*/
|
|
251
|
+
export function arraysIntersect<T>(a: Array<T>, b: Array<T>): boolean {
|
|
252
|
+
for (let l = 0; l < a.length; l++) {
|
|
253
|
+
if (b.indexOf(a[l]) >= 0) return true;
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Print a warning message to the console and ensure duplicate warning messages
|
|
260
|
+
* are not printed.
|
|
261
|
+
*/
|
|
262
|
+
const warnOnceHistory: {[key: string]: boolean} = {};
|
|
263
|
+
|
|
264
|
+
export function warnOnce(message: string): void {
|
|
265
|
+
if (!warnOnceHistory[message]) {
|
|
266
|
+
// console isn't defined in some WebWorkers, see #2558
|
|
267
|
+
if (typeof console !== 'undefined') console.warn(message);
|
|
268
|
+
warnOnceHistory[message] = true;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order
|
|
274
|
+
*
|
|
275
|
+
* @returns true for a counter clockwise set of points
|
|
276
|
+
*/
|
|
277
|
+
// https://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/
|
|
278
|
+
export function isCounterClockwise(a: Point, b: Point, c: Point): boolean {
|
|
279
|
+
return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* For two lines a and b in 2d space, defined by any two points along the lines,
|
|
284
|
+
* find the intersection point, or return null if the lines are parallel
|
|
285
|
+
*
|
|
286
|
+
* @param a1 - First point on line a
|
|
287
|
+
* @param a2 - Second point on line a
|
|
288
|
+
* @param b1 - First point on line b
|
|
289
|
+
* @param b2 - Second point on line b
|
|
290
|
+
*
|
|
291
|
+
* @returns the intersection point of the two lines or null if they are parallel
|
|
292
|
+
*/
|
|
293
|
+
export function findLineIntersection(a1: Point, a2: Point, b1: Point, b2: Point): Point | null {
|
|
294
|
+
const aDeltaY = a2.y - a1.y;
|
|
295
|
+
const aDeltaX = a2.x - a1.x;
|
|
296
|
+
const bDeltaY = b2.y - b1.y;
|
|
297
|
+
const bDeltaX = b2.x - b1.x;
|
|
298
|
+
|
|
299
|
+
const denominator = (bDeltaY * aDeltaX) - (bDeltaX * aDeltaY);
|
|
300
|
+
|
|
301
|
+
if (denominator === 0) {
|
|
302
|
+
// Lines are parallel
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const originDeltaY = a1.y - b1.y;
|
|
307
|
+
const originDeltaX = a1.x - b1.x;
|
|
308
|
+
const aInterpolation = (bDeltaX * originDeltaY - bDeltaY * originDeltaX) / denominator;
|
|
309
|
+
|
|
310
|
+
// Find intersection by projecting out from origin of first segment
|
|
311
|
+
return new Point(a1.x + (aInterpolation * aDeltaX), a1.y + (aInterpolation * aDeltaY));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Converts spherical coordinates to cartesian coordinates.
|
|
316
|
+
*
|
|
317
|
+
* @param spherical - Spherical coordinates, in [radial, azimuthal, polar]
|
|
318
|
+
* @returns cartesian coordinates in [x, y, z]
|
|
319
|
+
*/
|
|
320
|
+
|
|
321
|
+
export function sphericalToCartesian([r, azimuthal, polar]: [number, number, number]): {
|
|
322
|
+
x: number;
|
|
323
|
+
y: number;
|
|
324
|
+
z: number;
|
|
325
|
+
} {
|
|
326
|
+
// We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2):
|
|
327
|
+
// correct for that here
|
|
328
|
+
azimuthal += 90;
|
|
329
|
+
|
|
330
|
+
// Convert azimuthal and polar angles to radians
|
|
331
|
+
azimuthal *= Math.PI / 180;
|
|
332
|
+
polar *= Math.PI / 180;
|
|
333
|
+
|
|
334
|
+
return {
|
|
335
|
+
x: r * Math.cos(azimuthal) * Math.sin(polar),
|
|
336
|
+
y: r * Math.sin(azimuthal) * Math.sin(polar),
|
|
337
|
+
z: r * Math.cos(polar)
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Returns true if the when run in the web-worker context.
|
|
343
|
+
*
|
|
344
|
+
* @returns `true` if the when run in the web-worker context.
|
|
345
|
+
*/
|
|
346
|
+
export function isWorker(self: any): self is WorkerGlobalScopeInterface {
|
|
347
|
+
// @ts-ignore
|
|
348
|
+
return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Parses data from 'Cache-Control' headers.
|
|
353
|
+
*
|
|
354
|
+
* @param cacheControl - Value of 'Cache-Control' header
|
|
355
|
+
* @returns object containing parsed header info.
|
|
356
|
+
*/
|
|
357
|
+
|
|
358
|
+
export function parseCacheControl(cacheControl: string): any {
|
|
359
|
+
// Taken from [Wreck](https://github.com/hapijs/wreck)
|
|
360
|
+
const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;
|
|
361
|
+
|
|
362
|
+
const header = {};
|
|
363
|
+
cacheControl.replace(re, ($0, $1, $2, $3) => {
|
|
364
|
+
const value = $2 || $3;
|
|
365
|
+
header[$1] = value ? value.toLowerCase() : true;
|
|
366
|
+
return '';
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
if (header['max-age']) {
|
|
370
|
+
const maxAge = parseInt(header['max-age'], 10);
|
|
371
|
+
if (isNaN(maxAge)) delete header['max-age'];
|
|
372
|
+
else header['max-age'] = maxAge;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return header;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
let _isSafari = null;
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Returns true when run in WebKit derived browsers.
|
|
382
|
+
* This is used as a workaround for a memory leak in Safari caused by using Transferable objects to
|
|
383
|
+
* transfer data between WebWorkers and the main thread.
|
|
384
|
+
* https://github.com/mapbox/mapbox-gl-js/issues/8771
|
|
385
|
+
*
|
|
386
|
+
* This should be removed once the underlying Safari issue is fixed.
|
|
387
|
+
*
|
|
388
|
+
* @param scope - Since this function is used both on the main thread and WebWorker context,
|
|
389
|
+
* let the calling scope pass in the global scope object.
|
|
390
|
+
* @returns `true` when run in WebKit derived browsers.
|
|
391
|
+
*/
|
|
392
|
+
export function isSafari(scope: any): boolean {
|
|
393
|
+
if (_isSafari == null) {
|
|
394
|
+
const userAgent = scope.navigator ? scope.navigator.userAgent : null;
|
|
395
|
+
_isSafari = !!scope.safari ||
|
|
396
|
+
!!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome'))));
|
|
397
|
+
}
|
|
398
|
+
return _isSafari;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
export function storageAvailable(type: string): boolean {
|
|
402
|
+
try {
|
|
403
|
+
const storage = window[type];
|
|
404
|
+
storage.setItem('_mapbox_test_', 1);
|
|
405
|
+
storage.removeItem('_mapbox_test_');
|
|
406
|
+
return true;
|
|
407
|
+
} catch (e) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
|
|
413
|
+
//Unicode compliant base64 encoder for strings
|
|
414
|
+
export function b64EncodeUnicode(str: string) {
|
|
415
|
+
return btoa(
|
|
416
|
+
encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
|
|
417
|
+
(match, p1) => {
|
|
418
|
+
return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line
|
|
419
|
+
}
|
|
420
|
+
)
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Unicode compliant decoder for base64-encoded strings
|
|
425
|
+
export function b64DecodeUnicode(str: string) {
|
|
426
|
+
return decodeURIComponent(atob(str).split('').map((c) => {
|
|
427
|
+
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line
|
|
428
|
+
}).join(''));
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
export function isImageBitmap(image: any): image is ImageBitmap {
|
|
432
|
+
return typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Converts an ArrayBuffer to an ImageBitmap.
|
|
437
|
+
*
|
|
438
|
+
* Used mostly for testing purposes only, because mocking libs don't know how to work with ArrayBuffers, but work
|
|
439
|
+
* perfectly fine with ImageBitmaps. Might also be used for environments (other than testing) not supporting
|
|
440
|
+
* ArrayBuffers.
|
|
441
|
+
*
|
|
442
|
+
* @param data - Data to convert
|
|
443
|
+
* @returns - A promise resolved when the conversion is finished
|
|
444
|
+
*/
|
|
445
|
+
export const arrayBufferToImageBitmap = async (data: ArrayBuffer): Promise<ImageBitmap> => {
|
|
446
|
+
if (data.byteLength === 0) {
|
|
447
|
+
return createImageBitmap(new ImageData(1, 1));
|
|
448
|
+
}
|
|
449
|
+
const blob: Blob = new Blob([new Uint8Array(data)], {type: 'image/png'});
|
|
450
|
+
try {
|
|
451
|
+
return createImageBitmap(blob);
|
|
452
|
+
} catch (e) {
|
|
453
|
+
throw new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=';
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Converts an ArrayBuffer to an HTMLImageElement.
|
|
461
|
+
*
|
|
462
|
+
* Used mostly for testing purposes only, because mocking libs don't know how to work with ArrayBuffers, but work
|
|
463
|
+
* perfectly fine with ImageBitmaps. Might also be used for environments (other than testing) not supporting
|
|
464
|
+
* ArrayBuffers.
|
|
465
|
+
*
|
|
466
|
+
* @param data - Data to convert
|
|
467
|
+
* @returns - A promise resolved when the conversion is finished
|
|
468
|
+
*/
|
|
469
|
+
export const arrayBufferToImage = (data: ArrayBuffer): Promise<HTMLImageElement> => {
|
|
470
|
+
return new Promise((resolve, reject) => {
|
|
471
|
+
const img: HTMLImageElement = new Image();
|
|
472
|
+
img.onload = () => {
|
|
473
|
+
resolve(img);
|
|
474
|
+
URL.revokeObjectURL(img.src);
|
|
475
|
+
// prevent image dataURI memory leak in Safari;
|
|
476
|
+
// but don't free the image immediately because it might be uploaded in the next frame
|
|
477
|
+
// https://github.com/mapbox/mapbox-gl-js/issues/10226
|
|
478
|
+
img.onload = null;
|
|
479
|
+
window.requestAnimationFrame(() => { img.src = transparentPngUrl; });
|
|
480
|
+
};
|
|
481
|
+
img.onerror = () => reject(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.'));
|
|
482
|
+
const blob: Blob = new Blob([new Uint8Array(data)], {type: 'image/png'});
|
|
483
|
+
img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl;
|
|
484
|
+
});
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Computes the webcodecs VideoFrame API options to select a rectangle out of
|
|
489
|
+
* an image and write it into the destination rectangle.
|
|
490
|
+
*
|
|
491
|
+
* Rect (x/y/width/height) select the overlapping rectangle from the source image
|
|
492
|
+
* and layout (offset/stride) write that overlapping rectangle to the correct place
|
|
493
|
+
* in the destination image.
|
|
494
|
+
*
|
|
495
|
+
* Offset is the byte offset in the dest image that the first pixel appears at
|
|
496
|
+
* and stride is the number of bytes to the start of the next row:
|
|
497
|
+
* ┌───────────┐
|
|
498
|
+
* │ dest │
|
|
499
|
+
* │ ┌───┼───────┐
|
|
500
|
+
* │offset→│▓▓▓│ source│
|
|
501
|
+
* │ │▓▓▓│ │
|
|
502
|
+
* │ └───┼───────┘
|
|
503
|
+
* │stride ⇠╌╌╌│
|
|
504
|
+
* │╌╌╌╌╌╌→ │
|
|
505
|
+
* └───────────┘
|
|
506
|
+
*
|
|
507
|
+
* @param image - source image containing a width and height attribute
|
|
508
|
+
* @param x - top-left x coordinate to read from the image
|
|
509
|
+
* @param y - top-left y coordinate to read from the image
|
|
510
|
+
* @param width - width of the rectangle to read from the image
|
|
511
|
+
* @param height - height of the rectangle to read from the image
|
|
512
|
+
* @returns the layout and rect options to pass into VideoFrame API
|
|
513
|
+
*/
|
|
514
|
+
function computeVideoFrameParameters(image: Size, x: number, y: number, width: number, height: number): VideoFrameCopyToOptions {
|
|
515
|
+
const destRowOffset = Math.max(-x, 0) * 4;
|
|
516
|
+
const firstSourceRow = Math.max(0, y);
|
|
517
|
+
const firstDestRow = firstSourceRow - y;
|
|
518
|
+
const offset = firstDestRow * width * 4 + destRowOffset;
|
|
519
|
+
const stride = width * 4;
|
|
520
|
+
|
|
521
|
+
const sourceLeft = Math.max(0, x);
|
|
522
|
+
const sourceTop = Math.max(0, y);
|
|
523
|
+
const sourceRight = Math.min(image.width, x + width);
|
|
524
|
+
const sourceBottom = Math.min(image.height, y + height);
|
|
525
|
+
return {
|
|
526
|
+
rect: {
|
|
527
|
+
x: sourceLeft,
|
|
528
|
+
y: sourceTop,
|
|
529
|
+
width: sourceRight - sourceLeft,
|
|
530
|
+
height: sourceBottom - sourceTop
|
|
531
|
+
},
|
|
532
|
+
layout: [{offset, stride}]
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Reads pixels from an ImageBitmap/Image/canvas using webcodec VideoFrame API.
|
|
538
|
+
*
|
|
539
|
+
* @param data - image, imagebitmap, or canvas to parse
|
|
540
|
+
* @param x - top-left x coordinate to read from the image
|
|
541
|
+
* @param y - top-left y coordinate to read from the image
|
|
542
|
+
* @param width - width of the rectangle to read from the image
|
|
543
|
+
* @param height - height of the rectangle to read from the image
|
|
544
|
+
* @returns a promise containing the parsed RGBA pixel values of the image, or the error if an error occurred
|
|
545
|
+
*/
|
|
546
|
+
export async function readImageUsingVideoFrame(
|
|
547
|
+
image: HTMLImageElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas,
|
|
548
|
+
x: number, y: number, width: number, height: number
|
|
549
|
+
): Promise<Uint8ClampedArray> {
|
|
550
|
+
if (typeof VideoFrame === 'undefined') {
|
|
551
|
+
throw new Error('VideoFrame not supported');
|
|
552
|
+
}
|
|
553
|
+
const frame = new VideoFrame(image, {timestamp: 0});
|
|
554
|
+
try {
|
|
555
|
+
const format = frame?.format;
|
|
556
|
+
if (!format || !(format.startsWith('BGR') || format.startsWith('RGB'))) {
|
|
557
|
+
throw new Error(`Unrecognized format ${format}`);
|
|
558
|
+
}
|
|
559
|
+
const swapBR = format.startsWith('BGR');
|
|
560
|
+
const result = new Uint8ClampedArray(width * height * 4);
|
|
561
|
+
await frame.copyTo(result, computeVideoFrameParameters(image, x, y, width, height));
|
|
562
|
+
if (swapBR) {
|
|
563
|
+
for (let i = 0; i < result.length; i += 4) {
|
|
564
|
+
const tmp = result[i];
|
|
565
|
+
result[i] = result[i + 2];
|
|
566
|
+
result[i + 2] = tmp;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
return result;
|
|
570
|
+
} finally {
|
|
571
|
+
frame.close();
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
let offscreenCanvas: OffscreenCanvas;
|
|
576
|
+
let offscreenCanvasContext: OffscreenCanvasRenderingContext2D;
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* Reads pixels from an ImageBitmap/Image/canvas using OffscreenCanvas
|
|
580
|
+
*
|
|
581
|
+
* @param data - image, imagebitmap, or canvas to parse
|
|
582
|
+
* @param x - top-left x coordinate to read from the image
|
|
583
|
+
* @param y - top-left y coordinate to read from the image
|
|
584
|
+
* @param width - width of the rectangle to read from the image
|
|
585
|
+
* @param height - height of the rectangle to read from the image
|
|
586
|
+
* @returns a promise containing the parsed RGBA pixel values of the image, or the error if an error occurred
|
|
587
|
+
*/
|
|
588
|
+
export function readImageDataUsingOffscreenCanvas(
|
|
589
|
+
imgBitmap: HTMLImageElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas,
|
|
590
|
+
x: number, y: number, width: number, height: number
|
|
591
|
+
): Uint8ClampedArray {
|
|
592
|
+
const origWidth = imgBitmap.width;
|
|
593
|
+
const origHeight = imgBitmap.height;
|
|
594
|
+
// Lazily initialize OffscreenCanvas
|
|
595
|
+
if (!offscreenCanvas || !offscreenCanvasContext) {
|
|
596
|
+
// Dem tiles are typically 256x256
|
|
597
|
+
offscreenCanvas = new OffscreenCanvas(origWidth, origHeight);
|
|
598
|
+
offscreenCanvasContext = offscreenCanvas.getContext('2d', {willReadFrequently: true});
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
offscreenCanvas.width = origWidth;
|
|
602
|
+
offscreenCanvas.height = origHeight;
|
|
603
|
+
|
|
604
|
+
offscreenCanvasContext.drawImage(imgBitmap, 0, 0, origWidth, origHeight);
|
|
605
|
+
const imgData = offscreenCanvasContext.getImageData(x, y, width, height);
|
|
606
|
+
offscreenCanvasContext.clearRect(0, 0, origWidth, origHeight);
|
|
607
|
+
return imgData.data;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Reads RGBA pixels from an preferring OffscreenCanvas, but falling back to VideoFrame if supported and
|
|
612
|
+
* the browser is mangling OffscreenCanvas getImageData results.
|
|
613
|
+
*
|
|
614
|
+
* @param data - image, imagebitmap, or canvas to parse
|
|
615
|
+
* @param x - top-left x coordinate to read from the image
|
|
616
|
+
* @param y - top-left y coordinate to read from the image
|
|
617
|
+
* @param width - width of the rectangle to read from the image
|
|
618
|
+
* @param height - height of the rectangle to read from the image
|
|
619
|
+
* @returns a promise containing the parsed RGBA pixel values of the image
|
|
620
|
+
*/
|
|
621
|
+
export async function getImageData(
|
|
622
|
+
image: HTMLImageElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas,
|
|
623
|
+
x: number, y: number, width: number, height: number
|
|
624
|
+
): Promise<Uint8ClampedArray> {
|
|
625
|
+
if (isOffscreenCanvasDistorted()) {
|
|
626
|
+
try {
|
|
627
|
+
return await readImageUsingVideoFrame(image, x, y, width, height);
|
|
628
|
+
} catch (e) {
|
|
629
|
+
// fall back to OffscreenCanvas
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return readImageDataUsingOffscreenCanvas(image, x, y, width, height);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
export interface Subscription {
|
|
636
|
+
unsubscribe(): void;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
export interface Subscriber {
|
|
640
|
+
addEventListener: typeof window.addEventListener;
|
|
641
|
+
removeEventListener: typeof window.removeEventListener;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* This method is used in order to register an event listener using a lambda function.
|
|
646
|
+
* The return value will allow unsubscribing from the event, without the need to store the method reference.
|
|
647
|
+
* @param target - The target
|
|
648
|
+
* @param message - The message
|
|
649
|
+
* @param listener - The listener
|
|
650
|
+
* @param options - The options
|
|
651
|
+
* @returns a subscription object that can be used to unsubscribe from the event
|
|
652
|
+
*/
|
|
653
|
+
export function subscribe(target: Subscriber, message: keyof WindowEventMap, listener: (...args: any) => void, options: boolean | AddEventListenerOptions): Subscription {
|
|
654
|
+
target.addEventListener(message, listener, options);
|
|
655
|
+
return {
|
|
656
|
+
unsubscribe: () => {
|
|
657
|
+
target.removeEventListener(message, listener, options);
|
|
658
|
+
}
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* This method converts degrees to radians.
|
|
664
|
+
* The return value is the radian value.
|
|
665
|
+
* @param degrees - The number of degrees
|
|
666
|
+
* @returns radians
|
|
667
|
+
*/
|
|
668
|
+
export function degreesToRadians(degrees: number): number {
|
|
669
|
+
return degrees * Math.PI / 180;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
/**
|
|
673
|
+
* Makes optional keys required and add the the undefined type.
|
|
674
|
+
*
|
|
675
|
+
* ```
|
|
676
|
+
* interface Test {
|
|
677
|
+
* foo: number;
|
|
678
|
+
* bar?: number;
|
|
679
|
+
* baz: number | undefined;
|
|
680
|
+
* }
|
|
681
|
+
*
|
|
682
|
+
* Complete<Test> {
|
|
683
|
+
* foo: number;
|
|
684
|
+
* bar: number | undefined;
|
|
685
|
+
* baz: number | undefined;
|
|
686
|
+
* }
|
|
687
|
+
*
|
|
688
|
+
* ```
|
|
689
|
+
*
|
|
690
|
+
* See https://medium.com/terria/typescript-transforming-optional-properties-to-required-properties-that-may-be-undefined-7482cb4e1585
|
|
691
|
+
*/
|
|
692
|
+
|
|
693
|
+
export type Complete<T> = {
|
|
694
|
+
[P in keyof Required<T>]: Pick<T, P> extends Required<Pick<T, P>> ? T[P] : (T[P] | undefined);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
export type TileJSON = {
|
|
698
|
+
tilejson: '2.2.0' | '2.1.0' | '2.0.1' | '2.0.0' | '1.0.0';
|
|
699
|
+
name?: string;
|
|
700
|
+
description?: string;
|
|
701
|
+
version?: string;
|
|
702
|
+
attribution?: string;
|
|
703
|
+
template?: string;
|
|
704
|
+
tiles: Array<string>;
|
|
705
|
+
grids?: Array<string>;
|
|
706
|
+
data?: Array<string>;
|
|
707
|
+
minzoom?: number;
|
|
708
|
+
maxzoom?: number;
|
|
709
|
+
bounds?: [number, number, number, number];
|
|
710
|
+
center?: [number, number, number];
|
|
711
|
+
vector_layers: [{id: string}]; // this is partial but enough for what we need
|
|
712
|
+
};
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* The maximum world tile zoom (Z).
|
|
716
|
+
* In other words, the upper bound supported for tile zoom.
|
|
717
|
+
*/
|
|
718
|
+
export const MAX_TILE_ZOOM = 25;
|
|
719
|
+
|
|
720
|
+
/**
|
|
721
|
+
* The minimum world tile zoom (Z).
|
|
722
|
+
* In other words, the lower bound supported for tile zoom.
|
|
723
|
+
*/
|
|
724
|
+
export const MIN_TILE_ZOOM = 0;
|