@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,47 @@
|
|
|
1
|
+
import {pick, extend, TileJSON} from '../util/util';
|
|
2
|
+
import {getJSON} from '../util/ajax';
|
|
3
|
+
import {ResourceType} from '../util/request_manager';
|
|
4
|
+
import {browser} from '../util/browser';
|
|
5
|
+
|
|
6
|
+
import type {RequestManager} from '../util/request_manager';
|
|
7
|
+
import type {RasterDEMSourceSpecification, RasterSourceSpecification, VectorSourceSpecification} from '@maplibre/maplibre-gl-style-spec';
|
|
8
|
+
|
|
9
|
+
export type LoadTileJsonResponse = {
|
|
10
|
+
tiles: Array<string>;
|
|
11
|
+
minzoom: number;
|
|
12
|
+
maxzoom: number;
|
|
13
|
+
attribution: string;
|
|
14
|
+
bounds: RasterSourceSpecification['bounds'];
|
|
15
|
+
scheme: RasterSourceSpecification['scheme'];
|
|
16
|
+
tileSize: number;
|
|
17
|
+
encoding: RasterDEMSourceSpecification['encoding'];
|
|
18
|
+
vectorLayerIds?: Array<string>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function loadTileJson(
|
|
22
|
+
options: RasterSourceSpecification | RasterDEMSourceSpecification | VectorSourceSpecification,
|
|
23
|
+
requestManager: RequestManager,
|
|
24
|
+
abortController: AbortController,
|
|
25
|
+
): Promise<LoadTileJsonResponse | null> {
|
|
26
|
+
let tileJSON: TileJSON | typeof options = options;
|
|
27
|
+
if (options.url) {
|
|
28
|
+
const response = await getJSON<TileJSON>(requestManager.transformRequest(options.url, ResourceType.Source), abortController);
|
|
29
|
+
tileJSON = response.data;
|
|
30
|
+
} else {
|
|
31
|
+
await browser.frameAsync(abortController);
|
|
32
|
+
}
|
|
33
|
+
if (!tileJSON) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const result = pick(
|
|
37
|
+
// explicit source options take precedence over TileJSON
|
|
38
|
+
extend(tileJSON, options),
|
|
39
|
+
['tiles', 'minzoom', 'maxzoom', 'attribution', 'bounds', 'scheme', 'tileSize', 'encoding']
|
|
40
|
+
) as LoadTileJsonResponse;
|
|
41
|
+
|
|
42
|
+
if ('vector_layers' in tileJSON && tileJSON.vector_layers) {
|
|
43
|
+
result.vectorLayerIds = tileJSON.vector_layers.map((layer) => { return layer.id; });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {EXTENT} from '../data/extent';
|
|
2
|
+
|
|
3
|
+
import type {OverscaledTileID} from './tile_id';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Converts a pixel value at a the given zoom level to tile units.
|
|
7
|
+
*
|
|
8
|
+
* The shaders mostly calculate everything in tile units so style
|
|
9
|
+
* properties need to be converted from pixels to tile units using this.
|
|
10
|
+
*
|
|
11
|
+
* For example, a translation by 30 pixels at zoom 6.5 will be a
|
|
12
|
+
* translation by pixelsToTileUnits(30, 6.5) tile units.
|
|
13
|
+
*
|
|
14
|
+
* @returns value in tile units
|
|
15
|
+
*/
|
|
16
|
+
export function pixelsToTileUnits(
|
|
17
|
+
tile: {
|
|
18
|
+
tileID: OverscaledTileID;
|
|
19
|
+
tileSize: number;
|
|
20
|
+
},
|
|
21
|
+
pixelValue: number,
|
|
22
|
+
z: number
|
|
23
|
+
): number {
|
|
24
|
+
return pixelValue * (EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ)));
|
|
25
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {AddProtocolAction, config} from '../util/config';
|
|
2
|
+
|
|
3
|
+
export function getProtocol(url: string) {
|
|
4
|
+
return config.REGISTERED_PROTOCOLS[url.substring(0, url.indexOf('://'))];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Adds a custom load resource function that will be called when using a URL that starts with a custom url schema.
|
|
8
|
+
* This will happen in the main thread, and workers might call it if they don't know how to handle the protocol.
|
|
9
|
+
* The example below will be triggered for custom:// urls defined in the sources list in the style definitions.
|
|
10
|
+
* The function passed will receive the request parameters and should return with the resulting resource,
|
|
11
|
+
* for example a pbf vector tile, non-compressed, represented as ArrayBuffer.
|
|
12
|
+
*
|
|
13
|
+
* @param customProtocol - the protocol to hook, for example 'custom'
|
|
14
|
+
* @param loadFn - the function to use when trying to fetch a tile specified by the customProtocol
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* // This will fetch a file using the fetch API (this is obviously a non interesting example...)
|
|
18
|
+
* addProtocol('custom', async (params, abortController) => {
|
|
19
|
+
* const t = await fetch(`https://${params.url.split("://")[1]}`);
|
|
20
|
+
* if (t.status == 200) {
|
|
21
|
+
* const buffer = await t.arrayBuffer();
|
|
22
|
+
* return {data: buffer}
|
|
23
|
+
* } else {
|
|
24
|
+
* throw new Error(`Tile fetch error: ${t.statusText}`);
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* // the following is an example of a way to return an error when trying to load a tile
|
|
28
|
+
* addProtocol('custom2', async (params, abortController) => {
|
|
29
|
+
* throw new Error('someErrorMessage'));
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function addProtocol(customProtocol: string, loadFn: AddProtocolAction) {
|
|
34
|
+
config.REGISTERED_PROTOCOLS[customProtocol] = loadFn;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Removes a previously added protocol in the main thread.
|
|
39
|
+
*
|
|
40
|
+
* @param customProtocol - the custom protocol to remove registration for
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* removeProtocol('custom');
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function removeProtocol(customProtocol: string) {
|
|
47
|
+
delete config.REGISTERED_PROTOCOLS[customProtocol];
|
|
48
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
queryRenderedFeatures,
|
|
3
|
+
querySourceFeatures
|
|
4
|
+
} from './query_features';
|
|
5
|
+
import {SourceCache} from './source_cache';
|
|
6
|
+
import {Transform} from '../geo/transform';
|
|
7
|
+
import Point from '@mapbox/point-geometry';
|
|
8
|
+
|
|
9
|
+
describe('QueryFeatures#rendered', () => {
|
|
10
|
+
test('returns empty object if source returns no tiles', () => {
|
|
11
|
+
const mockSourceCache = {tilesIn () { return []; }} as any as SourceCache;
|
|
12
|
+
const transform = new Transform();
|
|
13
|
+
const result = queryRenderedFeatures(mockSourceCache, {}, undefined, [] as Point[], undefined, transform);
|
|
14
|
+
expect(result).toEqual({});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('QueryFeatures#source', () => {
|
|
20
|
+
test('returns empty result when source has no features', () => {
|
|
21
|
+
const sourceCache = new SourceCache('test', {
|
|
22
|
+
type: 'geojson',
|
|
23
|
+
data: {type: 'FeatureCollection', features: []}
|
|
24
|
+
}, {
|
|
25
|
+
getActor() {}
|
|
26
|
+
} as any);
|
|
27
|
+
const result = querySourceFeatures(sourceCache, {});
|
|
28
|
+
expect(result).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
});
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import type {SourceCache} from './source_cache';
|
|
2
|
+
import type {StyleLayer} from '../style/style_layer';
|
|
3
|
+
import type {CollisionIndex} from '../symbol/collision_index';
|
|
4
|
+
import type {Transform} from '../geo/transform';
|
|
5
|
+
import type {RetainedQueryData} from '../symbol/placement';
|
|
6
|
+
import type {FilterSpecification} from '@maplibre/maplibre-gl-style-spec';
|
|
7
|
+
import type {MapGeoJSONFeature} from '../util/vectortile_to_geojson';
|
|
8
|
+
import type Point from '@mapbox/point-geometry';
|
|
9
|
+
import {mat4} from 'gl-matrix';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Options to pass to query the map for the rendered features
|
|
13
|
+
*/
|
|
14
|
+
export type QueryRenderedFeaturesOptions = {
|
|
15
|
+
/**
|
|
16
|
+
* An array of [style layer IDs](https://maplibre.org/maplibre-style-spec/#layer-id) for the query to inspect.
|
|
17
|
+
* Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.
|
|
18
|
+
*/
|
|
19
|
+
layers?: Array<string>;
|
|
20
|
+
/**
|
|
21
|
+
* A [filter](https://maplibre.org/maplibre-style-spec/layers/#filter) to limit query results.
|
|
22
|
+
*/
|
|
23
|
+
filter?: FilterSpecification;
|
|
24
|
+
/**
|
|
25
|
+
* An array of string representing the available images
|
|
26
|
+
*/
|
|
27
|
+
availableImages?: Array<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Whether to check if the [options.filter] conforms to the MapLibre Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
|
30
|
+
*/
|
|
31
|
+
validate?: boolean;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The options object related to the {@link Map#querySourceFeatures} method
|
|
36
|
+
*/
|
|
37
|
+
export type QuerySourceFeatureOptions = {
|
|
38
|
+
/**
|
|
39
|
+
* The name of the source layer to query. *For vector tile sources, this parameter is required.* For GeoJSON sources, it is ignored.
|
|
40
|
+
*/
|
|
41
|
+
sourceLayer?: string;
|
|
42
|
+
/**
|
|
43
|
+
* A [filter](https://maplibre.org/maplibre-style-spec/layers/#filter)
|
|
44
|
+
* to limit query results.
|
|
45
|
+
*/
|
|
46
|
+
filter?: FilterSpecification;
|
|
47
|
+
/**
|
|
48
|
+
* Whether to check if the [parameters.filter] conforms to the MapLibre Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function.
|
|
49
|
+
* @defaultValue true
|
|
50
|
+
*/
|
|
51
|
+
validate?: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates.
|
|
56
|
+
*/
|
|
57
|
+
function getPixelPosMatrix(transform, tileID) {
|
|
58
|
+
const t = mat4.create();
|
|
59
|
+
mat4.translate(t, t, [1, 1, 0]);
|
|
60
|
+
mat4.scale(t, t, [transform.width * 0.5, transform.height * 0.5, 1]);
|
|
61
|
+
return mat4.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped()));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function queryIncludes3DLayer(layers: Array<string>, styleLayers: {[_: string]: StyleLayer}, sourceID: string) {
|
|
65
|
+
if (layers) {
|
|
66
|
+
for (const layerID of layers) {
|
|
67
|
+
const layer = styleLayers[layerID];
|
|
68
|
+
if (layer && layer.source === sourceID && layer.type === 'fill-extrusion') {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
for (const key in styleLayers) {
|
|
74
|
+
const layer = styleLayers[key];
|
|
75
|
+
if (layer.source === sourceID && layer.type === 'fill-extrusion') {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function queryRenderedFeatures(
|
|
84
|
+
sourceCache: SourceCache,
|
|
85
|
+
styleLayers: {[_: string]: StyleLayer},
|
|
86
|
+
serializedLayers: {[_: string]: any},
|
|
87
|
+
queryGeometry: Array<Point>,
|
|
88
|
+
params: QueryRenderedFeaturesOptions,
|
|
89
|
+
transform: Transform
|
|
90
|
+
): { [key: string]: Array<{featureIndex: number; feature: MapGeoJSONFeature}> } {
|
|
91
|
+
|
|
92
|
+
const has3DLayer = queryIncludes3DLayer(params && params.layers, styleLayers, sourceCache.id);
|
|
93
|
+
const maxPitchScaleFactor = transform.maxPitchScaleFactor();
|
|
94
|
+
const tilesIn = sourceCache.tilesIn(queryGeometry, maxPitchScaleFactor, has3DLayer);
|
|
95
|
+
|
|
96
|
+
tilesIn.sort(sortTilesIn);
|
|
97
|
+
const renderedFeatureLayers = [];
|
|
98
|
+
for (const tileIn of tilesIn) {
|
|
99
|
+
renderedFeatureLayers.push({
|
|
100
|
+
wrappedTileID: tileIn.tileID.wrapped().key,
|
|
101
|
+
queryResults: tileIn.tile.queryRenderedFeatures(
|
|
102
|
+
styleLayers,
|
|
103
|
+
serializedLayers,
|
|
104
|
+
sourceCache._state,
|
|
105
|
+
tileIn.queryGeometry,
|
|
106
|
+
tileIn.cameraQueryGeometry,
|
|
107
|
+
tileIn.scale,
|
|
108
|
+
params,
|
|
109
|
+
transform,
|
|
110
|
+
maxPitchScaleFactor,
|
|
111
|
+
getPixelPosMatrix(sourceCache.transform, tileIn.tileID))
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const result = mergeRenderedFeatureLayers(renderedFeatureLayers);
|
|
116
|
+
|
|
117
|
+
// Merge state from SourceCache into the results
|
|
118
|
+
for (const layerID in result) {
|
|
119
|
+
result[layerID].forEach((featureWrapper) => {
|
|
120
|
+
const feature = featureWrapper.feature as MapGeoJSONFeature;
|
|
121
|
+
const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);
|
|
122
|
+
feature.source = feature.layer.source;
|
|
123
|
+
if (feature.layer['source-layer']) {
|
|
124
|
+
feature.sourceLayer = feature.layer['source-layer'];
|
|
125
|
+
}
|
|
126
|
+
feature.state = state;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function queryRenderedSymbols(styleLayers: {[_: string]: StyleLayer},
|
|
133
|
+
serializedLayers: {[_: string]: StyleLayer},
|
|
134
|
+
sourceCaches: {[_: string]: SourceCache},
|
|
135
|
+
queryGeometry: Array<Point>,
|
|
136
|
+
params: QueryRenderedFeaturesOptions,
|
|
137
|
+
collisionIndex: CollisionIndex,
|
|
138
|
+
retainedQueryData: {
|
|
139
|
+
[_: number]: RetainedQueryData;
|
|
140
|
+
}) {
|
|
141
|
+
const result = {};
|
|
142
|
+
const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry);
|
|
143
|
+
const bucketQueryData = [];
|
|
144
|
+
for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) {
|
|
145
|
+
bucketQueryData.push(retainedQueryData[bucketInstanceId]);
|
|
146
|
+
}
|
|
147
|
+
bucketQueryData.sort(sortTilesIn);
|
|
148
|
+
|
|
149
|
+
for (const queryData of bucketQueryData) {
|
|
150
|
+
const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures(
|
|
151
|
+
renderedSymbols[queryData.bucketInstanceId],
|
|
152
|
+
serializedLayers,
|
|
153
|
+
queryData.bucketIndex,
|
|
154
|
+
queryData.sourceLayerIndex,
|
|
155
|
+
params.filter,
|
|
156
|
+
params.layers,
|
|
157
|
+
params.availableImages,
|
|
158
|
+
styleLayers);
|
|
159
|
+
|
|
160
|
+
for (const layerID in bucketSymbols) {
|
|
161
|
+
const resultFeatures = result[layerID] = result[layerID] || [];
|
|
162
|
+
const layerSymbols = bucketSymbols[layerID];
|
|
163
|
+
layerSymbols.sort((a, b) => {
|
|
164
|
+
// Match topDownFeatureComparator from FeatureIndex, but using
|
|
165
|
+
// most recent sorting of features from bucket.sortFeatures
|
|
166
|
+
const featureSortOrder = queryData.featureSortOrder;
|
|
167
|
+
if (featureSortOrder) {
|
|
168
|
+
// queryRenderedSymbols documentation says we'll return features in
|
|
169
|
+
// "top-to-bottom" rendering order (aka last-to-first).
|
|
170
|
+
// Actually there can be multiple symbol instances per feature, so
|
|
171
|
+
// we sort each feature based on the first matching symbol instance.
|
|
172
|
+
const sortedA = featureSortOrder.indexOf(a.featureIndex);
|
|
173
|
+
const sortedB = featureSortOrder.indexOf(b.featureIndex);
|
|
174
|
+
return sortedB - sortedA;
|
|
175
|
+
} else {
|
|
176
|
+
// Bucket hasn't been re-sorted based on angle, so use the
|
|
177
|
+
// reverse of the order the features appeared in the data.
|
|
178
|
+
return b.featureIndex - a.featureIndex;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
for (const symbolFeature of layerSymbols) {
|
|
182
|
+
resultFeatures.push(symbolFeature);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Merge state from SourceCache into the results
|
|
188
|
+
for (const layerName in result) {
|
|
189
|
+
result[layerName].forEach((featureWrapper) => {
|
|
190
|
+
const feature = featureWrapper.feature;
|
|
191
|
+
const layer = styleLayers[layerName];
|
|
192
|
+
const sourceCache = sourceCaches[layer.source];
|
|
193
|
+
const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id);
|
|
194
|
+
feature.source = feature.layer.source;
|
|
195
|
+
if (feature.layer['source-layer']) {
|
|
196
|
+
feature.sourceLayer = feature.layer['source-layer'];
|
|
197
|
+
}
|
|
198
|
+
feature.state = state;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export function querySourceFeatures(sourceCache: SourceCache, params: QuerySourceFeatureOptions) {
|
|
205
|
+
const tiles = sourceCache.getRenderableIds().map((id) => {
|
|
206
|
+
return sourceCache.getTileByID(id);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const result = [];
|
|
210
|
+
|
|
211
|
+
const dataTiles = {};
|
|
212
|
+
for (let i = 0; i < tiles.length; i++) {
|
|
213
|
+
const tile = tiles[i];
|
|
214
|
+
const dataID = tile.tileID.canonical.key;
|
|
215
|
+
if (!dataTiles[dataID]) {
|
|
216
|
+
dataTiles[dataID] = true;
|
|
217
|
+
tile.querySourceFeatures(result, params);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function sortTilesIn(a, b) {
|
|
225
|
+
const idA = a.tileID;
|
|
226
|
+
const idB = b.tileID;
|
|
227
|
+
return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function mergeRenderedFeatureLayers(tiles) {
|
|
231
|
+
// Merge results from all tiles, but if two tiles share the same
|
|
232
|
+
// wrapped ID, don't duplicate features between the two tiles
|
|
233
|
+
const result = {};
|
|
234
|
+
const wrappedIDLayerMap = {};
|
|
235
|
+
for (const tile of tiles) {
|
|
236
|
+
const queryResults = tile.queryResults;
|
|
237
|
+
const wrappedID = tile.wrappedTileID;
|
|
238
|
+
const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {};
|
|
239
|
+
for (const layerID in queryResults) {
|
|
240
|
+
const tileFeatures = queryResults[layerID];
|
|
241
|
+
const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {};
|
|
242
|
+
const resultFeatures = result[layerID] = result[layerID] || [];
|
|
243
|
+
for (const tileFeature of tileFeatures) {
|
|
244
|
+
if (!wrappedIDFeatures[tileFeature.featureIndex]) {
|
|
245
|
+
wrappedIDFeatures[tileFeature.featureIndex] = true;
|
|
246
|
+
resultFeatures.push(tileFeature);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import {fakeServer, FakeServer} from 'nise';
|
|
2
|
+
import {RasterDEMTileSource} from './raster_dem_tile_source';
|
|
3
|
+
import {OverscaledTileID} from './tile_id';
|
|
4
|
+
import {RequestManager} from '../util/request_manager';
|
|
5
|
+
import {Tile} from './tile';
|
|
6
|
+
import {waitForMetadataEvent} from '../util/test/util';
|
|
7
|
+
|
|
8
|
+
function createSource(options, transformCallback?) {
|
|
9
|
+
const source = new RasterDEMTileSource('id', options, {} as any, options.eventedParent);
|
|
10
|
+
source.onAdd({
|
|
11
|
+
transform: {angle: 0, pitch: 0, showCollisionBoxes: false},
|
|
12
|
+
_getMapId: () => 1,
|
|
13
|
+
_requestManager: new RequestManager(transformCallback),
|
|
14
|
+
getPixelRatio() { return 1; }
|
|
15
|
+
} as any);
|
|
16
|
+
|
|
17
|
+
source.on('error', (e) => {
|
|
18
|
+
throw e.error;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return source;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
describe('RasterDEMTileSource', () => {
|
|
25
|
+
let server: FakeServer;
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
global.fetch = null;
|
|
28
|
+
server = fakeServer.create();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
server.restore();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('transforms request for TileJSON URL', () => {
|
|
36
|
+
server.respondWith('/source.json', JSON.stringify({
|
|
37
|
+
minzoom: 0,
|
|
38
|
+
maxzoom: 22,
|
|
39
|
+
attribution: 'MapLibre',
|
|
40
|
+
tiles: ['http://example.com/{z}/{x}/{y}.pngraw'],
|
|
41
|
+
bounds: [-47, -7, -45, -5]
|
|
42
|
+
}));
|
|
43
|
+
const transformSpy = jest.fn().mockImplementation((url) => {
|
|
44
|
+
return {url};
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
createSource({url: '/source.json'}, transformSpy);
|
|
48
|
+
server.respond();
|
|
49
|
+
|
|
50
|
+
expect(transformSpy.mock.calls[0][0]).toBe('/source.json');
|
|
51
|
+
expect(transformSpy.mock.calls[0][1]).toBe('Source');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('transforms tile urls before requesting', async () => {
|
|
55
|
+
server.respondWith('/source.json', JSON.stringify({
|
|
56
|
+
minzoom: 0,
|
|
57
|
+
maxzoom: 22,
|
|
58
|
+
attribution: 'MapLibre',
|
|
59
|
+
tiles: ['http://example.com/{z}/{x}/{y}.png'],
|
|
60
|
+
bounds: [-47, -7, -45, -5]
|
|
61
|
+
}));
|
|
62
|
+
const source = createSource({url: '/source.json'});
|
|
63
|
+
const transformSpy = jest.spyOn(source.map._requestManager, 'transformRequest');
|
|
64
|
+
const promise = waitForMetadataEvent(source);
|
|
65
|
+
server.respond();
|
|
66
|
+
await promise;
|
|
67
|
+
const tile = {
|
|
68
|
+
tileID: new OverscaledTileID(10, 0, 10, 5, 5),
|
|
69
|
+
state: 'loading',
|
|
70
|
+
loadVectorData () {},
|
|
71
|
+
setExpiryData() {}
|
|
72
|
+
} as any as Tile;
|
|
73
|
+
source.loadTile(tile);
|
|
74
|
+
|
|
75
|
+
expect(transformSpy).toHaveBeenCalledTimes(1);
|
|
76
|
+
expect(transformSpy.mock.calls[0][0]).toBe('http://example.com/10/5/5.png');
|
|
77
|
+
expect(transformSpy.mock.calls[0][1]).toBe('Tile');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('populates neighboringTiles', async () => {
|
|
81
|
+
server.respondWith('/source.json', JSON.stringify({
|
|
82
|
+
minzoom: 0,
|
|
83
|
+
maxzoom: 22,
|
|
84
|
+
attribution: 'MapLibre',
|
|
85
|
+
tiles: ['http://example.com/{z}/{x}/{y}.png']
|
|
86
|
+
}));
|
|
87
|
+
const source = createSource({url: '/source.json'});
|
|
88
|
+
const promise = waitForMetadataEvent(source);
|
|
89
|
+
server.respond();
|
|
90
|
+
await promise;
|
|
91
|
+
const tile = {
|
|
92
|
+
tileID: new OverscaledTileID(10, 0, 10, 5, 5),
|
|
93
|
+
state: 'loading',
|
|
94
|
+
loadVectorData () {},
|
|
95
|
+
setExpiryData() {}
|
|
96
|
+
} as any as Tile;
|
|
97
|
+
source.loadTile(tile);
|
|
98
|
+
|
|
99
|
+
expect(Object.keys(tile.neighboringTiles)).toEqual([
|
|
100
|
+
new OverscaledTileID(10, 0, 10, 4, 5).key,
|
|
101
|
+
new OverscaledTileID(10, 0, 10, 6, 5).key,
|
|
102
|
+
new OverscaledTileID(10, 0, 10, 4, 4).key,
|
|
103
|
+
new OverscaledTileID(10, 0, 10, 5, 4).key,
|
|
104
|
+
new OverscaledTileID(10, 0, 10, 6, 4).key,
|
|
105
|
+
new OverscaledTileID(10, 0, 10, 4, 6).key,
|
|
106
|
+
new OverscaledTileID(10, 0, 10, 5, 6).key,
|
|
107
|
+
new OverscaledTileID(10, 0, 10, 6, 6).key
|
|
108
|
+
]);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('populates neighboringTiles with wrapped tiles', async () => {
|
|
112
|
+
server.respondWith('/source.json', JSON.stringify({
|
|
113
|
+
minzoom: 0,
|
|
114
|
+
maxzoom: 22,
|
|
115
|
+
attribution: 'MapLibre',
|
|
116
|
+
tiles: ['http://example.com/{z}/{x}/{y}.png']
|
|
117
|
+
}));
|
|
118
|
+
|
|
119
|
+
const source = createSource({url: '/source.json'});
|
|
120
|
+
const promise = waitForMetadataEvent(source);
|
|
121
|
+
|
|
122
|
+
server.respond();
|
|
123
|
+
await promise;
|
|
124
|
+
|
|
125
|
+
const tile = {
|
|
126
|
+
tileID: new OverscaledTileID(5, 0, 5, 31, 5),
|
|
127
|
+
state: 'loading',
|
|
128
|
+
loadVectorData() {},
|
|
129
|
+
setExpiryData() {}
|
|
130
|
+
} as any as Tile;
|
|
131
|
+
source.loadTile(tile);
|
|
132
|
+
|
|
133
|
+
expect(Object.keys(tile.neighboringTiles)).toEqual([
|
|
134
|
+
new OverscaledTileID(5, 0, 5, 30, 6).key,
|
|
135
|
+
new OverscaledTileID(5, 0, 5, 31, 6).key,
|
|
136
|
+
new OverscaledTileID(5, 0, 5, 30, 5).key,
|
|
137
|
+
new OverscaledTileID(5, 1, 5, 0, 5).key,
|
|
138
|
+
new OverscaledTileID(5, 0, 5, 30, 4).key,
|
|
139
|
+
new OverscaledTileID(5, 0, 5, 31, 4).key,
|
|
140
|
+
new OverscaledTileID(5, 1, 5, 0, 4).key,
|
|
141
|
+
new OverscaledTileID(5, 1, 5, 0, 6).key
|
|
142
|
+
]);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('serializes options', () => {
|
|
146
|
+
const source = createSource({
|
|
147
|
+
tiles: ['http://localhost:2900/raster-dem/{z}/{x}/{y}.png'],
|
|
148
|
+
minzoom: 2,
|
|
149
|
+
maxzoom: 10
|
|
150
|
+
});
|
|
151
|
+
expect(source.serialize()).toStrictEqual({
|
|
152
|
+
type: 'raster-dem',
|
|
153
|
+
tiles: ['http://localhost:2900/raster-dem/{z}/{x}/{y}.png'],
|
|
154
|
+
minzoom: 2,
|
|
155
|
+
maxzoom: 10
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
});
|