@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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `Bucket` interface is the single point of knowledge about turning vector
|
|
3
|
+
* tiles into WebGL buffers.
|
|
4
|
+
*
|
|
5
|
+
* `Bucket` is an abstract interface. An implementation exists for each style layer type.
|
|
6
|
+
* Create a bucket via the `StyleLayer#createBucket` method.
|
|
7
|
+
*
|
|
8
|
+
* The concrete bucket types, using layout options from the style layer,
|
|
9
|
+
* transform feature geometries into vertex and index data for use by the
|
|
10
|
+
* vertex shader. They also (via `ProgramConfiguration`) use feature
|
|
11
|
+
* properties and the zoom level to populate the attributes needed for
|
|
12
|
+
* data-driven styling.
|
|
13
|
+
*
|
|
14
|
+
* Buckets are designed to be built on a worker thread and then serialized and
|
|
15
|
+
* transferred back to the main thread for rendering. On the worker side, a
|
|
16
|
+
* bucket's vertex, index, and attribute data is stored in `bucket.arrays:
|
|
17
|
+
* ArrayGroup`. When a bucket's data is serialized and sent back to the main
|
|
18
|
+
* thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with
|
|
19
|
+
* the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups
|
|
20
|
+
* hold the same data as ArrayGroups, but are tuned for consumption by WebGL.
|
|
21
|
+
*
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
function deserialize(input, style) {
|
|
26
|
+
const output = {};
|
|
27
|
+
|
|
28
|
+
// Guard against the case where the map's style has been set to null while
|
|
29
|
+
// this bucket has been parsing.
|
|
30
|
+
if (!style) return output;
|
|
31
|
+
|
|
32
|
+
for (const bucket of input) {
|
|
33
|
+
const layers = bucket.layerIds.map(id => style.getLayer(id)).filter(Boolean);
|
|
34
|
+
|
|
35
|
+
if (layers.length === 0) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// look up StyleLayer objects from layer ids (since we don't
|
|
40
|
+
// want to waste time serializing/copying them from the worker)
|
|
41
|
+
bucket.layers = layers;
|
|
42
|
+
bucket.stateDependentLayers = layers.filter(l => l.isStateDependent());
|
|
43
|
+
for (const layer of layers) {
|
|
44
|
+
output[layer.id] = bucket;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return output;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
module.exports = {
|
|
52
|
+
deserialize
|
|
53
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const { RGBAImage } = require('../util/image');
|
|
2
|
+
|
|
3
|
+
const warn = require('../util/warn');
|
|
4
|
+
const { register } = require('../util/web_worker_transfer');
|
|
5
|
+
|
|
6
|
+
// DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders
|
|
7
|
+
// data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially
|
|
8
|
+
// loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the
|
|
9
|
+
// elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of
|
|
10
|
+
// integer overflow when creating the texture used in the hillshadePrepare step.
|
|
11
|
+
|
|
12
|
+
// DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8
|
|
13
|
+
// surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a
|
|
14
|
+
// tile's edge without backfilling from neighboring tiles.
|
|
15
|
+
|
|
16
|
+
class DEMData {
|
|
17
|
+
constructor(uid, data, encoding) {
|
|
18
|
+
this.uid = uid;
|
|
19
|
+
if (data.height !== data.width) throw new RangeError('DEM tiles must be square');
|
|
20
|
+
if (encoding && encoding !== 'mapbox' && encoding !== 'terrarium') {
|
|
21
|
+
warn.once(`"${encoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const dim = (this.dim = data.height);
|
|
25
|
+
this.stride = this.dim + 2;
|
|
26
|
+
this.data = new Int32Array(this.stride * this.stride);
|
|
27
|
+
|
|
28
|
+
const pixels = data.data;
|
|
29
|
+
const unpack = encoding === 'terrarium' ? this._unpackTerrarium : this._unpackMapbox;
|
|
30
|
+
for (let y = 0; y < dim; y++) {
|
|
31
|
+
for (let x = 0; x < dim; x++) {
|
|
32
|
+
const i = y * dim + x;
|
|
33
|
+
const j = i * 4;
|
|
34
|
+
this.set(x, y, unpack(pixels[j], pixels[j + 1], pixels[j + 2]));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image
|
|
39
|
+
// with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring
|
|
40
|
+
// tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder
|
|
41
|
+
for (let x = 0; x < dim; x++) {
|
|
42
|
+
// left vertical border
|
|
43
|
+
this.set(-1, x, this.get(0, x));
|
|
44
|
+
// right vertical border
|
|
45
|
+
this.set(dim, x, this.get(dim - 1, x));
|
|
46
|
+
// left horizontal border
|
|
47
|
+
this.set(x, -1, this.get(x, 0));
|
|
48
|
+
// right horizontal border
|
|
49
|
+
this.set(x, dim, this.get(x, dim - 1));
|
|
50
|
+
}
|
|
51
|
+
// corners
|
|
52
|
+
this.set(-1, -1, this.get(0, 0));
|
|
53
|
+
this.set(dim, -1, this.get(dim - 1, 0));
|
|
54
|
+
this.set(-1, dim, this.get(0, dim - 1));
|
|
55
|
+
this.set(dim, dim, this.get(dim - 1, dim - 1));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
set(x, y, value) {
|
|
59
|
+
this.data[this._idx(x, y)] = value + 65536;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get(x, y) {
|
|
63
|
+
return this.data[this._idx(x, y)] - 65536;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
_idx(x, y) {
|
|
67
|
+
if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1)
|
|
68
|
+
throw new RangeError('out of range source coordinates for DEM data');
|
|
69
|
+
return (y + 1) * this.stride + (x + 1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
_unpackMapbox(r, g, b) {
|
|
73
|
+
// unpacking formula for mapbox.terrain-rgb:
|
|
74
|
+
// https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb
|
|
75
|
+
return (r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
_unpackTerrarium(r, g, b) {
|
|
79
|
+
// unpacking formula for mapzen terrarium:
|
|
80
|
+
// https://aws.amazon.com/public-datasets/terrain/
|
|
81
|
+
return r * 256 + g + b / 256 - 32768.0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
getPixels() {
|
|
85
|
+
return new RGBAImage({ width: this.stride, height: this.stride }, new Uint8Array(this.data.buffer));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
backfillBorder(borderTile, dx, dy) {
|
|
89
|
+
if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch');
|
|
90
|
+
|
|
91
|
+
let xMin = dx * this.dim;
|
|
92
|
+
let xMax = dx * this.dim + this.dim;
|
|
93
|
+
let yMin = dy * this.dim;
|
|
94
|
+
let yMax = dy * this.dim + this.dim;
|
|
95
|
+
|
|
96
|
+
switch (dx) {
|
|
97
|
+
case -1:
|
|
98
|
+
xMin = xMax - 1;
|
|
99
|
+
break;
|
|
100
|
+
case 1:
|
|
101
|
+
xMax = xMin + 1;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
switch (dy) {
|
|
106
|
+
case -1:
|
|
107
|
+
yMin = yMax - 1;
|
|
108
|
+
break;
|
|
109
|
+
case 1:
|
|
110
|
+
yMax = yMin + 1;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const ox = -dx * this.dim;
|
|
115
|
+
const oy = -dy * this.dim;
|
|
116
|
+
for (let y = yMin; y < yMax; y++) {
|
|
117
|
+
for (let x = xMin; x < xMax; x++) {
|
|
118
|
+
this.set(x, y, borderTile.get(x + ox, y + oy));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
register('DEMData', DEMData);
|
|
125
|
+
|
|
126
|
+
module.exports = DEMData;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The maximum value of a coordinate in the internal tile coordinate system. Coordinates of
|
|
3
|
+
* all source features normalized to this extent upon load.
|
|
4
|
+
*
|
|
5
|
+
* The value is a consequence of the following:
|
|
6
|
+
*
|
|
7
|
+
* * Vertex buffer store positions as signed 16 bit integers.
|
|
8
|
+
* * One bit is lost for signedness to support tile buffers.
|
|
9
|
+
* * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.
|
|
10
|
+
* This is no longer the case but we're reserving this bit anyway.
|
|
11
|
+
* * One bit is lost to support features extending past the extent on the right edge of the tile.
|
|
12
|
+
* * This leaves us with 2^13 = 8192
|
|
13
|
+
*
|
|
14
|
+
* @private
|
|
15
|
+
* @readonly
|
|
16
|
+
*/
|
|
17
|
+
module.exports = 8192;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
const loadGeometry = require('./load_geometry');
|
|
2
|
+
const EXTENT = require('./extent');
|
|
3
|
+
const featureFilter = require('../style-spec/feature_filter');
|
|
4
|
+
const Grid = require('grid-index');
|
|
5
|
+
const DictionaryCoder = require('../util/dictionary_coder');
|
|
6
|
+
const vt = require('@mapbox/vector-tile');
|
|
7
|
+
const Protobuf = require('@mapwhit/pbf');
|
|
8
|
+
const GeoJSONFeature = require('../util/vectortile_to_geojson');
|
|
9
|
+
const { arraysIntersect } = require('../util/object');
|
|
10
|
+
const { register } = require('../util/web_worker_transfer');
|
|
11
|
+
const EvaluationParameters = require('../style/evaluation_parameters');
|
|
12
|
+
const { polygonIntersectsBox } = require('../util/intersection_tests');
|
|
13
|
+
|
|
14
|
+
const { FeatureIndexArray } = require('./array_types');
|
|
15
|
+
|
|
16
|
+
class FeatureIndex {
|
|
17
|
+
constructor(tileID, grid, featureIndexArray) {
|
|
18
|
+
this.tileID = tileID;
|
|
19
|
+
this.x = tileID.canonical.x;
|
|
20
|
+
this.y = tileID.canonical.y;
|
|
21
|
+
this.z = tileID.canonical.z;
|
|
22
|
+
this.grid = grid || new Grid(EXTENT, 16, 0);
|
|
23
|
+
this.grid3D = new Grid(EXTENT, 16, 0);
|
|
24
|
+
this.featureIndexArray = featureIndexArray || new FeatureIndexArray();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
insert(feature, geometry, featureIndex, sourceLayerIndex, bucketIndex, is3D) {
|
|
28
|
+
const key = this.featureIndexArray.length;
|
|
29
|
+
this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);
|
|
30
|
+
|
|
31
|
+
const grid = is3D ? this.grid3D : this.grid;
|
|
32
|
+
|
|
33
|
+
for (let r = 0; r < geometry.length; r++) {
|
|
34
|
+
const ring = geometry[r];
|
|
35
|
+
|
|
36
|
+
const bbox = [
|
|
37
|
+
Number.POSITIVE_INFINITY,
|
|
38
|
+
Number.POSITIVE_INFINITY,
|
|
39
|
+
Number.NEGATIVE_INFINITY,
|
|
40
|
+
Number.NEGATIVE_INFINITY
|
|
41
|
+
];
|
|
42
|
+
for (let i = 0; i < ring.length; i++) {
|
|
43
|
+
const p = ring[i];
|
|
44
|
+
bbox[0] = Math.min(bbox[0], p.x);
|
|
45
|
+
bbox[1] = Math.min(bbox[1], p.y);
|
|
46
|
+
bbox[2] = Math.max(bbox[2], p.x);
|
|
47
|
+
bbox[3] = Math.max(bbox[3], p.y);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (bbox[0] < EXTENT && bbox[1] < EXTENT && bbox[2] >= 0 && bbox[3] >= 0) {
|
|
51
|
+
grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
loadVTLayers() {
|
|
57
|
+
if (!this.vtLayers) {
|
|
58
|
+
this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers;
|
|
59
|
+
this.sourceLayerCoder = new DictionaryCoder(
|
|
60
|
+
this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return this.vtLayers;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Finds non-symbol features in this tile at a particular position.
|
|
67
|
+
query(args, styleLayers, sourceFeatureState) {
|
|
68
|
+
this.loadVTLayers();
|
|
69
|
+
|
|
70
|
+
const params = args.params || {};
|
|
71
|
+
const pixelsToTileUnits = EXTENT / args.tileSize / args.scale;
|
|
72
|
+
const filter = featureFilter(params.filter);
|
|
73
|
+
|
|
74
|
+
const queryGeometry = args.queryGeometry;
|
|
75
|
+
const queryPadding = args.queryPadding * pixelsToTileUnits;
|
|
76
|
+
|
|
77
|
+
const bounds = getBounds(queryGeometry);
|
|
78
|
+
const matching = this.grid.query(
|
|
79
|
+
bounds.minX - queryPadding,
|
|
80
|
+
bounds.minY - queryPadding,
|
|
81
|
+
bounds.maxX + queryPadding,
|
|
82
|
+
bounds.maxY + queryPadding
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const cameraBounds = getBounds(args.cameraQueryGeometry);
|
|
86
|
+
const matching3D = this.grid3D.query(
|
|
87
|
+
cameraBounds.minX - queryPadding,
|
|
88
|
+
cameraBounds.minY - queryPadding,
|
|
89
|
+
cameraBounds.maxX + queryPadding,
|
|
90
|
+
cameraBounds.maxY + queryPadding,
|
|
91
|
+
(bx1, by1, bx2, by2) => {
|
|
92
|
+
return polygonIntersectsBox(
|
|
93
|
+
args.cameraQueryGeometry,
|
|
94
|
+
bx1 - queryPadding,
|
|
95
|
+
by1 - queryPadding,
|
|
96
|
+
bx2 + queryPadding,
|
|
97
|
+
by2 + queryPadding
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
for (const key of matching3D) {
|
|
103
|
+
matching.push(key);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
matching.sort(topDownFeatureComparator);
|
|
107
|
+
|
|
108
|
+
const result = {};
|
|
109
|
+
let previousIndex;
|
|
110
|
+
for (let k = 0; k < matching.length; k++) {
|
|
111
|
+
const index = matching[k];
|
|
112
|
+
|
|
113
|
+
// don't check the same feature more than once
|
|
114
|
+
if (index === previousIndex) continue;
|
|
115
|
+
previousIndex = index;
|
|
116
|
+
|
|
117
|
+
const match = this.featureIndexArray.get(index);
|
|
118
|
+
let featureGeometry = null;
|
|
119
|
+
this.loadMatchingFeature(
|
|
120
|
+
result,
|
|
121
|
+
match.bucketIndex,
|
|
122
|
+
match.sourceLayerIndex,
|
|
123
|
+
match.featureIndex,
|
|
124
|
+
filter,
|
|
125
|
+
params.layers,
|
|
126
|
+
styleLayers,
|
|
127
|
+
(feature, styleLayer) => {
|
|
128
|
+
if (!featureGeometry) {
|
|
129
|
+
featureGeometry = loadGeometry(feature);
|
|
130
|
+
}
|
|
131
|
+
let featureState = {};
|
|
132
|
+
if (feature.id) {
|
|
133
|
+
// `feature-state` expression evaluation requires feature state to be available
|
|
134
|
+
featureState = sourceFeatureState.getState(
|
|
135
|
+
styleLayer.sourceLayer || '_geojsonTileLayer',
|
|
136
|
+
String(feature.id)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
return styleLayer.queryIntersectsFeature(
|
|
140
|
+
queryGeometry,
|
|
141
|
+
feature,
|
|
142
|
+
featureState,
|
|
143
|
+
featureGeometry,
|
|
144
|
+
this.z,
|
|
145
|
+
args.transform,
|
|
146
|
+
pixelsToTileUnits,
|
|
147
|
+
args.pixelPosMatrix
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
loadMatchingFeature(
|
|
157
|
+
result,
|
|
158
|
+
bucketIndex,
|
|
159
|
+
sourceLayerIndex,
|
|
160
|
+
featureIndex,
|
|
161
|
+
filter,
|
|
162
|
+
filterLayerIDs,
|
|
163
|
+
styleLayers,
|
|
164
|
+
intersectionTest
|
|
165
|
+
) {
|
|
166
|
+
const layerIDs = this.bucketLayerIDs[bucketIndex];
|
|
167
|
+
if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) return;
|
|
168
|
+
|
|
169
|
+
const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);
|
|
170
|
+
const sourceLayer = this.vtLayers[sourceLayerName];
|
|
171
|
+
const feature = sourceLayer.feature(featureIndex);
|
|
172
|
+
|
|
173
|
+
if (!filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) return;
|
|
174
|
+
|
|
175
|
+
for (let l = 0; l < layerIDs.length; l++) {
|
|
176
|
+
const layerID = layerIDs[l];
|
|
177
|
+
|
|
178
|
+
if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const styleLayer = styleLayers[layerID];
|
|
183
|
+
if (!styleLayer) continue;
|
|
184
|
+
|
|
185
|
+
const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer);
|
|
186
|
+
if (!intersectionZ) {
|
|
187
|
+
// Only applied for non-symbol features
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y);
|
|
192
|
+
geojsonFeature.layer = styleLayer.serialize();
|
|
193
|
+
let layerResult = result[layerID];
|
|
194
|
+
if (layerResult === undefined) {
|
|
195
|
+
layerResult = result[layerID] = [];
|
|
196
|
+
}
|
|
197
|
+
layerResult.push({ featureIndex: featureIndex, feature: geojsonFeature, intersectionZ });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Given a set of symbol indexes that have already been looked up,
|
|
202
|
+
// return a matching set of GeoJSONFeatures
|
|
203
|
+
lookupSymbolFeatures(symbolFeatureIndexes, bucketIndex, sourceLayerIndex, filterSpec, filterLayerIDs, styleLayers) {
|
|
204
|
+
const result = {};
|
|
205
|
+
this.loadVTLayers();
|
|
206
|
+
|
|
207
|
+
const filter = featureFilter(filterSpec);
|
|
208
|
+
|
|
209
|
+
for (const symbolFeatureIndex of symbolFeatureIndexes) {
|
|
210
|
+
this.loadMatchingFeature(
|
|
211
|
+
result,
|
|
212
|
+
bucketIndex,
|
|
213
|
+
sourceLayerIndex,
|
|
214
|
+
symbolFeatureIndex,
|
|
215
|
+
filter,
|
|
216
|
+
filterLayerIDs,
|
|
217
|
+
styleLayers
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
hasLayer(id) {
|
|
224
|
+
for (const layerIDs of this.bucketLayerIDs) {
|
|
225
|
+
for (const layerID of layerIDs) {
|
|
226
|
+
if (id === layerID) return true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
register('FeatureIndex', FeatureIndex, { omit: ['rawTileData', 'sourceLayerCoder'] });
|
|
235
|
+
|
|
236
|
+
module.exports = FeatureIndex;
|
|
237
|
+
|
|
238
|
+
function getBounds(geometry) {
|
|
239
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
240
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
241
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
242
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
243
|
+
for (const p of geometry) {
|
|
244
|
+
minX = Math.min(minX, p.x);
|
|
245
|
+
minY = Math.min(minY, p.y);
|
|
246
|
+
maxX = Math.max(maxX, p.x);
|
|
247
|
+
maxY = Math.max(maxY, p.y);
|
|
248
|
+
}
|
|
249
|
+
return { minX, minY, maxX, maxY };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function topDownFeatureComparator(a, b) {
|
|
253
|
+
return b - a;
|
|
254
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const { LineIndexArray, TriangleIndexArray, LineStripIndexArray } = require('./array_types');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* An index array stores Uint16 indices of vertexes in a corresponding vertex array. We use
|
|
5
|
+
* three kinds of index arrays: arrays storing groups of three indices, forming triangles;
|
|
6
|
+
* arrays storing pairs of indices, forming line segments; and arrays storing single indices,
|
|
7
|
+
* forming a line strip.
|
|
8
|
+
* @private
|
|
9
|
+
*/
|
|
10
|
+
module.exports = {
|
|
11
|
+
LineIndexArray,
|
|
12
|
+
TriangleIndexArray,
|
|
13
|
+
LineStripIndexArray
|
|
14
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const warn = require('../util/warn');
|
|
2
|
+
|
|
3
|
+
const EXTENT = require('./extent');
|
|
4
|
+
|
|
5
|
+
// These bounds define the minimum and maximum supported coordinate values.
|
|
6
|
+
// While visible coordinates are within [0, EXTENT], tiles may theoretically
|
|
7
|
+
// contain cordinates within [-Infinity, Infinity]. Our range is limited by the
|
|
8
|
+
// number of bits used to represent the coordinate.
|
|
9
|
+
function createBounds(bits) {
|
|
10
|
+
return {
|
|
11
|
+
min: -1 * 2 ** (bits - 1),
|
|
12
|
+
max: 2 ** (bits - 1) - 1
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const bounds = createBounds(16);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Loads a geometry from a VectorTileFeature and scales it to the common extent
|
|
20
|
+
* used internally.
|
|
21
|
+
* @param {VectorTileFeature} feature
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
24
|
+
module.exports = function loadGeometry(feature) {
|
|
25
|
+
const scale = EXTENT / feature.extent;
|
|
26
|
+
const geometry = feature.loadGeometry();
|
|
27
|
+
for (let r = 0; r < geometry.length; r++) {
|
|
28
|
+
const ring = geometry[r];
|
|
29
|
+
for (let p = 0; p < ring.length; p++) {
|
|
30
|
+
const point = ring[p];
|
|
31
|
+
// round here because mapbox-gl-native uses integers to represent
|
|
32
|
+
// points and we need to do the same to avoid renering differences.
|
|
33
|
+
point.x = Math.round(point.x * scale);
|
|
34
|
+
point.y = Math.round(point.y * scale);
|
|
35
|
+
|
|
36
|
+
if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) {
|
|
37
|
+
warn.once('Geometry exceeds allowed extent, reduce your vector tile buffer size');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return geometry;
|
|
42
|
+
};
|