@mapwhit/tilerenderer 0.47.1
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 +87 -0
- package/README.md +25 -0
- package/build/min/.dir +0 -0
- package/build/min/package.json +3 -0
- package/build/min/src/shaders/_prelude.fragment.glsl.txt +13 -0
- package/build/min/src/shaders/_prelude.vertex.glsl.txt +14 -0
- package/build/min/src/shaders/background.fragment.glsl.txt +5 -0
- package/build/min/src/shaders/background.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/background_pattern.fragment.glsl.txt +5 -0
- package/build/min/src/shaders/background_pattern.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/circle.fragment.glsl.txt +20 -0
- package/build/min/src/shaders/circle.vertex.glsl.txt +17 -0
- package/build/min/src/shaders/clipping_mask.fragment.glsl.txt +1 -0
- package/build/min/src/shaders/clipping_mask.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/collision_box.fragment.glsl.txt +1 -0
- package/build/min/src/shaders/collision_box.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/collision_circle.fragment.glsl.txt +1 -0
- package/build/min/src/shaders/collision_circle.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/debug.fragment.glsl.txt +1 -0
- package/build/min/src/shaders/debug.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/fill.fragment.glsl.txt +10 -0
- package/build/min/src/shaders/fill.vertex.glsl.txt +7 -0
- package/build/min/src/shaders/fill_extrusion.fragment.glsl.txt +13 -0
- package/build/min/src/shaders/fill_extrusion.vertex.glsl.txt +9 -0
- package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.txt +15 -0
- package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.txt +11 -0
- package/build/min/src/shaders/fill_outline.fragment.glsl.txt +10 -0
- package/build/min/src/shaders/fill_outline.vertex.glsl.txt +7 -0
- package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.txt +13 -0
- package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.txt +9 -0
- package/build/min/src/shaders/fill_pattern.fragment.glsl.txt +13 -0
- package/build/min/src/shaders/fill_pattern.vertex.glsl.txt +9 -0
- package/build/min/src/shaders/heatmap.fragment.glsl.txt +10 -0
- package/build/min/src/shaders/heatmap.vertex.glsl.txt +8 -0
- package/build/min/src/shaders/heatmap_texture.fragment.glsl.txt +5 -0
- package/build/min/src/shaders/heatmap_texture.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/hillshade.fragment.glsl.txt +7 -0
- package/build/min/src/shaders/hillshade.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/hillshade_prepare.fragment.glsl.txt +8 -0
- package/build/min/src/shaders/hillshade_prepare.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/line.fragment.glsl.txt +12 -0
- package/build/min/src/shaders/line.vertex.glsl.txt +17 -0
- package/build/min/src/shaders/line_gradient.fragment.glsl.txt +10 -0
- package/build/min/src/shaders/line_gradient.vertex.glsl.txt +16 -0
- package/build/min/src/shaders/line_pattern.fragment.glsl.txt +15 -0
- package/build/min/src/shaders/line_pattern.vertex.glsl.txt +20 -0
- package/build/min/src/shaders/line_sdf.fragment.glsl.txt +17 -0
- package/build/min/src/shaders/line_sdf.vertex.glsl.txt +20 -0
- package/build/min/src/shaders/raster.fragment.glsl.txt +5 -0
- package/build/min/src/shaders/raster.vertex.glsl.txt +1 -0
- package/build/min/src/shaders/symbol_icon.fragment.glsl.txt +9 -0
- package/build/min/src/shaders/symbol_icon.vertex.glsl.txt +5 -0
- package/build/min/src/shaders/symbol_sdf.fragment.glsl.txt +19 -0
- package/build/min/src/shaders/symbol_sdf.vertex.glsl.txt +13 -0
- package/package.json +44 -0
- package/src/css/mapbox-gl.css +506 -0
- package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
- package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
- package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
- package/src/css/svg/mapboxgl-ctrl-geolocate-background.svg +3 -0
- package/src/css/svg/mapboxgl-ctrl-geolocate.svg +3 -0
- package/src/css/svg/mapboxgl-ctrl-logo-compact.svg +2 -0
- package/src/css/svg/mapboxgl-ctrl-logo.svg +1 -0
- package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
- package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
- package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
- package/src/data/array_types.js +1138 -0
- package/src/data/bucket/circle_attributes.js +5 -0
- package/src/data/bucket/circle_bucket.js +118 -0
- package/src/data/bucket/fill_attributes.js +5 -0
- package/src/data/bucket/fill_bucket.js +166 -0
- package/src/data/bucket/fill_extrusion_attributes.js +11 -0
- package/src/data/bucket/fill_extrusion_bucket.js +247 -0
- package/src/data/bucket/heatmap_bucket.js +12 -0
- package/src/data/bucket/line_attributes.js +11 -0
- package/src/data/bucket/line_bucket.js +625 -0
- package/src/data/bucket/pattern_attributes.js +9 -0
- package/src/data/bucket/pattern_bucket_features.js +44 -0
- package/src/data/bucket/symbol_attributes.js +95 -0
- package/src/data/bucket/symbol_bucket.js +697 -0
- package/src/data/bucket.js +53 -0
- package/src/data/dem_data.js +126 -0
- package/src/data/extent.js +17 -0
- package/src/data/feature_index.js +254 -0
- package/src/data/index_array_type.js +14 -0
- package/src/data/load_geometry.js +42 -0
- package/src/data/pos_attributes.js +3 -0
- package/src/data/program_configuration.js +782 -0
- package/src/data/raster_bounds_attributes.js +6 -0
- package/src/data/segment.js +63 -0
- package/src/geo/coordinate.js +78 -0
- package/src/geo/lng_lat.js +129 -0
- package/src/geo/lng_lat_bounds.js +253 -0
- package/src/geo/transform.js +605 -0
- package/src/gl/color_mode.js +21 -0
- package/src/gl/context.js +193 -0
- package/src/gl/cull_face_mode.js +22 -0
- package/src/gl/depth_mode.js +18 -0
- package/src/gl/framebuffer.js +28 -0
- package/src/gl/index_buffer.js +52 -0
- package/src/gl/stencil_mode.js +17 -0
- package/src/gl/types.js +0 -0
- package/src/gl/value.js +676 -0
- package/src/gl/vertex_buffer.js +101 -0
- package/src/index.js +50 -0
- package/src/render/draw_background.js +60 -0
- package/src/render/draw_circle.js +55 -0
- package/src/render/draw_collision_debug.js +45 -0
- package/src/render/draw_debug.js +429 -0
- package/src/render/draw_fill.js +143 -0
- package/src/render/draw_fill_extrusion.js +101 -0
- package/src/render/draw_heatmap.js +159 -0
- package/src/render/draw_hillshade.js +144 -0
- package/src/render/draw_line.js +99 -0
- package/src/render/draw_raster.js +151 -0
- package/src/render/draw_symbol.js +231 -0
- package/src/render/glyph_atlas.js +55 -0
- package/src/render/glyph_manager.js +145 -0
- package/src/render/image_atlas.js +97 -0
- package/src/render/image_manager.js +183 -0
- package/src/render/line_atlas.js +139 -0
- package/src/render/painter.js +483 -0
- package/src/render/program/background_program.js +46 -0
- package/src/render/program/circle_program.js +40 -0
- package/src/render/program/clipping_mask_program.js +11 -0
- package/src/render/program/collision_program.js +28 -0
- package/src/render/program/debug_program.js +13 -0
- package/src/render/program/fill_extrusion_program.js +76 -0
- package/src/render/program/fill_program.js +60 -0
- package/src/render/program/heatmap_program.js +46 -0
- package/src/render/program/hillshade_program.js +77 -0
- package/src/render/program/line_program.js +119 -0
- package/src/render/program/pattern.js +57 -0
- package/src/render/program/program_uniforms.js +46 -0
- package/src/render/program/raster_program.js +50 -0
- package/src/render/program/symbol_program.js +112 -0
- package/src/render/program.js +133 -0
- package/src/render/texture.js +88 -0
- package/src/render/tile_mask.js +108 -0
- package/src/render/uniform_binding.js +129 -0
- package/src/render/vertex_array_object.js +155 -0
- package/src/shaders/README.md +42 -0
- package/src/shaders/_prelude.fragment.glsl +17 -0
- package/src/shaders/_prelude.vertex.glsl +73 -0
- package/src/shaders/background.fragment.glsl +10 -0
- package/src/shaders/background.vertex.glsl +7 -0
- package/src/shaders/background_pattern.fragment.glsl +28 -0
- package/src/shaders/background_pattern.vertex.glsl +20 -0
- package/src/shaders/circle.fragment.glsl +39 -0
- package/src/shaders/circle.vertex.glsl +63 -0
- package/src/shaders/clipping_mask.fragment.glsl +3 -0
- package/src/shaders/clipping_mask.vertex.glsl +7 -0
- package/src/shaders/collision_box.fragment.glsl +21 -0
- package/src/shaders/collision_box.vertex.glsl +26 -0
- package/src/shaders/collision_circle.fragment.glsl +34 -0
- package/src/shaders/collision_circle.vertex.glsl +36 -0
- package/src/shaders/debug.fragment.glsl +5 -0
- package/src/shaders/debug.vertex.glsl +7 -0
- package/src/shaders/encode_attribute.js +19 -0
- package/src/shaders/fill.fragment.glsl +13 -0
- package/src/shaders/fill.vertex.glsl +13 -0
- package/src/shaders/fill_extrusion.fragment.glsl +16 -0
- package/src/shaders/fill_extrusion.vertex.glsl +66 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +41 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +76 -0
- package/src/shaders/fill_outline.fragment.glsl +17 -0
- package/src/shaders/fill_outline.vertex.glsl +17 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl +41 -0
- package/src/shaders/fill_pattern.fragment.glsl +36 -0
- package/src/shaders/fill_pattern.vertex.glsl +36 -0
- package/src/shaders/heatmap.fragment.glsl +21 -0
- package/src/shaders/heatmap.vertex.glsl +53 -0
- package/src/shaders/heatmap_texture.fragment.glsl +14 -0
- package/src/shaders/heatmap_texture.vertex.glsl +11 -0
- package/src/shaders/hillshade.fragment.glsl +52 -0
- package/src/shaders/hillshade.vertex.glsl +11 -0
- package/src/shaders/hillshade_prepare.fragment.glsl +72 -0
- package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
- package/src/shaders/index.js +194 -0
- package/src/shaders/line.fragment.glsl +28 -0
- package/src/shaders/line.vertex.glsl +84 -0
- package/src/shaders/line_gradient.fragment.glsl +34 -0
- package/src/shaders/line_gradient.vertex.glsl +84 -0
- package/src/shaders/line_pattern.fragment.glsl +69 -0
- package/src/shaders/line_pattern.vertex.glsl +88 -0
- package/src/shaders/line_sdf.fragment.glsl +44 -0
- package/src/shaders/line_sdf.vertex.glsl +95 -0
- package/src/shaders/raster.fragment.glsl +52 -0
- package/src/shaders/raster.vertex.glsl +21 -0
- package/src/shaders/symbol_icon.fragment.glsl +17 -0
- package/src/shaders/symbol_icon.vertex.glsl +91 -0
- package/src/shaders/symbol_sdf.fragment.glsl +50 -0
- package/src/shaders/symbol_sdf.vertex.glsl +117 -0
- package/src/source/geojson_source.js +267 -0
- package/src/source/geojson_worker_source.js +210 -0
- package/src/source/geojson_wrapper.js +67 -0
- package/src/source/image_source.js +213 -0
- package/src/source/load_tilejson.js +40 -0
- package/src/source/pixels_to_tile_units.js +17 -0
- package/src/source/query_features.js +198 -0
- package/src/source/raster_dem_tile_source.js +140 -0
- package/src/source/raster_dem_tile_worker_source.js +26 -0
- package/src/source/raster_tile_source.js +126 -0
- package/src/source/rtl_text_plugin.js +63 -0
- package/src/source/source.js +75 -0
- package/src/source/source_cache.js +794 -0
- package/src/source/source_state.js +55 -0
- package/src/source/tile.js +332 -0
- package/src/source/tile_bounds.js +40 -0
- package/src/source/tile_cache.js +122 -0
- package/src/source/tile_id.js +150 -0
- package/src/source/vector_tile_source.js +144 -0
- package/src/source/vector_tile_worker_source.js +126 -0
- package/src/source/worker.js +175 -0
- package/src/source/worker_source.js +14 -0
- package/src/source/worker_tile.js +199 -0
- package/src/style/create_style_layer.js +25 -0
- package/src/style/evaluation_parameters.js +45 -0
- package/src/style/light.js +112 -0
- package/src/style/load_glyph_range.js +17 -0
- package/src/style/load_sprite.js +26 -0
- package/src/style/parse_glyph_pbf.js +45 -0
- package/src/style/pauseable_placement.js +88 -0
- package/src/style/properties.js +691 -0
- package/src/style/query_utils.js +39 -0
- package/src/style/style.js +955 -0
- package/src/style/style_layer/background_style_layer.js +11 -0
- package/src/style/style_layer/background_style_layer_properties.js +25 -0
- package/src/style/style_layer/circle_style_layer.js +93 -0
- package/src/style/style_layer/circle_style_layer_properties.js +76 -0
- package/src/style/style_layer/fill_extrusion_style_layer.js +194 -0
- package/src/style/style_layer/fill_extrusion_style_layer_properties.js +56 -0
- package/src/style/style_layer/fill_style_layer.js +46 -0
- package/src/style/style_layer/fill_style_layer_properties.js +45 -0
- package/src/style/style_layer/heatmap_style_layer.js +51 -0
- package/src/style/style_layer/heatmap_style_layer_properties.js +52 -0
- package/src/style/style_layer/hillshade_style_layer.js +15 -0
- package/src/style/style_layer/hillshade_style_layer_properties.js +43 -0
- package/src/style/style_layer/line_style_layer.js +129 -0
- package/src/style/style_layer/line_style_layer_properties.js +104 -0
- package/src/style/style_layer/raster_style_layer.js +11 -0
- package/src/style/style_layer/raster_style_layer_properties.js +55 -0
- package/src/style/style_layer/symbol_style_layer.js +66 -0
- package/src/style/style_layer/symbol_style_layer_properties.js +288 -0
- package/src/style/style_layer.js +183 -0
- package/src/style/style_layer_index.js +61 -0
- package/src/style/zoom_history.js +36 -0
- package/src/style-spec/deref.js +51 -0
- package/src/style-spec/error/parsing_error.js +8 -0
- package/src/style-spec/error/validation_error.js +10 -0
- package/src/style-spec/expression/compound_expression.js +118 -0
- package/src/style-spec/expression/definitions/array.js +82 -0
- package/src/style-spec/expression/definitions/assertion.js +69 -0
- package/src/style-spec/expression/definitions/at.js +57 -0
- package/src/style-spec/expression/definitions/case.js +73 -0
- package/src/style-spec/expression/definitions/coalesce.js +68 -0
- package/src/style-spec/expression/definitions/coercion.js +96 -0
- package/src/style-spec/expression/definitions/collator.js +102 -0
- package/src/style-spec/expression/definitions/equals.js +93 -0
- package/src/style-spec/expression/definitions/index.js +407 -0
- package/src/style-spec/expression/definitions/interpolate.js +235 -0
- package/src/style-spec/expression/definitions/length.js +54 -0
- package/src/style-spec/expression/definitions/let.js +60 -0
- package/src/style-spec/expression/definitions/literal.js +64 -0
- package/src/style-spec/expression/definitions/match.js +142 -0
- package/src/style-spec/expression/definitions/step.js +116 -0
- package/src/style-spec/expression/definitions/var.js +38 -0
- package/src/style-spec/expression/evaluation_context.js +35 -0
- package/src/style-spec/expression/index.js +329 -0
- package/src/style-spec/expression/is_constant.js +63 -0
- package/src/style-spec/expression/parsing_context.js +213 -0
- package/src/style-spec/expression/parsing_error.js +9 -0
- package/src/style-spec/expression/runtime_error.js +12 -0
- package/src/style-spec/expression/scope.js +34 -0
- package/src/style-spec/expression/stops.js +37 -0
- package/src/style-spec/expression/types.js +77 -0
- package/src/style-spec/expression/values.js +126 -0
- package/src/style-spec/feature_filter/README.md +55 -0
- package/src/style-spec/feature_filter/index.js +158 -0
- package/src/style-spec/function/convert.js +256 -0
- package/src/style-spec/function/index.js +299 -0
- package/src/style-spec/group_by_layout.js +68 -0
- package/src/style-spec/reference/v8.json +5356 -0
- package/src/style-spec/util/color.js +73 -0
- package/src/style-spec/util/color_spaces.js +128 -0
- package/src/style-spec/util/eval_support.js +8 -0
- package/src/style-spec/util/get_type.js +18 -0
- package/src/style-spec/util/interpolate.js +21 -0
- package/src/style-spec/util/properties.js +17 -0
- package/src/style-spec/util/ref_properties.js +1 -0
- package/src/style-spec/util/result.js +19 -0
- package/src/symbol/anchor.js +21 -0
- package/src/symbol/check_max_angle.js +75 -0
- package/src/symbol/clip_line.js +73 -0
- package/src/symbol/collision_feature.js +230 -0
- package/src/symbol/collision_index.js +379 -0
- package/src/symbol/cross_tile_symbol_index.js +270 -0
- package/src/symbol/get_anchors.js +177 -0
- package/src/symbol/grid_index.js +318 -0
- package/src/symbol/mergelines.js +75 -0
- package/src/symbol/opacity_state.js +21 -0
- package/src/symbol/placement.js +563 -0
- package/src/symbol/projection.js +601 -0
- package/src/symbol/quads.js +173 -0
- package/src/symbol/shaping.js +347 -0
- package/src/symbol/symbol_layout.js +519 -0
- package/src/symbol/symbol_size.js +110 -0
- package/src/symbol/transform_text.js +16 -0
- package/src/ui/anchor.js +24 -0
- package/src/ui/bind_handlers.js +199 -0
- package/src/ui/camera.js +954 -0
- package/src/ui/events.js +210 -0
- package/src/ui/handler/box_zoom.js +151 -0
- package/src/ui/handler/dblclick_zoom.js +91 -0
- package/src/ui/handler/drag_pan.js +285 -0
- package/src/ui/handler/drag_rotate.js +290 -0
- package/src/ui/handler/frame.js +28 -0
- package/src/ui/handler/inertia.js +45 -0
- package/src/ui/handler/keyboard.js +148 -0
- package/src/ui/handler/scroll_zoom.js +284 -0
- package/src/ui/handler/touch_zoom_rotate.js +263 -0
- package/src/ui/map.js +1645 -0
- package/src/util/actor.js +104 -0
- package/src/util/async.js +23 -0
- package/src/util/browser.js +61 -0
- package/src/util/callback.js +26 -0
- package/src/util/classify_rings.js +43 -0
- package/src/util/color_ramp.js +24 -0
- package/src/util/config.js +24 -0
- package/src/util/dictionary_coder.js +25 -0
- package/src/util/dispatcher.js +68 -0
- package/src/util/dom.js +102 -0
- package/src/util/evented.js +182 -0
- package/src/util/find_pole_of_inaccessibility.js +129 -0
- package/src/util/global_worker_pool.js +15 -0
- package/src/util/image.js +124 -0
- package/src/util/interpolate.js +5 -0
- package/src/util/intersection_tests.js +207 -0
- package/src/util/is_char_in_unicode_block.js +287 -0
- package/src/util/loader/image.js +32 -0
- package/src/util/object.js +178 -0
- package/src/util/script_detection.js +337 -0
- package/src/util/struct_array.js +197 -0
- package/src/util/task_queue.js +57 -0
- package/src/util/throttle.js +26 -0
- package/src/util/tile_cover.js +114 -0
- package/src/util/token.js +13 -0
- package/src/util/unique_id.js +12 -0
- package/src/util/util.js +192 -0
- package/src/util/vectortile_to_geojson.js +44 -0
- package/src/util/verticalize_punctuation.js +112 -0
- package/src/util/warn.js +21 -0
- package/src/util/web_worker.js +5 -0
- package/src/util/web_worker_transfer.js +228 -0
- package/src/util/worker_pool.js +41 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
const config = require('../util/config');
|
|
2
|
+
const { Event, ErrorEvent, Evented } = require('../util/evented');
|
|
3
|
+
const { pick } = require('../util/object');
|
|
4
|
+
const loadTileJSON = require('./load_tilejson');
|
|
5
|
+
const TileBounds = require('./tile_bounds');
|
|
6
|
+
const browser = require('../util/browser');
|
|
7
|
+
|
|
8
|
+
// register feature index for worker transfer
|
|
9
|
+
require('../data/feature_index');
|
|
10
|
+
|
|
11
|
+
class VectorTileSource extends Evented {
|
|
12
|
+
constructor(id, options, dispatcher, eventedParent) {
|
|
13
|
+
super();
|
|
14
|
+
this.id = id;
|
|
15
|
+
this.dispatcher = dispatcher;
|
|
16
|
+
|
|
17
|
+
this.type = 'vector';
|
|
18
|
+
this.minzoom = 0;
|
|
19
|
+
this.maxzoom = 22;
|
|
20
|
+
this.scheme = 'xyz';
|
|
21
|
+
this.tileSize = 512;
|
|
22
|
+
this.reparseOverscaled = true;
|
|
23
|
+
this.isTileClipped = true;
|
|
24
|
+
|
|
25
|
+
Object.assign(this, pick(options, ['url', 'scheme', 'tileSize']));
|
|
26
|
+
this._options = Object.assign({ type: 'vector' }, options);
|
|
27
|
+
|
|
28
|
+
if (this.tileSize !== 512) {
|
|
29
|
+
throw new Error('vector tile sources must have a tileSize of 512');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
this.updateWorkerConfig(config);
|
|
33
|
+
config.on('change', c => this.updateWorkerConfig(c));
|
|
34
|
+
|
|
35
|
+
this.setEventedParent(eventedParent);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
load() {
|
|
39
|
+
this.fire(new Event('dataloading', { dataType: 'source' }));
|
|
40
|
+
|
|
41
|
+
loadTileJSON(this._options, (err, tileJSON) => {
|
|
42
|
+
if (err) {
|
|
43
|
+
this.fire(new ErrorEvent(err));
|
|
44
|
+
} else if (tileJSON) {
|
|
45
|
+
Object.assign(this, tileJSON);
|
|
46
|
+
if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
|
|
47
|
+
|
|
48
|
+
// `content` is included here to prevent a race condition where `Style#_updateSources` is called
|
|
49
|
+
// before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
|
|
50
|
+
// ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088
|
|
51
|
+
this.fire(new Event('data', { dataType: 'source', sourceDataType: 'metadata' }));
|
|
52
|
+
this.fire(new Event('data', { dataType: 'source', sourceDataType: 'content' }));
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
hasTile(tileID) {
|
|
58
|
+
return !this.tileBounds || this.tileBounds.contains(tileID.canonical);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
onAdd(map) {
|
|
62
|
+
this.map = map;
|
|
63
|
+
this.load();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
serialize() {
|
|
67
|
+
return Object.assign({}, this._options);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
loadTile(tile, callback) {
|
|
71
|
+
tile.abortController = new window.AbortController();
|
|
72
|
+
this.tiles(tile.tileID.canonical, tile.abortController)
|
|
73
|
+
.catch(() => {})
|
|
74
|
+
.then(data => {
|
|
75
|
+
if (!data) {
|
|
76
|
+
const err = new Error('Tile could not be loaded');
|
|
77
|
+
err.status = 404; // will try to use the parent/child tile
|
|
78
|
+
return done(err);
|
|
79
|
+
}
|
|
80
|
+
const params = {
|
|
81
|
+
response: { data },
|
|
82
|
+
uid: tile.uid,
|
|
83
|
+
tileID: tile.tileID,
|
|
84
|
+
zoom: tile.tileID.overscaledZ,
|
|
85
|
+
tileSize: this.tileSize * tile.tileID.overscaleFactor(),
|
|
86
|
+
type: this.type,
|
|
87
|
+
source: this.id,
|
|
88
|
+
pixelRatio: browser.devicePixelRatio,
|
|
89
|
+
showCollisionBoxes: this.map.showCollisionBoxes
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
if (tile.workerID === undefined || tile.state === 'expired') {
|
|
93
|
+
tile.workerID = this.dispatcher.send('loadTile', params, done.bind(this));
|
|
94
|
+
} else if (tile.state === 'loading') {
|
|
95
|
+
// schedule tile reloading after it has been loaded
|
|
96
|
+
tile.reloadCallback = callback;
|
|
97
|
+
} else {
|
|
98
|
+
this.dispatcher.send('reloadTile', params, done.bind(this), tile.workerID);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
function done(err, data) {
|
|
103
|
+
if (tile.aborted) return callback(null);
|
|
104
|
+
|
|
105
|
+
if (err) {
|
|
106
|
+
return callback(err);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (data?.resourceTiming) tile.resourceTiming = data.resourceTiming;
|
|
110
|
+
|
|
111
|
+
tile.loadVectorData(data, this.map.painter);
|
|
112
|
+
|
|
113
|
+
callback(null);
|
|
114
|
+
|
|
115
|
+
if (tile.reloadCallback) {
|
|
116
|
+
this.loadTile(tile, tile.reloadCallback);
|
|
117
|
+
tile.reloadCallback = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
abortTile(tile) {
|
|
123
|
+
tile.aborted = true;
|
|
124
|
+
tile.abortController.abort();
|
|
125
|
+
this.dispatcher.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
unloadTile(tile) {
|
|
129
|
+
tile.unloadVectorData();
|
|
130
|
+
this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
hasTransition() {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
updateWorkerConfig() {
|
|
138
|
+
this.dispatcher.broadcast('vector.updateConfig', {
|
|
139
|
+
source: this.id
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
module.exports = VectorTileSource;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const vt = require('@mapbox/vector-tile');
|
|
2
|
+
const Protobuf = require('@mapwhit/pbf');
|
|
3
|
+
const WorkerTile = require('./worker_tile');
|
|
4
|
+
|
|
5
|
+
function loadVectorTile(params, callback) {
|
|
6
|
+
if (!params.response) {
|
|
7
|
+
return callback(new Error('no tile data'));
|
|
8
|
+
}
|
|
9
|
+
const { data } = params.response;
|
|
10
|
+
if (!data) {
|
|
11
|
+
return callback();
|
|
12
|
+
}
|
|
13
|
+
callback(null, {
|
|
14
|
+
vectorTile: new vt.VectorTile(new Protobuf(data)),
|
|
15
|
+
rawData: data
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
|
|
21
|
+
* This class is designed to be easily reused to support custom source types
|
|
22
|
+
* for data formats that can be parsed/converted into an in-memory VectorTile
|
|
23
|
+
* representation. To do so, create it with
|
|
24
|
+
* `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`.
|
|
25
|
+
*
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
class VectorTileWorkerSource {
|
|
29
|
+
/**
|
|
30
|
+
* @param [loadVectorData] Optional method for custom loading of a VectorTile
|
|
31
|
+
* object based on parameters passed from the main-thread Source. See
|
|
32
|
+
* {@link VectorTileWorkerSource#loadTile}. The default implementation simply
|
|
33
|
+
* loads the pbf at `params.url`.
|
|
34
|
+
*/
|
|
35
|
+
constructor(actor, layerIndex, loadVectorData) {
|
|
36
|
+
this.actor = actor;
|
|
37
|
+
this.layerIndex = layerIndex;
|
|
38
|
+
this.loadVectorData = loadVectorData || loadVectorTile.bind(this);
|
|
39
|
+
this.loaded = {};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Implements {@link WorkerSource#loadTile}. Delegates to
|
|
44
|
+
* {@link VectorTileWorkerSource#loadVectorData} (which by default expects
|
|
45
|
+
* a `params.url` property) for fetching and producing a VectorTile object.
|
|
46
|
+
*/
|
|
47
|
+
loadTile(params, callback) {
|
|
48
|
+
const uid = params.uid;
|
|
49
|
+
|
|
50
|
+
const workerTile = new WorkerTile(params);
|
|
51
|
+
this.loadVectorData(params, (err, response) => {
|
|
52
|
+
if (err || !response) {
|
|
53
|
+
return callback(err);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const rawTileData = response.rawData;
|
|
57
|
+
workerTile.vectorTile = response.vectorTile;
|
|
58
|
+
workerTile.parse(response.vectorTile, this.layerIndex, this.actor, (err, result) => {
|
|
59
|
+
if (err || !result) return callback(err);
|
|
60
|
+
|
|
61
|
+
// Transferring a copy of rawTileData because the worker needs to retain its copy.
|
|
62
|
+
callback(null, Object.assign({ rawTileData: rawTileData.slice(0) }, result));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
this.loaded = this.loaded || {};
|
|
66
|
+
this.loaded[uid] = workerTile;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Implements {@link WorkerSource#reloadTile}.
|
|
72
|
+
*/
|
|
73
|
+
reloadTile(params, callback) {
|
|
74
|
+
const loaded = this.loaded;
|
|
75
|
+
const uid = params.uid;
|
|
76
|
+
const vtSource = this;
|
|
77
|
+
if (loaded?.[uid]) {
|
|
78
|
+
const workerTile = loaded[uid];
|
|
79
|
+
workerTile.showCollisionBoxes = params.showCollisionBoxes;
|
|
80
|
+
|
|
81
|
+
const done = (err, data) => {
|
|
82
|
+
const reloadCallback = workerTile.reloadCallback;
|
|
83
|
+
if (reloadCallback) {
|
|
84
|
+
delete workerTile.reloadCallback;
|
|
85
|
+
workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback);
|
|
86
|
+
}
|
|
87
|
+
callback(err, data);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
if (workerTile.status === 'parsing') {
|
|
91
|
+
workerTile.reloadCallback = done;
|
|
92
|
+
} else if (workerTile.status === 'done') {
|
|
93
|
+
workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Implements {@link WorkerSource#abortTile}.
|
|
100
|
+
*
|
|
101
|
+
* @param params
|
|
102
|
+
* @param params.uid The UID for this tile.
|
|
103
|
+
*/
|
|
104
|
+
abortTile(params, callback) {
|
|
105
|
+
callback();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Implements {@link WorkerSource#removeTile}.
|
|
110
|
+
*
|
|
111
|
+
* @param params
|
|
112
|
+
* @param params.uid The UID for this tile.
|
|
113
|
+
*/
|
|
114
|
+
removeTile(params, callback) {
|
|
115
|
+
const loaded = this.loaded;
|
|
116
|
+
const uid = params.uid;
|
|
117
|
+
if (loaded?.[uid]) {
|
|
118
|
+
delete loaded[uid];
|
|
119
|
+
}
|
|
120
|
+
callback();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
updateConfig() {}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
module.exports = VectorTileWorkerSource;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
const Actor = require('../util/actor');
|
|
2
|
+
|
|
3
|
+
const StyleLayerIndex = require('../style/style_layer_index');
|
|
4
|
+
const VectorTileWorkerSource = require('./vector_tile_worker_source');
|
|
5
|
+
const RasterDEMTileWorkerSource = require('./raster_dem_tile_worker_source');
|
|
6
|
+
const GeoJSONWorkerSource = require('./geojson_worker_source');
|
|
7
|
+
const assert = require('assert');
|
|
8
|
+
const { plugin: globalRTLTextPlugin } = require('./rtl_text_plugin');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @private
|
|
12
|
+
*/
|
|
13
|
+
class Worker {
|
|
14
|
+
constructor(self) {
|
|
15
|
+
this.self = self;
|
|
16
|
+
this.actor = new Actor(self, this);
|
|
17
|
+
|
|
18
|
+
this.layerIndexes = {};
|
|
19
|
+
|
|
20
|
+
this.workerSourceTypes = {
|
|
21
|
+
vector: VectorTileWorkerSource,
|
|
22
|
+
geojson: GeoJSONWorkerSource
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// [mapId][sourceType][sourceName] => worker source instance
|
|
26
|
+
this.workerSources = {};
|
|
27
|
+
this.demWorkerSources = {};
|
|
28
|
+
|
|
29
|
+
this.self.registerWorkerSource = (name, WorkerSource) => {
|
|
30
|
+
if (this.workerSourceTypes[name]) {
|
|
31
|
+
throw new Error(`Worker source with name "${name}" already registered.`);
|
|
32
|
+
}
|
|
33
|
+
this.workerSourceTypes[name] = WorkerSource;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
this.self.registerRTLTextPlugin = rtlTextPlugin => {
|
|
37
|
+
if (globalRTLTextPlugin.isLoaded()) {
|
|
38
|
+
throw new Error('RTL text plugin already registered.');
|
|
39
|
+
}
|
|
40
|
+
globalRTLTextPlugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping;
|
|
41
|
+
globalRTLTextPlugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
setLayers(mapId, layers, callback) {
|
|
46
|
+
this.getLayerIndex(mapId).replace(layers);
|
|
47
|
+
callback();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
updateLayers(mapId, params, callback) {
|
|
51
|
+
this.getLayerIndex(mapId).update(params.layers, params.removedIds);
|
|
52
|
+
callback();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
loadTile(mapId, params, callback) {
|
|
56
|
+
assert(params.type);
|
|
57
|
+
this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
loadDEMTile(mapId, params, callback) {
|
|
61
|
+
this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
reloadTile(mapId, params, callback) {
|
|
65
|
+
assert(params.type);
|
|
66
|
+
this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
abortTile(mapId, params, callback) {
|
|
70
|
+
assert(params.type);
|
|
71
|
+
this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
removeTile(mapId, params, callback) {
|
|
75
|
+
assert(params.type);
|
|
76
|
+
this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
removeDEMTile(mapId, params) {
|
|
80
|
+
this.getDEMWorkerSource(mapId, params.source).removeTile(params);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
removeSource(mapId, params, callback) {
|
|
84
|
+
assert(params.type);
|
|
85
|
+
assert(params.source);
|
|
86
|
+
|
|
87
|
+
if (
|
|
88
|
+
!this.workerSources[mapId] ||
|
|
89
|
+
!this.workerSources[mapId][params.type] ||
|
|
90
|
+
!this.workerSources[mapId][params.type][params.source]
|
|
91
|
+
) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const worker = this.workerSources[mapId][params.type][params.source];
|
|
96
|
+
delete this.workerSources[mapId][params.type][params.source];
|
|
97
|
+
|
|
98
|
+
if (worker.removeSource !== undefined) {
|
|
99
|
+
worker.removeSource(params, callback);
|
|
100
|
+
} else {
|
|
101
|
+
callback();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Load a {@link WorkerSource} script at params.url. The script is run
|
|
107
|
+
* (using importScripts) with `registerWorkerSource` in scope, which is a
|
|
108
|
+
* function taking `(name, workerSourceObject)`.
|
|
109
|
+
* @private
|
|
110
|
+
*/
|
|
111
|
+
loadWorkerSource(map, params, callback) {
|
|
112
|
+
try {
|
|
113
|
+
this.self.importScripts(params.url);
|
|
114
|
+
callback();
|
|
115
|
+
} catch (e) {
|
|
116
|
+
callback(e.toString());
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
loadRTLTextPlugin(map, pluginURL, callback) {
|
|
121
|
+
try {
|
|
122
|
+
if (!globalRTLTextPlugin.isLoaded()) {
|
|
123
|
+
this.self.importScripts(pluginURL);
|
|
124
|
+
callback(
|
|
125
|
+
globalRTLTextPlugin.isLoaded()
|
|
126
|
+
? null
|
|
127
|
+
: new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`)
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
} catch (e) {
|
|
131
|
+
callback(e.toString());
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
getLayerIndex(mapId) {
|
|
136
|
+
let layerIndexes = this.layerIndexes[mapId];
|
|
137
|
+
if (!layerIndexes) {
|
|
138
|
+
layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex();
|
|
139
|
+
}
|
|
140
|
+
return layerIndexes;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
getWorkerSource(mapId, type, source) {
|
|
144
|
+
if (!this.workerSources[mapId]) this.workerSources[mapId] = {};
|
|
145
|
+
if (!this.workerSources[mapId][type]) this.workerSources[mapId][type] = {};
|
|
146
|
+
|
|
147
|
+
if (!this.workerSources[mapId][type][source]) {
|
|
148
|
+
// use a wrapped actor so that we can attach a target mapId param
|
|
149
|
+
// to any messages invoked by the WorkerSource
|
|
150
|
+
const actor = {
|
|
151
|
+
send: (type, data, callback) => {
|
|
152
|
+
this.actor.send(type, data, callback, mapId);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
this.workerSources[mapId][type][source] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return this.workerSources[mapId][type][source];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
getDEMWorkerSource(mapId, source) {
|
|
163
|
+
if (!this.demWorkerSources[mapId]) this.demWorkerSources[mapId] = {};
|
|
164
|
+
|
|
165
|
+
if (!this.demWorkerSources[mapId][source]) {
|
|
166
|
+
this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return this.demWorkerSources[mapId][source];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
module.exports = function createWorker(self) {
|
|
174
|
+
return new Worker(self);
|
|
175
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* May be implemented by custom source types to provide code that can be run on
|
|
3
|
+
* the WebWorkers. In addition to providing a custom
|
|
4
|
+
* {@link WorkerSource#loadTile}, any other methods attached to a `WorkerSource`
|
|
5
|
+
* implementation may also be targeted by the {@link Source} via
|
|
6
|
+
* `dispatcher.send('source-type.methodname', params, callback)`.
|
|
7
|
+
*
|
|
8
|
+
* @see {@link Map#addSourceType}
|
|
9
|
+
* @private
|
|
10
|
+
*
|
|
11
|
+
* @class WorkerSource
|
|
12
|
+
* @param actor
|
|
13
|
+
* @param layerIndex
|
|
14
|
+
*/
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
const FeatureIndex = require('../data/feature_index');
|
|
2
|
+
|
|
3
|
+
const { performSymbolLayout } = require('../symbol/symbol_layout');
|
|
4
|
+
const { CollisionBoxArray } = require('../data/array_types');
|
|
5
|
+
const DictionaryCoder = require('../util/dictionary_coder');
|
|
6
|
+
const SymbolBucket = require('../data/bucket/symbol_bucket');
|
|
7
|
+
const LineBucket = require('../data/bucket/line_bucket');
|
|
8
|
+
const FillBucket = require('../data/bucket/fill_bucket');
|
|
9
|
+
const FillExtrusionBucket = require('../data/bucket/fill_extrusion_bucket');
|
|
10
|
+
const { mapObject, values } = require('../util/object');
|
|
11
|
+
const warn = require('../util/warn');
|
|
12
|
+
const assert = require('assert');
|
|
13
|
+
const ImageAtlas = require('../render/image_atlas');
|
|
14
|
+
const GlyphAtlas = require('../render/glyph_atlas');
|
|
15
|
+
const EvaluationParameters = require('../style/evaluation_parameters');
|
|
16
|
+
const { OverscaledTileID } = require('./tile_id');
|
|
17
|
+
|
|
18
|
+
class WorkerTile {
|
|
19
|
+
constructor(params) {
|
|
20
|
+
this.tileID = new OverscaledTileID(
|
|
21
|
+
params.tileID.overscaledZ,
|
|
22
|
+
params.tileID.wrap,
|
|
23
|
+
params.tileID.canonical.z,
|
|
24
|
+
params.tileID.canonical.x,
|
|
25
|
+
params.tileID.canonical.y
|
|
26
|
+
);
|
|
27
|
+
this.uid = params.uid;
|
|
28
|
+
this.zoom = params.zoom;
|
|
29
|
+
this.pixelRatio = params.pixelRatio;
|
|
30
|
+
this.tileSize = params.tileSize;
|
|
31
|
+
this.source = params.source;
|
|
32
|
+
this.overscaling = this.tileID.overscaleFactor();
|
|
33
|
+
this.showCollisionBoxes = params.showCollisionBoxes;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
parse(data, layerIndex, actor, callback) {
|
|
37
|
+
this.status = 'parsing';
|
|
38
|
+
this.data = data;
|
|
39
|
+
|
|
40
|
+
this.collisionBoxArray = new CollisionBoxArray();
|
|
41
|
+
const sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort());
|
|
42
|
+
|
|
43
|
+
const featureIndex = new FeatureIndex(this.tileID);
|
|
44
|
+
featureIndex.bucketLayerIDs = [];
|
|
45
|
+
|
|
46
|
+
const buckets = {};
|
|
47
|
+
|
|
48
|
+
const options = {
|
|
49
|
+
featureIndex,
|
|
50
|
+
iconDependencies: {},
|
|
51
|
+
patternDependencies: {},
|
|
52
|
+
glyphDependencies: {}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const layerFamilies = layerIndex.familiesBySource[this.source];
|
|
56
|
+
for (const sourceLayerId in layerFamilies) {
|
|
57
|
+
const sourceLayer = data.layers[sourceLayerId];
|
|
58
|
+
if (!sourceLayer) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (sourceLayer.version === 1) {
|
|
63
|
+
warn.once(
|
|
64
|
+
`Vector tile source "${this.source}" layer "${sourceLayerId}" ` +
|
|
65
|
+
'does not use vector tile spec v2 and therefore may have some rendering errors.'
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
|
|
70
|
+
const features = [];
|
|
71
|
+
for (let index = 0; index < sourceLayer.length; index++) {
|
|
72
|
+
const feature = sourceLayer.feature(index);
|
|
73
|
+
features.push({ feature, index, sourceLayerIndex });
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const family of layerFamilies[sourceLayerId]) {
|
|
77
|
+
const layer = family[0];
|
|
78
|
+
|
|
79
|
+
assert(layer.source === this.source);
|
|
80
|
+
if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) continue;
|
|
81
|
+
if (layer.maxzoom && this.zoom >= layer.maxzoom) continue;
|
|
82
|
+
if (layer.visibility === 'none') continue;
|
|
83
|
+
|
|
84
|
+
recalculateLayers(family, this.zoom);
|
|
85
|
+
|
|
86
|
+
const bucket = (buckets[layer.id] = layer.createBucket({
|
|
87
|
+
index: featureIndex.bucketLayerIDs.length,
|
|
88
|
+
layers: family,
|
|
89
|
+
zoom: this.zoom,
|
|
90
|
+
pixelRatio: this.pixelRatio,
|
|
91
|
+
overscaling: this.overscaling,
|
|
92
|
+
collisionBoxArray: this.collisionBoxArray,
|
|
93
|
+
sourceLayerIndex: sourceLayerIndex,
|
|
94
|
+
sourceID: this.source
|
|
95
|
+
}));
|
|
96
|
+
|
|
97
|
+
bucket.populate(features, options);
|
|
98
|
+
featureIndex.bucketLayerIDs.push(family.map(l => l.id));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let error;
|
|
103
|
+
let glyphMap;
|
|
104
|
+
let iconMap;
|
|
105
|
+
let patternMap;
|
|
106
|
+
|
|
107
|
+
const stacks = mapObject(options.glyphDependencies, glyphs => Object.keys(glyphs).map(Number));
|
|
108
|
+
if (Object.keys(stacks).length) {
|
|
109
|
+
actor.send('getGlyphs', { uid: this.uid, stacks }, (err, result) => {
|
|
110
|
+
if (!error) {
|
|
111
|
+
error = err;
|
|
112
|
+
glyphMap = result;
|
|
113
|
+
maybePrepare.call(this);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
} else {
|
|
117
|
+
glyphMap = {};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const icons = Object.keys(options.iconDependencies);
|
|
121
|
+
if (icons.length) {
|
|
122
|
+
actor.send('getImages', { icons }, (err, result) => {
|
|
123
|
+
if (!error) {
|
|
124
|
+
error = err;
|
|
125
|
+
iconMap = result;
|
|
126
|
+
maybePrepare.call(this);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
} else {
|
|
130
|
+
iconMap = {};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const patterns = Object.keys(options.patternDependencies);
|
|
134
|
+
if (patterns.length) {
|
|
135
|
+
actor.send('getImages', { icons: patterns }, (err, result) => {
|
|
136
|
+
if (!error) {
|
|
137
|
+
error = err;
|
|
138
|
+
patternMap = result;
|
|
139
|
+
maybePrepare.call(this);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
} else {
|
|
143
|
+
patternMap = {};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
maybePrepare.call(this);
|
|
147
|
+
|
|
148
|
+
function maybePrepare() {
|
|
149
|
+
if (error) {
|
|
150
|
+
return callback(error);
|
|
151
|
+
}
|
|
152
|
+
if (glyphMap && iconMap && patternMap) {
|
|
153
|
+
const glyphAtlas = new GlyphAtlas(glyphMap);
|
|
154
|
+
const imageAtlas = new ImageAtlas(iconMap, patternMap);
|
|
155
|
+
|
|
156
|
+
for (const key in buckets) {
|
|
157
|
+
const bucket = buckets[key];
|
|
158
|
+
if (bucket instanceof SymbolBucket) {
|
|
159
|
+
recalculateLayers(bucket.layers, this.zoom);
|
|
160
|
+
performSymbolLayout(
|
|
161
|
+
bucket,
|
|
162
|
+
glyphMap,
|
|
163
|
+
glyphAtlas.positions,
|
|
164
|
+
iconMap,
|
|
165
|
+
imageAtlas.iconPositions,
|
|
166
|
+
this.showCollisionBoxes
|
|
167
|
+
);
|
|
168
|
+
} else if (
|
|
169
|
+
bucket.hasPattern &&
|
|
170
|
+
(bucket instanceof LineBucket || bucket instanceof FillBucket || bucket instanceof FillExtrusionBucket)
|
|
171
|
+
) {
|
|
172
|
+
recalculateLayers(bucket.layers, this.zoom);
|
|
173
|
+
bucket.addFeatures(options, imageAtlas.patternPositions);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
this.status = 'done';
|
|
178
|
+
|
|
179
|
+
callback(null, {
|
|
180
|
+
buckets: values(buckets).filter(b => !b.isEmpty()),
|
|
181
|
+
featureIndex,
|
|
182
|
+
collisionBoxArray: this.collisionBoxArray,
|
|
183
|
+
glyphAtlasImage: glyphAtlas.image,
|
|
184
|
+
imageAtlas
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function recalculateLayers(layers, zoom) {
|
|
192
|
+
// Layers are shared and may have been used by a WorkerTile with a different zoom.
|
|
193
|
+
const parameters = new EvaluationParameters(zoom);
|
|
194
|
+
for (const layer of layers) {
|
|
195
|
+
layer.recalculate(parameters);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
module.exports = WorkerTile;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const circle = require('./style_layer/circle_style_layer');
|
|
2
|
+
const heatmap = require('./style_layer/heatmap_style_layer');
|
|
3
|
+
const hillshade = require('./style_layer/hillshade_style_layer');
|
|
4
|
+
const fill = require('./style_layer/fill_style_layer');
|
|
5
|
+
const fillExtrusion = require('./style_layer/fill_extrusion_style_layer');
|
|
6
|
+
const line = require('./style_layer/line_style_layer');
|
|
7
|
+
const symbol = require('./style_layer/symbol_style_layer');
|
|
8
|
+
const background = require('./style_layer/background_style_layer');
|
|
9
|
+
const raster = require('./style_layer/raster_style_layer');
|
|
10
|
+
|
|
11
|
+
const subclasses = {
|
|
12
|
+
circle,
|
|
13
|
+
heatmap,
|
|
14
|
+
hillshade,
|
|
15
|
+
fill,
|
|
16
|
+
'fill-extrusion': fillExtrusion,
|
|
17
|
+
line,
|
|
18
|
+
symbol,
|
|
19
|
+
background,
|
|
20
|
+
raster
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
module.exports = function createStyleLayer(layer) {
|
|
24
|
+
return new subclasses[layer.type](layer);
|
|
25
|
+
};
|