@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
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type {CollisionBoxArray} from './array_types.g';
|
|
2
|
+
import type {Style} from '../style/style';
|
|
3
|
+
import type {TypedStyleLayer} from '../style/style_layer/typed_style_layer';
|
|
4
|
+
import type {FeatureIndex} from './feature_index';
|
|
5
|
+
import type {Context} from '../gl/context';
|
|
6
|
+
import type {FeatureStates} from '../source/source_state';
|
|
7
|
+
import type {ImagePosition} from '../render/image_atlas';
|
|
8
|
+
import type {CanonicalTileID} from '../source/tile_id';
|
|
9
|
+
import type {VectorTileFeature, VectorTileLayer} from '@mapbox/vector-tile';
|
|
10
|
+
import Point from '@mapbox/point-geometry';
|
|
11
|
+
|
|
12
|
+
export type BucketParameters<Layer extends TypedStyleLayer> = {
|
|
13
|
+
index: number;
|
|
14
|
+
layers: Array<Layer>;
|
|
15
|
+
zoom: number;
|
|
16
|
+
pixelRatio: number;
|
|
17
|
+
overscaling: number;
|
|
18
|
+
collisionBoxArray: CollisionBoxArray;
|
|
19
|
+
sourceLayerIndex: number;
|
|
20
|
+
sourceID: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type PopulateParameters = {
|
|
24
|
+
featureIndex: FeatureIndex;
|
|
25
|
+
iconDependencies: {};
|
|
26
|
+
patternDependencies: {};
|
|
27
|
+
glyphDependencies: {};
|
|
28
|
+
availableImages: Array<string>;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type IndexedFeature = {
|
|
32
|
+
feature: VectorTileFeature;
|
|
33
|
+
id: number | string;
|
|
34
|
+
index: number;
|
|
35
|
+
sourceLayerIndex: number;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type BucketFeature = {
|
|
39
|
+
index: number;
|
|
40
|
+
sourceLayerIndex: number;
|
|
41
|
+
geometry: Array<Array<Point>>;
|
|
42
|
+
properties: any;
|
|
43
|
+
type: 0 | 1 | 2 | 3;
|
|
44
|
+
id?: any;
|
|
45
|
+
readonly patterns: {
|
|
46
|
+
[_: string]: {
|
|
47
|
+
'min': string;
|
|
48
|
+
'mid': string;
|
|
49
|
+
'max': string;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
sortKey?: number;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The `Bucket` interface is the single point of knowledge about turning vector
|
|
57
|
+
* tiles into WebGL buffers.
|
|
58
|
+
*
|
|
59
|
+
* `Bucket` is an abstract interface. An implementation exists for each style layer type.
|
|
60
|
+
* Create a bucket via the `StyleLayer#createBucket` method.
|
|
61
|
+
*
|
|
62
|
+
* The concrete bucket types, using layout options from the style layer,
|
|
63
|
+
* transform feature geometries into vertex and index data for use by the
|
|
64
|
+
* vertex shader. They also (via `ProgramConfiguration`) use feature
|
|
65
|
+
* properties and the zoom level to populate the attributes needed for
|
|
66
|
+
* data-driven styling.
|
|
67
|
+
*
|
|
68
|
+
* Buckets are designed to be built on a worker thread and then serialized and
|
|
69
|
+
* transferred back to the main thread for rendering. On the worker side, a
|
|
70
|
+
* bucket's vertex, index, and attribute data is stored in `bucket.arrays: ArrayGroup`.
|
|
71
|
+
* When a bucket's data is serialized and sent back to the main thread,
|
|
72
|
+
* is gets deserialized (using `new Bucket(serializedBucketData)`, with
|
|
73
|
+
* the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups
|
|
74
|
+
* hold the same data as ArrayGroups, but are tuned for consumption by WebGL.
|
|
75
|
+
*/
|
|
76
|
+
export interface Bucket {
|
|
77
|
+
layerIds: Array<string>;
|
|
78
|
+
hasPattern: boolean;
|
|
79
|
+
readonly layers: Array<any>;
|
|
80
|
+
readonly stateDependentLayers: Array<any>;
|
|
81
|
+
readonly stateDependentLayerIds: Array<string>;
|
|
82
|
+
populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID): void;
|
|
83
|
+
update(states: FeatureStates, vtLayer: VectorTileLayer, imagePositions: {[_: string]: ImagePosition}): void;
|
|
84
|
+
isEmpty(): boolean;
|
|
85
|
+
upload(context: Context): void;
|
|
86
|
+
uploadPending(): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Release the WebGL resources associated with the buffers. Note that because
|
|
89
|
+
* buckets are shared between layers having the same layout properties, they
|
|
90
|
+
* must be destroyed in groups (all buckets for a tile, or all symbol buckets).
|
|
91
|
+
*/
|
|
92
|
+
destroy(): void;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function deserialize(input: Array<Bucket>, style: Style): {[_: string]: Bucket} {
|
|
96
|
+
const output = {};
|
|
97
|
+
|
|
98
|
+
// Guard against the case where the map's style has been set to null while
|
|
99
|
+
// this bucket has been parsing.
|
|
100
|
+
if (!style) return output;
|
|
101
|
+
|
|
102
|
+
for (const bucket of input) {
|
|
103
|
+
const layers = bucket.layerIds
|
|
104
|
+
.map((id) => style.getLayer(id))
|
|
105
|
+
.filter(Boolean);
|
|
106
|
+
|
|
107
|
+
if (layers.length === 0) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// look up StyleLayer objects from layer ids (since we don't
|
|
112
|
+
// want to waste time serializing/copying them from the worker)
|
|
113
|
+
(bucket as any).layers = layers;
|
|
114
|
+
if (bucket.stateDependentLayerIds) {
|
|
115
|
+
(bucket as any).stateDependentLayers = bucket.stateDependentLayerIds.map((lId) => layers.filter((l) => l.id === lId)[0]);
|
|
116
|
+
}
|
|
117
|
+
for (const layer of layers) {
|
|
118
|
+
output[layer.id] = bucket;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return output;
|
|
123
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import {DEMData} from './dem_data';
|
|
2
|
+
import {RGBAImage} from '../util/image';
|
|
3
|
+
import {serialize, deserialize} from '../util/web_worker_transfer';
|
|
4
|
+
|
|
5
|
+
function createMockImage(height, width) {
|
|
6
|
+
// RGBAImage passed to constructor has uniform 1px padding on all sides.
|
|
7
|
+
height += 2;
|
|
8
|
+
width += 2;
|
|
9
|
+
const pixels = new Uint8Array(height * width * 4);
|
|
10
|
+
for (let i = 0; i < pixels.length; i++) {
|
|
11
|
+
pixels[i] = (i + 1) % 4 === 0 ? 1 : Math.floor(Math.random() * 256);
|
|
12
|
+
}
|
|
13
|
+
return new RGBAImage({height, width}, pixels);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function createMockClampImage(height, width) {
|
|
17
|
+
const pixels = new Uint8ClampedArray(height * width * 4);
|
|
18
|
+
for (let i = 0; i < pixels.length; i++) {
|
|
19
|
+
pixels[i] = (i + 1) % 4 === 0 ? 1 : Math.floor(Math.random() * 256);
|
|
20
|
+
}
|
|
21
|
+
return new RGBAImage({height, width}, pixels);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe('DEMData', () => {
|
|
25
|
+
describe('constructor', () => {
|
|
26
|
+
test('Uint8Array', () => {
|
|
27
|
+
const imageData0 = createMockImage(4, 4);
|
|
28
|
+
const dem = new DEMData('0', imageData0, 'mapbox');
|
|
29
|
+
expect(dem.uid).toBe('0');
|
|
30
|
+
expect(dem.dim).toBe(4);
|
|
31
|
+
expect(dem.stride).toBe(6);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('Uint8ClampedArray', () => {
|
|
35
|
+
const imageData0 = createMockClampImage(4, 4);
|
|
36
|
+
const dem = new DEMData('0', imageData0, 'mapbox');
|
|
37
|
+
expect(dem).not.toBeNull();
|
|
38
|
+
expect(dem['uid']).toBe('0');
|
|
39
|
+
expect(dem['dim']).toBe(2);
|
|
40
|
+
expect(dem['stride']).toBe(4);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('otherEncoding', () => {
|
|
44
|
+
const spyOnWarnConsole = jest.spyOn(console, 'warn').mockImplementation();
|
|
45
|
+
|
|
46
|
+
const imageData0 = createMockImage(4, 4);
|
|
47
|
+
new DEMData('0', imageData0, 'otherEncoding' as any);
|
|
48
|
+
|
|
49
|
+
expect(spyOnWarnConsole).toHaveBeenCalledTimes(1);
|
|
50
|
+
expect(spyOnWarnConsole.mock.calls).toEqual([['\"otherEncoding\" is not a valid encoding type. Valid types include \"mapbox\", \"terrarium\" and \"custom\".']]);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
function testDEMBorderRegion(dem: DEMData) {
|
|
56
|
+
return () => {
|
|
57
|
+
let nonempty = true;
|
|
58
|
+
for (let x = -1; x < 5; x++) {
|
|
59
|
+
for (let y = -1; y < 5; y++) {
|
|
60
|
+
if (dem.get(x, y) === -65536) {
|
|
61
|
+
nonempty = false;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
expect(nonempty).toBeTruthy();
|
|
67
|
+
|
|
68
|
+
let verticalBorderMatch = true;
|
|
69
|
+
for (const x of [-1, 4]) {
|
|
70
|
+
for (let y = 0; y < 4; y++) {
|
|
71
|
+
if (dem.get(x, y) !== dem.get(x < 0 ? x + 1 : x - 1, y)) {
|
|
72
|
+
verticalBorderMatch = false;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
expect(verticalBorderMatch).toBeTruthy();
|
|
78
|
+
|
|
79
|
+
// horizontal borders empty
|
|
80
|
+
let horizontalBorderMatch = true;
|
|
81
|
+
for (const y of [-1, 4]) {
|
|
82
|
+
for (let x = 0; x < 4; x++) {
|
|
83
|
+
if (dem.get(x, y) !== dem.get(x, y < 0 ? y + 1 : y - 1)) {
|
|
84
|
+
horizontalBorderMatch = false;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
expect(horizontalBorderMatch).toBeTruthy();
|
|
90
|
+
|
|
91
|
+
expect(dem.get(-1, 4) === dem.get(0, 3)).toBeTruthy();
|
|
92
|
+
expect(dem.get(4, 4) === dem.get(3, 3)).toBeTruthy();
|
|
93
|
+
expect(dem.get(-1, -1) === dem.get(0, 0)).toBeTruthy();
|
|
94
|
+
expect(dem.get(4, -1) === dem.get(3, 0)).toBeTruthy();
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function testDEMBackfill(dem0: DEMData, dem1: DEMData) {
|
|
99
|
+
return () => {
|
|
100
|
+
dem0.backfillBorder(dem1, -1, 0);
|
|
101
|
+
for (let y = 0; y < 4; y++) {
|
|
102
|
+
// dx = -1, dy = 0, so the left edge of dem1 should equal the right edge of dem0
|
|
103
|
+
expect(dem0.get(-1, y) === dem1.get(3, y)).toBeTruthy();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
dem0.backfillBorder(dem1, 0, -1);
|
|
107
|
+
for (let x = 0; x < 4; x++) {
|
|
108
|
+
expect(dem0.get(x, -1) === dem1.get(x, 3)).toBeTruthy();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
dem0.backfillBorder(dem1, 1, 0);
|
|
112
|
+
for (let y = 0; y < 4; y++) {
|
|
113
|
+
expect(dem0.get(4, y) === dem1.get(0, y)).toBeTruthy();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
dem0.backfillBorder(dem1, 0, 1);
|
|
117
|
+
for (let x = 0; x < 4; x++) {
|
|
118
|
+
expect(dem0.get(x, 4) === dem1.get(x, 0)).toBeTruthy();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
dem0.backfillBorder(dem1, -1, 1);
|
|
122
|
+
expect(dem0.get(-1, 4) === dem1.get(3, 0)).toBeTruthy();
|
|
123
|
+
|
|
124
|
+
dem0.backfillBorder(dem1, 1, 1);
|
|
125
|
+
expect(dem0.get(4, 4) === dem1.get(0, 0)).toBeTruthy();
|
|
126
|
+
|
|
127
|
+
dem0.backfillBorder(dem1, -1, -1);
|
|
128
|
+
expect(dem0.get(-1, -1) === dem1.get(3, 3)).toBeTruthy();
|
|
129
|
+
|
|
130
|
+
dem0.backfillBorder(dem1, 1, -1);
|
|
131
|
+
expect(dem0.get(4, -1) === dem1.get(0, 3)).toBeTruthy();
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
describe('DEMData#backfillBorder with encoding', () => {
|
|
136
|
+
describe('mapbox encoding', () => {
|
|
137
|
+
const dem0 = new DEMData('0', createMockImage(4, 4), 'mapbox');
|
|
138
|
+
const dem1 = new DEMData('1', createMockImage(4, 4), 'mapbox');
|
|
139
|
+
|
|
140
|
+
test('border region is initially populated with neighboring data', testDEMBorderRegion(dem0));
|
|
141
|
+
test('backfillBorder correctly populates borders with neighboring data', testDEMBackfill(dem0, dem1));
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe('terrarium encoding', () => {
|
|
145
|
+
const dem0 = new DEMData('0', createMockImage(4, 4), 'terrarium');
|
|
146
|
+
const dem1 = new DEMData('1', createMockImage(4, 4), 'terrarium');
|
|
147
|
+
|
|
148
|
+
test('border region is initially populated with neighboring data', testDEMBorderRegion(dem0));
|
|
149
|
+
test('backfillBorder correctly populates borders with neighboring data', testDEMBackfill(dem0, dem1));
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
function testSerialization(dem0: DEMData, redFactor: number, greenFactor: number, blueFactor: number, baseShift: number) {
|
|
154
|
+
return () => {
|
|
155
|
+
const serialized = serialize(dem0);
|
|
156
|
+
|
|
157
|
+
// calculate min/max values
|
|
158
|
+
let min = Number.MAX_SAFE_INTEGER;
|
|
159
|
+
let max = Number.MIN_SAFE_INTEGER;
|
|
160
|
+
for (let x = 0; x < 4; x++) {
|
|
161
|
+
for (let y = 0; y < 4; y++) {
|
|
162
|
+
const ele = dem0.get(x, y);
|
|
163
|
+
if (ele > max) max = ele;
|
|
164
|
+
if (ele < min) min = ele;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
expect(serialized).toEqual({
|
|
169
|
+
$name: 'DEMData',
|
|
170
|
+
uid: '0',
|
|
171
|
+
dim: 4,
|
|
172
|
+
stride: 6,
|
|
173
|
+
data: dem0.data,
|
|
174
|
+
redFactor,
|
|
175
|
+
greenFactor,
|
|
176
|
+
blueFactor,
|
|
177
|
+
baseShift,
|
|
178
|
+
max,
|
|
179
|
+
min,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const transferrables = [];
|
|
183
|
+
serialize(dem0, transferrables);
|
|
184
|
+
expect(new Uint32Array(transferrables[0])).toEqual(dem0.data);
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function testDeserialization(dem0: DEMData) {
|
|
189
|
+
return () => {
|
|
190
|
+
const serialized = serialize(dem0);
|
|
191
|
+
|
|
192
|
+
const deserialized = deserialize(serialized);
|
|
193
|
+
expect(deserialized).toEqual(dem0);
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
describe('DEMData is correctly serialized and deserialized', () => {
|
|
198
|
+
const mapboxDEM = new DEMData('0', createMockImage(4, 4), 'mapbox');
|
|
199
|
+
const terrariumDEM = new DEMData('0', createMockImage(4, 4), 'terrarium');
|
|
200
|
+
const customDEM = new DEMData('0', createMockImage(4, 4), 'custom', 1.0, 2.0, 3.0, 4.0);
|
|
201
|
+
test('serialized - mapbox', testSerialization(mapboxDEM, 6553.6, 25.6, 0.1, 10000));
|
|
202
|
+
test('serialized - terrarium', testSerialization(terrariumDEM, 256.0, 1.0, 1.0 / 256.0, 32768.0));
|
|
203
|
+
test('serialized - custom', testSerialization(customDEM, 1.0, 2.0, 3.0, 4.0));
|
|
204
|
+
|
|
205
|
+
test('deserialized - mapbox', testDeserialization(mapboxDEM));
|
|
206
|
+
test('deserialized - terrarium', testDeserialization(terrariumDEM));
|
|
207
|
+
test('deserialized - custom', testDeserialization(customDEM));
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
describe('UnpackVector is correctly returned', () => {
|
|
211
|
+
test('terrarium, mapbox and custom', () => {
|
|
212
|
+
const mapboxDEM = new DEMData('0', createMockImage(4, 4), 'mapbox');
|
|
213
|
+
const terrariumDEM = new DEMData('0', createMockImage(4, 4), 'terrarium');
|
|
214
|
+
const customDEM = new DEMData('0', createMockImage(4, 4), 'custom', 1.0, 2.0, 3.0, 4.0);
|
|
215
|
+
|
|
216
|
+
expect(terrariumDEM.getUnpackVector()).toEqual([256.0, 1.0, 1.0 / 256.0, 32768.0]);
|
|
217
|
+
expect(mapboxDEM.getUnpackVector()).toEqual([6553.6, 25.6, 0.1, 10000.0]);
|
|
218
|
+
expect(customDEM.getUnpackVector()).toEqual([1.0, 2.0, 3.0, 4.0]);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
function testGetPixels(dem: DEMData, imageData: RGBAImage) {
|
|
223
|
+
return () => {
|
|
224
|
+
expect(dem.getPixels()).toEqual(imageData);
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
describe('DEMData#getImage', () => {
|
|
229
|
+
const imageData = createMockImage(4, 4);
|
|
230
|
+
const mapboxDEM = new DEMData('0', imageData, 'terrarium');
|
|
231
|
+
const terrariumDEM = new DEMData('0', imageData, 'terrarium');
|
|
232
|
+
const customDEM = new DEMData('0', imageData, 'terrarium');
|
|
233
|
+
|
|
234
|
+
test('Image is correctly returned - mapbox', testGetPixels(mapboxDEM, imageData));
|
|
235
|
+
test('Image is correctly returned - terrarium', testGetPixels(terrariumDEM, imageData));
|
|
236
|
+
test('Image is correctly returned - custom', testGetPixels(customDEM, imageData));
|
|
237
|
+
});
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import {RGBAImage} from '../util/image';
|
|
2
|
+
|
|
3
|
+
import {warnOnce} from '../util/util';
|
|
4
|
+
import {register} from '../util/web_worker_transfer';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The possible DEM encoding types
|
|
8
|
+
*/
|
|
9
|
+
export type DEMEncoding = 'mapbox' | 'terrarium' | 'custom'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders
|
|
13
|
+
* data can be populated either from a pngraw image tile or from serialized data sent back from a worker. When data is initially
|
|
14
|
+
* loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the
|
|
15
|
+
* elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of
|
|
16
|
+
* integer overflow when creating the texture used in the hillshadePrepare step.
|
|
17
|
+
*
|
|
18
|
+
* DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8
|
|
19
|
+
* surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a
|
|
20
|
+
* tile's edge without backfilling from neighboring tiles.
|
|
21
|
+
*/
|
|
22
|
+
export class DEMData {
|
|
23
|
+
uid: string | number;
|
|
24
|
+
data: Uint32Array;
|
|
25
|
+
stride: number;
|
|
26
|
+
dim: number;
|
|
27
|
+
min: number;
|
|
28
|
+
max: number;
|
|
29
|
+
redFactor: number;
|
|
30
|
+
greenFactor: number;
|
|
31
|
+
blueFactor: number;
|
|
32
|
+
baseShift: number;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Constructs a `DEMData` object
|
|
36
|
+
* @param uid - the tile's unique id
|
|
37
|
+
* @param data - RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride
|
|
38
|
+
// and dim is calculated as stride - 2.
|
|
39
|
+
* @param encoding - the encoding type of the data
|
|
40
|
+
* @param redFactor - the red channel factor used to unpack the data, used for `custom` encoding only
|
|
41
|
+
* @param greenFactor - the green channel factor used to unpack the data, used for `custom` encoding only
|
|
42
|
+
* @param blueFactor - the blue channel factor used to unpack the data, used for `custom` encoding only
|
|
43
|
+
* @param baseShift - the base shift used to unpack the data, used for `custom` encoding only
|
|
44
|
+
*/
|
|
45
|
+
constructor(uid: string | number, data: RGBAImage | ImageData, encoding: DEMEncoding, redFactor = 1.0, greenFactor = 1.0, blueFactor = 1.0, baseShift = 0.0) {
|
|
46
|
+
this.uid = uid;
|
|
47
|
+
if (data.height !== data.width) throw new RangeError('DEM tiles must be square');
|
|
48
|
+
if (encoding && !['mapbox', 'terrarium', 'custom'].includes(encoding)) {
|
|
49
|
+
warnOnce(`"${encoding}" is not a valid encoding type. Valid types include "mapbox", "terrarium" and "custom".`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.stride = data.height;
|
|
53
|
+
const dim = this.dim = data.height - 2;
|
|
54
|
+
this.data = new Uint32Array(data.data.buffer);
|
|
55
|
+
switch (encoding) {
|
|
56
|
+
case 'terrarium':
|
|
57
|
+
// unpacking formula for mapzen terrarium:
|
|
58
|
+
// https://aws.amazon.com/public-datasets/terrain/
|
|
59
|
+
this.redFactor = 256.0;
|
|
60
|
+
this.greenFactor = 1.0;
|
|
61
|
+
this.blueFactor = 1.0 / 256.0;
|
|
62
|
+
this.baseShift = 32768.0;
|
|
63
|
+
break;
|
|
64
|
+
case 'custom':
|
|
65
|
+
this.redFactor = redFactor;
|
|
66
|
+
this.greenFactor = greenFactor;
|
|
67
|
+
this.blueFactor = blueFactor;
|
|
68
|
+
this.baseShift = baseShift;
|
|
69
|
+
break;
|
|
70
|
+
case 'mapbox':
|
|
71
|
+
default:
|
|
72
|
+
// unpacking formula for mapbox.terrain-rgb:
|
|
73
|
+
// https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb
|
|
74
|
+
this.redFactor = 6553.6;
|
|
75
|
+
this.greenFactor = 25.6;
|
|
76
|
+
this.blueFactor = 0.1;
|
|
77
|
+
this.baseShift = 10000.0;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image
|
|
82
|
+
// with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring
|
|
83
|
+
// tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder
|
|
84
|
+
for (let x = 0; x < dim; x++) {
|
|
85
|
+
// left vertical border
|
|
86
|
+
this.data[this._idx(-1, x)] = this.data[this._idx(0, x)];
|
|
87
|
+
// right vertical border
|
|
88
|
+
this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)];
|
|
89
|
+
// left horizontal border
|
|
90
|
+
this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)];
|
|
91
|
+
// right horizontal border
|
|
92
|
+
this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)];
|
|
93
|
+
}
|
|
94
|
+
// corners
|
|
95
|
+
this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)];
|
|
96
|
+
this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)];
|
|
97
|
+
this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)];
|
|
98
|
+
this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)];
|
|
99
|
+
|
|
100
|
+
// calculate min/max values
|
|
101
|
+
this.min = Number.MAX_SAFE_INTEGER;
|
|
102
|
+
this.max = Number.MIN_SAFE_INTEGER;
|
|
103
|
+
for (let x = 0; x < dim; x++) {
|
|
104
|
+
for (let y = 0; y < dim; y++) {
|
|
105
|
+
const ele = this.get(x, y);
|
|
106
|
+
if (ele > this.max) this.max = ele;
|
|
107
|
+
if (ele < this.min) this.min = ele;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get(x: number, y: number) {
|
|
113
|
+
const pixels = new Uint8Array(this.data.buffer);
|
|
114
|
+
const index = this._idx(x, y) * 4;
|
|
115
|
+
return this.unpack(pixels[index], pixels[index + 1], pixels[index + 2]);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
getUnpackVector() {
|
|
119
|
+
return [this.redFactor, this.greenFactor, this.blueFactor, this.baseShift];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
_idx(x: number, y: number) {
|
|
123
|
+
if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) throw new RangeError('out of range source coordinates for DEM data');
|
|
124
|
+
return (y + 1) * this.stride + (x + 1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
unpack(r: number, g: number, b: number) {
|
|
128
|
+
return (r * this.redFactor + g * this.greenFactor + b * this.blueFactor - this.baseShift);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
getPixels() {
|
|
132
|
+
return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
backfillBorder(borderTile: DEMData, dx: number, dy: number) {
|
|
136
|
+
if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch');
|
|
137
|
+
|
|
138
|
+
let xMin = dx * this.dim,
|
|
139
|
+
xMax = dx * this.dim + this.dim,
|
|
140
|
+
yMin = dy * this.dim,
|
|
141
|
+
yMax = dy * this.dim + this.dim;
|
|
142
|
+
|
|
143
|
+
switch (dx) {
|
|
144
|
+
case -1:
|
|
145
|
+
xMin = xMax - 1;
|
|
146
|
+
break;
|
|
147
|
+
case 1:
|
|
148
|
+
xMax = xMin + 1;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
switch (dy) {
|
|
153
|
+
case -1:
|
|
154
|
+
yMin = yMax - 1;
|
|
155
|
+
break;
|
|
156
|
+
case 1:
|
|
157
|
+
yMax = yMin + 1;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const ox = -dx * this.dim;
|
|
162
|
+
const oy = -dy * this.dim;
|
|
163
|
+
for (let y = yMin; y < yMax; y++) {
|
|
164
|
+
for (let x = xMin; x < xMax; x++) {
|
|
165
|
+
this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
register('DEMData', DEMData);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {loadGeometry} from './load_geometry';
|
|
2
|
+
import type Point from '@mapbox/point-geometry';
|
|
3
|
+
import type {VectorTileFeature} from '@mapbox/vector-tile';
|
|
4
|
+
import type {Feature} from '@maplibre/maplibre-gl-style-spec';
|
|
5
|
+
|
|
6
|
+
type EvaluationFeature = Feature & { geometry: Array<Array<Point>> };
|
|
7
|
+
/**
|
|
8
|
+
* Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which
|
|
9
|
+
* will be loaded based on necessity.
|
|
10
|
+
* @param feature - the feature to evaluate
|
|
11
|
+
* @param needGeometry - if set to true this will load the geometry
|
|
12
|
+
*/
|
|
13
|
+
export function toEvaluationFeature(feature: VectorTileFeature, needGeometry: boolean): EvaluationFeature {
|
|
14
|
+
return {type: feature.type,
|
|
15
|
+
id: feature.id,
|
|
16
|
+
properties: feature.properties,
|
|
17
|
+
geometry: needGeometry ? loadGeometry(feature) : []};
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The maximum value of a coordinate in the internal tile coordinate system. Coordinates of
|
|
3
|
+
* all source features normalized to this extent upon load.
|
|
4
|
+
*
|
|
5
|
+
* The value is a consequence of the following:
|
|
6
|
+
*
|
|
7
|
+
* * Vertex buffer store positions as signed 16 bit integers.
|
|
8
|
+
* * One bit is lost for signedness to support tile buffers.
|
|
9
|
+
* * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.
|
|
10
|
+
* * One bit is lost to support features extending past the extent on the right edge of the tile.
|
|
11
|
+
* * This leaves us with 2^13 = 8192
|
|
12
|
+
*/
|
|
13
|
+
export const EXTENT = 8192;
|