mapbox-gl 1.13.2

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.
Files changed (460) hide show
  1. package/.flowconfig +61 -0
  2. package/CHANGELOG.md +2485 -0
  3. package/LICENSE.txt +84 -0
  4. package/README.md +34 -0
  5. package/build/banner.js +4 -0
  6. package/build/check-bundle-size.js +140 -0
  7. package/build/diff-tarball.js +18 -0
  8. package/build/generate-access-token-script.js +11 -0
  9. package/build/generate-flow-typed-style-spec.js +188 -0
  10. package/build/generate-release-list.js +21 -0
  11. package/build/generate-struct-arrays.js +243 -0
  12. package/build/generate-style-code.js +159 -0
  13. package/build/mapbox-gl.js.flow +3 -0
  14. package/build/print-release-url.js +6 -0
  15. package/build/rollup_plugin_minify_style_spec.js +24 -0
  16. package/build/rollup_plugins.js +80 -0
  17. package/build/run-node +3 -0
  18. package/build/run-tap +8 -0
  19. package/build/test/build-tape.js +19 -0
  20. package/dist/mapbox-gl-csp-worker.js +2 -0
  21. package/dist/mapbox-gl-csp-worker.js.map +1 -0
  22. package/dist/mapbox-gl-csp.js +2 -0
  23. package/dist/mapbox-gl-csp.js.map +1 -0
  24. package/dist/mapbox-gl-dev.js +65889 -0
  25. package/dist/mapbox-gl-dev.js.flow +3 -0
  26. package/dist/mapbox-gl-unminified.js +42889 -0
  27. package/dist/mapbox-gl-unminified.js.map +1 -0
  28. package/dist/mapbox-gl.css +1 -0
  29. package/dist/mapbox-gl.js +42 -0
  30. package/dist/mapbox-gl.js.flow +3 -0
  31. package/dist/mapbox-gl.js.map +1 -0
  32. package/dist/style-spec/index.es.js +15032 -0
  33. package/dist/style-spec/index.es.js.map +1 -0
  34. package/dist/style-spec/index.js +15058 -0
  35. package/dist/style-spec/index.js.map +1 -0
  36. package/flow-typed/gl.js +5 -0
  37. package/flow-typed/jsdom.js +18 -0
  38. package/flow-typed/mapbox-gl-supported.js +9 -0
  39. package/flow-typed/mapbox-unitbezier.js +14 -0
  40. package/flow-typed/offscreen-canvas.js +9 -0
  41. package/flow-typed/pbf.js +25 -0
  42. package/flow-typed/point-geometry.js +44 -0
  43. package/flow-typed/potpack.js +12 -0
  44. package/flow-typed/sinon.js +28 -0
  45. package/flow-typed/vector-tile.js +41 -0
  46. package/package.json +173 -0
  47. package/src/css/mapbox-gl.css +812 -0
  48. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  49. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  50. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  51. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +5 -0
  52. package/src/css/svg/mapboxgl-ctrl-logo.svg +20 -0
  53. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  54. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  55. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  56. package/src/data/array_types.js +1135 -0
  57. package/src/data/bucket/circle_attributes.js +9 -0
  58. package/src/data/bucket/circle_bucket.js +201 -0
  59. package/src/data/bucket/fill_attributes.js +9 -0
  60. package/src/data/bucket/fill_bucket.js +229 -0
  61. package/src/data/bucket/fill_extrusion_attributes.js +10 -0
  62. package/src/data/bucket/fill_extrusion_bucket.js +283 -0
  63. package/src/data/bucket/heatmap_bucket.js +17 -0
  64. package/src/data/bucket/line_attributes.js +10 -0
  65. package/src/data/bucket/line_attributes_ext.js +10 -0
  66. package/src/data/bucket/line_bucket.js +594 -0
  67. package/src/data/bucket/pattern_attributes.js +12 -0
  68. package/src/data/bucket/pattern_bucket_features.js +60 -0
  69. package/src/data/bucket/symbol_attributes.js +117 -0
  70. package/src/data/bucket/symbol_bucket.js +937 -0
  71. package/src/data/bucket.js +123 -0
  72. package/src/data/dem_data.js +125 -0
  73. package/src/data/evaluation_feature.js +25 -0
  74. package/src/data/extent.js +18 -0
  75. package/src/data/feature_index.js +322 -0
  76. package/src/data/feature_position_map.js +131 -0
  77. package/src/data/index_array_type.js +16 -0
  78. package/src/data/load_geometry.js +46 -0
  79. package/src/data/pos_attributes.js +6 -0
  80. package/src/data/program_configuration.js +708 -0
  81. package/src/data/raster_bounds_attributes.js +7 -0
  82. package/src/data/segment.js +76 -0
  83. package/src/geo/edge_insets.js +102 -0
  84. package/src/geo/lng_lat.js +168 -0
  85. package/src/geo/lng_lat_bounds.js +276 -0
  86. package/src/geo/mercator_coordinate.js +150 -0
  87. package/src/geo/transform.js +834 -0
  88. package/src/gl/color_mode.js +34 -0
  89. package/src/gl/context.js +302 -0
  90. package/src/gl/cull_face_mode.js +26 -0
  91. package/src/gl/depth_mode.js +29 -0
  92. package/src/gl/framebuffer.js +44 -0
  93. package/src/gl/index_buffer.js +55 -0
  94. package/src/gl/stencil_mode.js +30 -0
  95. package/src/gl/types.js +84 -0
  96. package/src/gl/value.js +520 -0
  97. package/src/gl/vertex_buffer.js +119 -0
  98. package/src/index.js +230 -0
  99. package/src/render/draw_background.js +57 -0
  100. package/src/render/draw_circle.js +113 -0
  101. package/src/render/draw_collision_debug.js +172 -0
  102. package/src/render/draw_custom.js +49 -0
  103. package/src/render/draw_debug.js +127 -0
  104. package/src/render/draw_fill.js +124 -0
  105. package/src/render/draw_fill_extrusion.js +95 -0
  106. package/src/render/draw_heatmap.js +133 -0
  107. package/src/render/draw_hillshade.js +107 -0
  108. package/src/render/draw_line.js +125 -0
  109. package/src/render/draw_raster.js +125 -0
  110. package/src/render/draw_symbol.js +392 -0
  111. package/src/render/glyph_atlas.js +71 -0
  112. package/src/render/glyph_manager.js +182 -0
  113. package/src/render/image_atlas.js +149 -0
  114. package/src/render/image_manager.js +306 -0
  115. package/src/render/line_atlas.js +210 -0
  116. package/src/render/painter.js +654 -0
  117. package/src/render/program/background_program.js +103 -0
  118. package/src/render/program/circle_program.js +69 -0
  119. package/src/render/program/clipping_mask_program.js +20 -0
  120. package/src/render/program/collision_program.js +76 -0
  121. package/src/render/program/debug_program.js +35 -0
  122. package/src/render/program/fill_extrusion_program.js +122 -0
  123. package/src/render/program/fill_program.js +126 -0
  124. package/src/render/program/heatmap_program.js +83 -0
  125. package/src/render/program/hillshade_program.js +119 -0
  126. package/src/render/program/line_program.js +211 -0
  127. package/src/render/program/pattern.js +102 -0
  128. package/src/render/program/program_uniforms.js +42 -0
  129. package/src/render/program/raster_program.js +92 -0
  130. package/src/render/program/symbol_program.js +224 -0
  131. package/src/render/program.js +188 -0
  132. package/src/render/texture.js +122 -0
  133. package/src/render/uniform_binding.js +147 -0
  134. package/src/render/vertex_array_object.js +163 -0
  135. package/src/shaders/README.md +42 -0
  136. package/src/shaders/_prelude.fragment.glsl +17 -0
  137. package/src/shaders/_prelude.vertex.glsl +73 -0
  138. package/src/shaders/background.fragment.glsl +10 -0
  139. package/src/shaders/background.vertex.glsl +7 -0
  140. package/src/shaders/background_pattern.fragment.glsl +28 -0
  141. package/src/shaders/background_pattern.vertex.glsl +20 -0
  142. package/src/shaders/circle.fragment.glsl +39 -0
  143. package/src/shaders/circle.vertex.glsl +64 -0
  144. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  145. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  146. package/src/shaders/collision_box.fragment.glsl +21 -0
  147. package/src/shaders/collision_box.vertex.glsl +27 -0
  148. package/src/shaders/collision_circle.fragment.glsl +17 -0
  149. package/src/shaders/collision_circle.vertex.glsl +59 -0
  150. package/src/shaders/debug.fragment.glsl +9 -0
  151. package/src/shaders/debug.vertex.glsl +12 -0
  152. package/src/shaders/encode_attribute.js +17 -0
  153. package/src/shaders/fill.fragment.glsl +13 -0
  154. package/src/shaders/fill.vertex.glsl +13 -0
  155. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  156. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  157. package/src/shaders/fill_extrusion_pattern.fragment.glsl +45 -0
  158. package/src/shaders/fill_extrusion_pattern.vertex.glsl +79 -0
  159. package/src/shaders/fill_outline.fragment.glsl +17 -0
  160. package/src/shaders/fill_outline.vertex.glsl +17 -0
  161. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  162. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  163. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  164. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  165. package/src/shaders/heatmap.fragment.glsl +22 -0
  166. package/src/shaders/heatmap.vertex.glsl +54 -0
  167. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  168. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  169. package/src/shaders/hillshade.fragment.glsl +52 -0
  170. package/src/shaders/hillshade.vertex.glsl +11 -0
  171. package/src/shaders/hillshade_prepare.fragment.glsl +75 -0
  172. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  173. package/src/shaders/index.js +20 -0
  174. package/src/shaders/line.fragment.glsl +30 -0
  175. package/src/shaders/line.vertex.glsl +85 -0
  176. package/src/shaders/line_gradient.fragment.glsl +34 -0
  177. package/src/shaders/line_gradient.vertex.glsl +88 -0
  178. package/src/shaders/line_pattern.fragment.glsl +74 -0
  179. package/src/shaders/line_pattern.vertex.glsl +99 -0
  180. package/src/shaders/line_sdf.fragment.glsl +45 -0
  181. package/src/shaders/line_sdf.vertex.glsl +98 -0
  182. package/src/shaders/raster.fragment.glsl +52 -0
  183. package/src/shaders/raster.vertex.glsl +21 -0
  184. package/src/shaders/shaders.js +185 -0
  185. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  186. package/src/shaders/symbol_icon.vertex.glsl +94 -0
  187. package/src/shaders/symbol_sdf.fragment.glsl +52 -0
  188. package/src/shaders/symbol_sdf.vertex.glsl +115 -0
  189. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  190. package/src/shaders/symbol_text_and_icon.vertex.glsl +116 -0
  191. package/src/source/canvas_source.js +238 -0
  192. package/src/source/geojson_source.js +370 -0
  193. package/src/source/geojson_worker_source.js +366 -0
  194. package/src/source/geojson_wrapper.js +94 -0
  195. package/src/source/image_source.js +307 -0
  196. package/src/source/load_tilejson.js +39 -0
  197. package/src/source/pixels_to_tile_units.js +21 -0
  198. package/src/source/query_features.js +208 -0
  199. package/src/source/raster_dem_tile_source.js +138 -0
  200. package/src/source/raster_dem_tile_worker_source.js +62 -0
  201. package/src/source/raster_tile_source.js +169 -0
  202. package/src/source/rtl_text_plugin.js +143 -0
  203. package/src/source/source.js +137 -0
  204. package/src/source/source_cache.js +953 -0
  205. package/src/source/source_state.js +159 -0
  206. package/src/source/tile.js +458 -0
  207. package/src/source/tile_bounds.js +38 -0
  208. package/src/source/tile_cache.js +212 -0
  209. package/src/source/tile_id.js +199 -0
  210. package/src/source/vector_tile_source.js +259 -0
  211. package/src/source/vector_tile_worker_source.js +216 -0
  212. package/src/source/video_source.js +203 -0
  213. package/src/source/worker.js +240 -0
  214. package/src/source/worker_source.js +107 -0
  215. package/src/source/worker_tile.js +224 -0
  216. package/src/style/create_style_layer.js +36 -0
  217. package/src/style/evaluation_parameters.js +62 -0
  218. package/src/style/format_section_override.js +56 -0
  219. package/src/style/light.js +130 -0
  220. package/src/style/load_glyph_range.js +38 -0
  221. package/src/style/load_sprite.js +67 -0
  222. package/src/style/parse_glyph_pbf.js +44 -0
  223. package/src/style/pauseable_placement.js +132 -0
  224. package/src/style/properties.js +753 -0
  225. package/src/style/query_utils.js +43 -0
  226. package/src/style/style.js +1374 -0
  227. package/src/style/style_glyph.js +17 -0
  228. package/src/style/style_image.js +137 -0
  229. package/src/style/style_layer/background_style_layer.js +21 -0
  230. package/src/style/style_layer/background_style_layer_properties.js +40 -0
  231. package/src/style/style_layer/circle_style_layer.js +98 -0
  232. package/src/style/style_layer/circle_style_layer_properties.js +63 -0
  233. package/src/style/style_layer/custom_style_layer.js +223 -0
  234. package/src/style/style_layer/fill_extrusion_style_layer.js +224 -0
  235. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +50 -0
  236. package/src/style/style_layer/fill_style_layer.js +67 -0
  237. package/src/style/style_layer/fill_style_layer_properties.js +55 -0
  238. package/src/style/style_layer/heatmap_style_layer.js +73 -0
  239. package/src/style/style_layer/heatmap_style_layer_properties.js +44 -0
  240. package/src/style/style_layer/hillshade_style_layer.js +25 -0
  241. package/src/style/style_layer/hillshade_style_layer_properties.js +46 -0
  242. package/src/style/style_layer/layer_properties.js.ejs +69 -0
  243. package/src/style/style_layer/line_style_layer.js +150 -0
  244. package/src/style/style_layer/line_style_layer_properties.js +71 -0
  245. package/src/style/style_layer/raster_style_layer.js +21 -0
  246. package/src/style/style_layer/raster_style_layer_properties.js +50 -0
  247. package/src/style/style_layer/symbol_style_layer.js +190 -0
  248. package/src/style/style_layer/symbol_style_layer_properties.js +153 -0
  249. package/src/style/style_layer/typed_style_layer.js +17 -0
  250. package/src/style/style_layer.js +283 -0
  251. package/src/style/style_layer_index.js +80 -0
  252. package/src/style/validate_style.js +42 -0
  253. package/src/style/zoom_history.js +44 -0
  254. package/src/style-spec/.eslintrc +5 -0
  255. package/src/style-spec/CHANGELOG.md +468 -0
  256. package/src/style-spec/README.md +59 -0
  257. package/src/style-spec/bin/gl-style-composite +9 -0
  258. package/src/style-spec/bin/gl-style-format +22 -0
  259. package/src/style-spec/bin/gl-style-migrate +9 -0
  260. package/src/style-spec/bin/gl-style-validate +50 -0
  261. package/src/style-spec/composite.js +50 -0
  262. package/src/style-spec/declass.js +42 -0
  263. package/src/style-spec/deref.js +52 -0
  264. package/src/style-spec/diff.js +393 -0
  265. package/src/style-spec/dist/.gitkeep +0 -0
  266. package/src/style-spec/dist/index.es.js +15032 -0
  267. package/src/style-spec/dist/index.es.js.map +1 -0
  268. package/src/style-spec/dist/index.js +15058 -0
  269. package/src/style-spec/dist/index.js.map +1 -0
  270. package/src/style-spec/empty.js +29 -0
  271. package/src/style-spec/error/parsing_error.js +16 -0
  272. package/src/style-spec/error/validation_error.js +18 -0
  273. package/src/style-spec/expression/compound_expression.js +162 -0
  274. package/src/style-spec/expression/definitions/assertion.js +130 -0
  275. package/src/style-spec/expression/definitions/at.js +70 -0
  276. package/src/style-spec/expression/definitions/case.js +85 -0
  277. package/src/style-spec/expression/definitions/coalesce.js +93 -0
  278. package/src/style-spec/expression/definitions/coercion.js +133 -0
  279. package/src/style-spec/expression/definitions/collator.js +78 -0
  280. package/src/style-spec/expression/definitions/comparison.js +184 -0
  281. package/src/style-spec/expression/definitions/format.js +144 -0
  282. package/src/style-spec/expression/definitions/image.js +52 -0
  283. package/src/style-spec/expression/definitions/in.js +72 -0
  284. package/src/style-spec/expression/definitions/index.js +565 -0
  285. package/src/style-spec/expression/definitions/index_of.js +89 -0
  286. package/src/style-spec/expression/definitions/interpolate.js +267 -0
  287. package/src/style-spec/expression/definitions/length.js +61 -0
  288. package/src/style-spec/expression/definitions/let.js +72 -0
  289. package/src/style-spec/expression/definitions/literal.js +77 -0
  290. package/src/style-spec/expression/definitions/match.js +158 -0
  291. package/src/style-spec/expression/definitions/number_format.js +142 -0
  292. package/src/style-spec/expression/definitions/slice.js +86 -0
  293. package/src/style-spec/expression/definitions/step.js +120 -0
  294. package/src/style-spec/expression/definitions/var.js +46 -0
  295. package/src/style-spec/expression/definitions/within.js +342 -0
  296. package/src/style-spec/expression/evaluation_context.js +59 -0
  297. package/src/style-spec/expression/expression.js +27 -0
  298. package/src/style-spec/expression/index.js +392 -0
  299. package/src/style-spec/expression/is_constant.js +59 -0
  300. package/src/style-spec/expression/parsing_context.js +233 -0
  301. package/src/style-spec/expression/parsing_error.js +13 -0
  302. package/src/style-spec/expression/runtime_error.js +17 -0
  303. package/src/style-spec/expression/scope.js +36 -0
  304. package/src/style-spec/expression/stops.js +39 -0
  305. package/src/style-spec/expression/types/collator.js +61 -0
  306. package/src/style-spec/expression/types/formatted.js +73 -0
  307. package/src/style-spec/expression/types/resolved_image.js +29 -0
  308. package/src/style-spec/expression/types.js +126 -0
  309. package/src/style-spec/expression/values.js +123 -0
  310. package/src/style-spec/feature_filter/README.md +55 -0
  311. package/src/style-spec/feature_filter/convert.js +208 -0
  312. package/src/style-spec/feature_filter/index.js +175 -0
  313. package/src/style-spec/format.js +51 -0
  314. package/src/style-spec/function/convert.js +270 -0
  315. package/src/style-spec/function/index.js +262 -0
  316. package/src/style-spec/group_by_layout.js +75 -0
  317. package/src/style-spec/migrate/expressions.js +39 -0
  318. package/src/style-spec/migrate/v8.js +203 -0
  319. package/src/style-spec/migrate/v9.js +26 -0
  320. package/src/style-spec/migrate.js +36 -0
  321. package/src/style-spec/package.json +41 -0
  322. package/src/style-spec/read_style.js +14 -0
  323. package/src/style-spec/reference/latest.js +3 -0
  324. package/src/style-spec/reference/v8.json +5914 -0
  325. package/src/style-spec/rollup.config.js +65 -0
  326. package/src/style-spec/style-spec.js +124 -0
  327. package/src/style-spec/types.js +432 -0
  328. package/src/style-spec/util/color.js +95 -0
  329. package/src/style-spec/util/color_spaces.js +139 -0
  330. package/src/style-spec/util/deep_equal.js +28 -0
  331. package/src/style-spec/util/extend.js +10 -0
  332. package/src/style-spec/util/get_type.js +17 -0
  333. package/src/style-spec/util/interpolate.js +22 -0
  334. package/src/style-spec/util/properties.js +15 -0
  335. package/src/style-spec/util/ref_properties.js +2 -0
  336. package/src/style-spec/util/result.js +19 -0
  337. package/src/style-spec/util/unbundle_jsonlint.js +24 -0
  338. package/src/style-spec/validate/latest.js +11 -0
  339. package/src/style-spec/validate/validate.js +75 -0
  340. package/src/style-spec/validate/validate_array.js +52 -0
  341. package/src/style-spec/validate/validate_boolean.js +15 -0
  342. package/src/style-spec/validate/validate_color.js +20 -0
  343. package/src/style-spec/validate/validate_constants.js +13 -0
  344. package/src/style-spec/validate/validate_enum.js +21 -0
  345. package/src/style-spec/validate/validate_expression.js +43 -0
  346. package/src/style-spec/validate/validate_filter.js +117 -0
  347. package/src/style-spec/validate/validate_formatted.js +11 -0
  348. package/src/style-spec/validate/validate_function.js +207 -0
  349. package/src/style-spec/validate/validate_glyphs_url.js +21 -0
  350. package/src/style-spec/validate/validate_image.js +11 -0
  351. package/src/style-spec/validate/validate_layer.js +134 -0
  352. package/src/style-spec/validate/validate_layout_property.js +6 -0
  353. package/src/style-spec/validate/validate_light.js +47 -0
  354. package/src/style-spec/validate/validate_number.js +29 -0
  355. package/src/style-spec/validate/validate_object.js +61 -0
  356. package/src/style-spec/validate/validate_paint_property.js +6 -0
  357. package/src/style-spec/validate/validate_property.js +64 -0
  358. package/src/style-spec/validate/validate_source.js +111 -0
  359. package/src/style-spec/validate/validate_string.js +15 -0
  360. package/src/style-spec/validate_mapbox_api_supported.js +171 -0
  361. package/src/style-spec/validate_style.js +39 -0
  362. package/src/style-spec/validate_style.min.js +78 -0
  363. package/src/style-spec/visit.js +77 -0
  364. package/src/symbol/anchor.js +26 -0
  365. package/src/symbol/check_max_angle.js +81 -0
  366. package/src/symbol/clip_line.js +71 -0
  367. package/src/symbol/collision_feature.js +109 -0
  368. package/src/symbol/collision_index.js +373 -0
  369. package/src/symbol/cross_tile_symbol_index.js +301 -0
  370. package/src/symbol/get_anchors.js +167 -0
  371. package/src/symbol/grid_index.js +335 -0
  372. package/src/symbol/mergelines.js +82 -0
  373. package/src/symbol/one_em.js +4 -0
  374. package/src/symbol/opacity_state.js +27 -0
  375. package/src/symbol/path_interpolator.js +61 -0
  376. package/src/symbol/placement.js +1124 -0
  377. package/src/symbol/projection.js +451 -0
  378. package/src/symbol/quads.js +334 -0
  379. package/src/symbol/shaping.js +816 -0
  380. package/src/symbol/symbol_layout.js +796 -0
  381. package/src/symbol/symbol_size.js +113 -0
  382. package/src/symbol/transform_text.js +29 -0
  383. package/src/types/callback.js +17 -0
  384. package/src/types/cancelable.js +3 -0
  385. package/src/types/tilejson.js +17 -0
  386. package/src/types/transferable.js +3 -0
  387. package/src/types/window.js +172 -0
  388. package/src/ui/anchor.js +32 -0
  389. package/src/ui/camera.js +1277 -0
  390. package/src/ui/control/attribution_control.js +212 -0
  391. package/src/ui/control/fullscreen_control.js +147 -0
  392. package/src/ui/control/geolocate_control.js +707 -0
  393. package/src/ui/control/logo_control.js +92 -0
  394. package/src/ui/control/navigation_control.js +257 -0
  395. package/src/ui/control/scale_control.js +142 -0
  396. package/src/ui/default_locale.js +22 -0
  397. package/src/ui/events.js +1301 -0
  398. package/src/ui/handler/box_zoom.js +170 -0
  399. package/src/ui/handler/click_zoom.js +52 -0
  400. package/src/ui/handler/handler_util.js +12 -0
  401. package/src/ui/handler/keyboard.js +208 -0
  402. package/src/ui/handler/map_event.js +156 -0
  403. package/src/ui/handler/mouse.js +171 -0
  404. package/src/ui/handler/scroll_zoom.js +350 -0
  405. package/src/ui/handler/shim/dblclick_zoom.js +62 -0
  406. package/src/ui/handler/shim/drag_pan.js +88 -0
  407. package/src/ui/handler/shim/drag_rotate.js +67 -0
  408. package/src/ui/handler/shim/touch_zoom_rotate.js +108 -0
  409. package/src/ui/handler/tap_drag_zoom.js +103 -0
  410. package/src/ui/handler/tap_recognizer.js +133 -0
  411. package/src/ui/handler/tap_zoom.js +93 -0
  412. package/src/ui/handler/touch_pan.js +101 -0
  413. package/src/ui/handler/touch_zoom_rotate.js +305 -0
  414. package/src/ui/handler_inertia.js +158 -0
  415. package/src/ui/handler_manager.js +531 -0
  416. package/src/ui/hash.js +148 -0
  417. package/src/ui/map.js +2874 -0
  418. package/src/ui/marker.js +672 -0
  419. package/src/ui/popup.js +640 -0
  420. package/src/util/actor.js +212 -0
  421. package/src/util/ajax.js +388 -0
  422. package/src/util/browser/web_worker.js +10 -0
  423. package/src/util/browser/window.js +6 -0
  424. package/src/util/browser.js +70 -0
  425. package/src/util/classify_rings.js +52 -0
  426. package/src/util/color_ramp.js +61 -0
  427. package/src/util/config.js +30 -0
  428. package/src/util/debug.js +28 -0
  429. package/src/util/dictionary_coder.js +30 -0
  430. package/src/util/dispatcher.js +70 -0
  431. package/src/util/dom.js +142 -0
  432. package/src/util/evented.js +174 -0
  433. package/src/util/find_pole_of_inaccessibility.js +129 -0
  434. package/src/util/global_worker_pool.js +35 -0
  435. package/src/util/image.js +142 -0
  436. package/src/util/intersection_tests.js +208 -0
  437. package/src/util/is_char_in_unicode_block.js +311 -0
  438. package/src/util/mapbox.js +491 -0
  439. package/src/util/offscreen_canvas_supported.js +14 -0
  440. package/src/util/performance.js +112 -0
  441. package/src/util/primitives.js +145 -0
  442. package/src/util/resolve_tokens.js +16 -0
  443. package/src/util/script_detection.js +328 -0
  444. package/src/util/sku_token.js +42 -0
  445. package/src/util/smart_wrap.js +55 -0
  446. package/src/util/struct_array.js +243 -0
  447. package/src/util/struct_array.js.ejs +112 -0
  448. package/src/util/struct_array_layout.js.ejs +98 -0
  449. package/src/util/task_queue.js +68 -0
  450. package/src/util/throttle.js +27 -0
  451. package/src/util/throttled_invoker.js +46 -0
  452. package/src/util/tile_request_cache.js +172 -0
  453. package/src/util/util.js +524 -0
  454. package/src/util/vectortile_to_geojson.js +50 -0
  455. package/src/util/verticalize_punctuation.js +114 -0
  456. package/src/util/web_worker.js +91 -0
  457. package/src/util/web_worker_transfer.js +266 -0
  458. package/src/util/webp_supported.js +69 -0
  459. package/src/util/window.js +102 -0
  460. package/src/util/worker_pool.js +57 -0
@@ -0,0 +1,123 @@
1
+ // @flow
2
+
3
+ import type {CollisionBoxArray} from './array_types';
4
+ import type Style from '../style/style';
5
+ import type {TypedStyleLayer} from '../style/style_layer/typed_style_layer';
6
+ import type FeatureIndex from './feature_index';
7
+ import type Context from '../gl/context';
8
+ import type {FeatureStates} from '../source/source_state';
9
+ import type {ImagePosition} from '../render/image_atlas';
10
+ import type {CanonicalTileID} from '../source/tile_id';
11
+
12
+ export type BucketParameters<Layer: TypedStyleLayer> = {
13
+ index: number,
14
+ layers: Array<Layer>,
15
+ zoom: number,
16
+ pixelRatio: number,
17
+ overscaling: number,
18
+ collisionBoxArray: CollisionBoxArray,
19
+ sourceLayerIndex: number,
20
+ sourceID: string
21
+ }
22
+
23
+ export type PopulateParameters = {
24
+ featureIndex: FeatureIndex,
25
+ iconDependencies: {},
26
+ patternDependencies: {},
27
+ glyphDependencies: {},
28
+ availableImages: Array<string>
29
+ }
30
+
31
+ export type IndexedFeature = {
32
+ feature: VectorTileFeature,
33
+ id: number | string,
34
+ index: number,
35
+ sourceLayerIndex: number,
36
+ }
37
+
38
+ export type BucketFeature = {|
39
+ index: number,
40
+ sourceLayerIndex: number,
41
+ geometry: Array<Array<Point>>,
42
+ properties: Object,
43
+ type: 1 | 2 | 3,
44
+ id?: any,
45
+ +patterns: {[_: string]: {"min": string, "mid": string, "max": string}},
46
+ sortKey?: number
47
+ |};
48
+
49
+ /**
50
+ * The `Bucket` interface is the single point of knowledge about turning vector
51
+ * tiles into WebGL buffers.
52
+ *
53
+ * `Bucket` is an abstract interface. An implementation exists for each style layer type.
54
+ * Create a bucket via the `StyleLayer#createBucket` method.
55
+ *
56
+ * The concrete bucket types, using layout options from the style layer,
57
+ * transform feature geometries into vertex and index data for use by the
58
+ * vertex shader. They also (via `ProgramConfiguration`) use feature
59
+ * properties and the zoom level to populate the attributes needed for
60
+ * data-driven styling.
61
+ *
62
+ * Buckets are designed to be built on a worker thread and then serialized and
63
+ * transferred back to the main thread for rendering. On the worker side, a
64
+ * bucket's vertex, index, and attribute data is stored in `bucket.arrays:
65
+ * ArrayGroup`. When a bucket's data is serialized and sent back to the main
66
+ * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with
67
+ * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups
68
+ * hold the same data as ArrayGroups, but are tuned for consumption by WebGL.
69
+ *
70
+ * @private
71
+ */
72
+ export interface Bucket {
73
+ layerIds: Array<string>;
74
+ hasPattern: boolean;
75
+ +layers: Array<any>;
76
+ +stateDependentLayers: Array<any>;
77
+ +stateDependentLayerIds: Array<string>;
78
+ populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID): void;
79
+ update(states: FeatureStates, vtLayer: VectorTileLayer, imagePositions: {[_: string]: ImagePosition}): void;
80
+ isEmpty(): boolean;
81
+
82
+ upload(context: Context): void;
83
+ uploadPending(): boolean;
84
+
85
+ /**
86
+ * Release the WebGL resources associated with the buffers. Note that because
87
+ * buckets are shared between layers having the same layout properties, they
88
+ * must be destroyed in groups (all buckets for a tile, or all symbol buckets).
89
+ *
90
+ * @private
91
+ */
92
+ destroy(): void;
93
+ }
94
+
95
+ export function deserialize(input: Array<Bucket>, style: Style): {[_: string]: Bucket} {
96
+ const output = {};
97
+
98
+ // Guard against the case where the map's style has been set to null while
99
+ // this bucket has been parsing.
100
+ if (!style) return output;
101
+
102
+ for (const bucket of input) {
103
+ const layers = bucket.layerIds
104
+ .map((id) => style.getLayer(id))
105
+ .filter(Boolean);
106
+
107
+ if (layers.length === 0) {
108
+ continue;
109
+ }
110
+
111
+ // look up StyleLayer objects from layer ids (since we don't
112
+ // want to waste time serializing/copying them from the worker)
113
+ (bucket: any).layers = layers;
114
+ if ((bucket: any).stateDependentLayerIds) {
115
+ (bucket: any).stateDependentLayers = (bucket: any).stateDependentLayerIds.map((lId) => layers.filter((l) => l.id === lId)[0]);
116
+ }
117
+ for (const layer of layers) {
118
+ output[layer.id] = bucket;
119
+ }
120
+ }
121
+
122
+ return output;
123
+ }
@@ -0,0 +1,125 @@
1
+ // @flow
2
+ import {RGBAImage} from '../util/image';
3
+
4
+ import {warnOnce} from '../util/util';
5
+ import {register} from '../util/web_worker_transfer';
6
+
7
+ // DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders
8
+ // data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially
9
+ // loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the
10
+ // elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of
11
+ // integer overflow when creating the texture used in the hillshadePrepare step.
12
+
13
+ // DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8
14
+ // surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a
15
+ // tile's edge without backfilling from neighboring tiles.
16
+
17
+ export default class DEMData {
18
+ uid: string;
19
+ data: Uint32Array;
20
+ stride: number;
21
+ dim: number;
22
+ encoding: "mapbox" | "terrarium";
23
+
24
+ // RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride
25
+ // and dim is calculated as stride - 2.
26
+ constructor(uid: string, data: RGBAImage, encoding: "mapbox" | "terrarium") {
27
+ this.uid = uid;
28
+ if (data.height !== data.width) throw new RangeError('DEM tiles must be square');
29
+ if (encoding && encoding !== "mapbox" && encoding !== "terrarium") return warnOnce(
30
+ `"${encoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".`
31
+ );
32
+ this.stride = data.height;
33
+ const dim = this.dim = data.height - 2;
34
+ this.data = new Uint32Array(data.data.buffer);
35
+ this.encoding = encoding || 'mapbox';
36
+
37
+ // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image
38
+ // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring
39
+ // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder
40
+ for (let x = 0; x < dim; x++) {
41
+ // left vertical border
42
+ this.data[this._idx(-1, x)] = this.data[this._idx(0, x)];
43
+ // right vertical border
44
+ this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)];
45
+ // left horizontal border
46
+ this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)];
47
+ // right horizontal border
48
+ this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)];
49
+ }
50
+ // corners
51
+ this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)];
52
+ this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)];
53
+ this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)];
54
+ this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)];
55
+ }
56
+
57
+ get(x: number, y: number) {
58
+ const pixels = new Uint8Array(this.data.buffer);
59
+ const index = this._idx(x, y) * 4;
60
+ const unpack = this.encoding === "terrarium" ? this._unpackTerrarium : this._unpackMapbox;
61
+ return unpack(pixels[index], pixels[index + 1], pixels[index + 2]);
62
+ }
63
+
64
+ getUnpackVector() {
65
+ return this.encoding === "terrarium" ? [256.0, 1.0, 1.0 / 256.0, 32768.0] : [6553.6, 25.6, 0.1, 10000.0];
66
+ }
67
+
68
+ _idx(x: number, y: number) {
69
+ if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) throw new RangeError('out of range source coordinates for DEM data');
70
+ return (y + 1) * this.stride + (x + 1);
71
+ }
72
+
73
+ _unpackMapbox(r: number, g: number, b: number) {
74
+ // unpacking formula for mapbox.terrain-rgb:
75
+ // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb
76
+ return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0);
77
+ }
78
+
79
+ _unpackTerrarium(r: number, g: number, b: number) {
80
+ // unpacking formula for mapzen terrarium:
81
+ // https://aws.amazon.com/public-datasets/terrain/
82
+ return ((r * 256 + g + b / 256) - 32768.0);
83
+ }
84
+
85
+ getPixels() {
86
+ return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer));
87
+ }
88
+
89
+ backfillBorder(borderTile: DEMData, dx: number, dy: number) {
90
+ if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch');
91
+
92
+ let xMin = dx * this.dim,
93
+ xMax = dx * this.dim + this.dim,
94
+ yMin = dy * this.dim,
95
+ yMax = dy * this.dim + this.dim;
96
+
97
+ switch (dx) {
98
+ case -1:
99
+ xMin = xMax - 1;
100
+ break;
101
+ case 1:
102
+ xMax = xMin + 1;
103
+ break;
104
+ }
105
+
106
+ switch (dy) {
107
+ case -1:
108
+ yMin = yMax - 1;
109
+ break;
110
+ case 1:
111
+ yMax = yMin + 1;
112
+ break;
113
+ }
114
+
115
+ const ox = -dx * this.dim;
116
+ const oy = -dy * this.dim;
117
+ for (let y = yMin; y < yMax; y++) {
118
+ for (let x = xMin; x < xMax; x++) {
119
+ this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)];
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ register('DEMData', DEMData);
@@ -0,0 +1,25 @@
1
+ // @flow
2
+
3
+ import loadGeometry from './load_geometry';
4
+
5
+ type EvaluationFeature = {
6
+ +type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'MultiPoint' | 'LineString' | 'MultiLineString' | 'Polygon' | 'MultiPolygon',
7
+ +id?: any,
8
+ +properties: {[_: string]: any},
9
+ +patterns?: {[_: string]: {"min": string, "mid": string, "max": string}},
10
+ geometry: Array<Array<Point>>
11
+ };
12
+
13
+ /**
14
+ * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which
15
+ * will be loaded based on necessity.
16
+ * @param {VectorTileFeature} feature
17
+ * @param {boolean} needGeometry
18
+ * @private
19
+ */
20
+ export default function toEvaluationFeature(feature: VectorTileFeature, needGeometry: boolean): EvaluationFeature {
21
+ return {type: feature.type,
22
+ id: feature.id,
23
+ properties:feature.properties,
24
+ geometry: needGeometry ? loadGeometry(feature) : []};
25
+ }
@@ -0,0 +1,18 @@
1
+ // @flow
2
+
3
+ /**
4
+ * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of
5
+ * all source features normalized to this extent upon load.
6
+ *
7
+ * The value is a consequence of the following:
8
+ *
9
+ * * Vertex buffer store positions as signed 16 bit integers.
10
+ * * One bit is lost for signedness to support tile buffers.
11
+ * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int.
12
+ * * One bit is lost to support features extending past the extent on the right edge of the tile.
13
+ * * This leaves us with 2^13 = 8192
14
+ *
15
+ * @private
16
+ * @readonly
17
+ */
18
+ export default 8192;
@@ -0,0 +1,322 @@
1
+ // @flow
2
+
3
+ import Point from '@mapbox/point-geometry';
4
+
5
+ import loadGeometry from './load_geometry';
6
+ import toEvaluationFeature from './evaluation_feature';
7
+ import EXTENT from './extent';
8
+ import featureFilter from '../style-spec/feature_filter';
9
+ import Grid from 'grid-index';
10
+ import DictionaryCoder from '../util/dictionary_coder';
11
+ import vt from '@mapbox/vector-tile';
12
+ import Protobuf from 'pbf';
13
+ import GeoJSONFeature from '../util/vectortile_to_geojson';
14
+ import {arraysIntersect, mapObject, extend} from '../util/util';
15
+ import {OverscaledTileID} from '../source/tile_id';
16
+ import {register} from '../util/web_worker_transfer';
17
+ import EvaluationParameters from '../style/evaluation_parameters';
18
+ import SourceFeatureState from '../source/source_state';
19
+ import {polygonIntersectsBox} from '../util/intersection_tests';
20
+ import {PossiblyEvaluated} from '../style/properties';
21
+
22
+ import type StyleLayer from '../style/style_layer';
23
+ import type {FeatureFilter} from '../style-spec/feature_filter';
24
+ import type Transform from '../geo/transform';
25
+ import type {FilterSpecification, PromoteIdSpecification} from '../style-spec/types';
26
+
27
+ import {FeatureIndexArray} from './array_types';
28
+
29
+ type QueryParameters = {
30
+ scale: number,
31
+ pixelPosMatrix: Float32Array,
32
+ transform: Transform,
33
+ tileSize: number,
34
+ queryGeometry: Array<Point>,
35
+ cameraQueryGeometry: Array<Point>,
36
+ queryPadding: number,
37
+ params: {
38
+ filter: FilterSpecification,
39
+ layers: Array<string>,
40
+ availableImages: Array<string>
41
+ }
42
+ }
43
+
44
+ class FeatureIndex {
45
+ tileID: OverscaledTileID;
46
+ x: number;
47
+ y: number;
48
+ z: number;
49
+ grid: Grid;
50
+ grid3D: Grid;
51
+ featureIndexArray: FeatureIndexArray;
52
+ promoteId: ?PromoteIdSpecification;
53
+
54
+ rawTileData: ArrayBuffer;
55
+ bucketLayerIDs: Array<Array<string>>;
56
+
57
+ vtLayers: {[_: string]: VectorTileLayer};
58
+ sourceLayerCoder: DictionaryCoder;
59
+
60
+ constructor(tileID: OverscaledTileID, promoteId?: ?PromoteIdSpecification) {
61
+ this.tileID = tileID;
62
+ this.x = tileID.canonical.x;
63
+ this.y = tileID.canonical.y;
64
+ this.z = tileID.canonical.z;
65
+ this.grid = new Grid(EXTENT, 16, 0);
66
+ this.grid3D = new Grid(EXTENT, 16, 0);
67
+ this.featureIndexArray = new FeatureIndexArray();
68
+ this.promoteId = promoteId;
69
+ }
70
+
71
+ insert(feature: VectorTileFeature, geometry: Array<Array<Point>>, featureIndex: number, sourceLayerIndex: number, bucketIndex: number, is3D?: boolean) {
72
+ const key = this.featureIndexArray.length;
73
+ this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex);
74
+
75
+ const grid = is3D ? this.grid3D : this.grid;
76
+
77
+ for (let r = 0; r < geometry.length; r++) {
78
+ const ring = geometry[r];
79
+
80
+ const bbox = [Infinity, Infinity, -Infinity, -Infinity];
81
+ for (let i = 0; i < ring.length; i++) {
82
+ const p = ring[i];
83
+ bbox[0] = Math.min(bbox[0], p.x);
84
+ bbox[1] = Math.min(bbox[1], p.y);
85
+ bbox[2] = Math.max(bbox[2], p.x);
86
+ bbox[3] = Math.max(bbox[3], p.y);
87
+ }
88
+
89
+ if (bbox[0] < EXTENT &&
90
+ bbox[1] < EXTENT &&
91
+ bbox[2] >= 0 &&
92
+ bbox[3] >= 0) {
93
+ grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);
94
+ }
95
+ }
96
+ }
97
+
98
+ loadVTLayers(): {[_: string]: VectorTileLayer} {
99
+ if (!this.vtLayers) {
100
+ this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers;
101
+ this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);
102
+ }
103
+ return this.vtLayers;
104
+ }
105
+
106
+ // Finds non-symbol features in this tile at a particular position.
107
+ query(args: QueryParameters, styleLayers: {[_: string]: StyleLayer}, serializedLayers: {[_: string]: Object}, sourceFeatureState: SourceFeatureState): {[_: string]: Array<{ featureIndex: number, feature: GeoJSONFeature }>} {
108
+ this.loadVTLayers();
109
+
110
+ const params = args.params || {},
111
+ pixelsToTileUnits = EXTENT / args.tileSize / args.scale,
112
+ filter = featureFilter(params.filter);
113
+
114
+ const queryGeometry = args.queryGeometry;
115
+ const queryPadding = args.queryPadding * pixelsToTileUnits;
116
+
117
+ const bounds = getBounds(queryGeometry);
118
+ const matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding);
119
+
120
+ const cameraBounds = getBounds(args.cameraQueryGeometry);
121
+ const matching3D = this.grid3D.query(
122
+ cameraBounds.minX - queryPadding, cameraBounds.minY - queryPadding, cameraBounds.maxX + queryPadding, cameraBounds.maxY + queryPadding,
123
+ (bx1, by1, bx2, by2) => {
124
+ return polygonIntersectsBox(args.cameraQueryGeometry, bx1 - queryPadding, by1 - queryPadding, bx2 + queryPadding, by2 + queryPadding);
125
+ });
126
+
127
+ for (const key of matching3D) {
128
+ matching.push(key);
129
+ }
130
+
131
+ matching.sort(topDownFeatureComparator);
132
+
133
+ const result = {};
134
+ let previousIndex;
135
+ for (let k = 0; k < matching.length; k++) {
136
+ const index = matching[k];
137
+
138
+ // don't check the same feature more than once
139
+ if (index === previousIndex) continue;
140
+ previousIndex = index;
141
+
142
+ const match = this.featureIndexArray.get(index);
143
+ let featureGeometry = null;
144
+ this.loadMatchingFeature(
145
+ result,
146
+ match.bucketIndex,
147
+ match.sourceLayerIndex,
148
+ match.featureIndex,
149
+ filter,
150
+ params.layers,
151
+ params.availableImages,
152
+ styleLayers,
153
+ serializedLayers,
154
+ sourceFeatureState,
155
+ (feature: VectorTileFeature, styleLayer: StyleLayer, featureState: Object) => {
156
+ if (!featureGeometry) {
157
+ featureGeometry = loadGeometry(feature);
158
+ }
159
+
160
+ return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix);
161
+ }
162
+ );
163
+ }
164
+
165
+ return result;
166
+ }
167
+
168
+ loadMatchingFeature(
169
+ result: {[_: string]: Array<{ featureIndex: number, feature: GeoJSONFeature }>},
170
+ bucketIndex: number,
171
+ sourceLayerIndex: number,
172
+ featureIndex: number,
173
+ filter: FeatureFilter,
174
+ filterLayerIDs: Array<string>,
175
+ availableImages: Array<string>,
176
+ styleLayers: {[_: string]: StyleLayer},
177
+ serializedLayers: {[_: string]: Object},
178
+ sourceFeatureState?: SourceFeatureState,
179
+ intersectionTest?: (feature: VectorTileFeature, styleLayer: StyleLayer, featureState: Object, id: string | number | void) => boolean | number) {
180
+
181
+ const layerIDs = this.bucketLayerIDs[bucketIndex];
182
+ if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs))
183
+ return;
184
+
185
+ const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex);
186
+ const sourceLayer = this.vtLayers[sourceLayerName];
187
+ const feature = sourceLayer.feature(featureIndex);
188
+
189
+ if (filter.needGeometry) {
190
+ const evaluationFeature = toEvaluationFeature(feature, true);
191
+ if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) {
192
+ return;
193
+ }
194
+ } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) {
195
+ return;
196
+ }
197
+
198
+ const id = this.getId(feature, sourceLayerName);
199
+
200
+ for (let l = 0; l < layerIDs.length; l++) {
201
+ const layerID = layerIDs[l];
202
+
203
+ if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {
204
+ continue;
205
+ }
206
+
207
+ const styleLayer = styleLayers[layerID];
208
+
209
+ if (!styleLayer) continue;
210
+
211
+ let featureState = {};
212
+ if (id !== undefined && sourceFeatureState) {
213
+ // `feature-state` expression evaluation requires feature state to be available
214
+ featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id);
215
+ }
216
+
217
+ const serializedLayer = extend({}, serializedLayers[layerID]);
218
+
219
+ serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages);
220
+ serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages);
221
+
222
+ const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState);
223
+ if (!intersectionZ) {
224
+ // Only applied for non-symbol features
225
+ continue;
226
+ }
227
+
228
+ const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y, id);
229
+ (geojsonFeature: any).layer = serializedLayer;
230
+ let layerResult = result[layerID];
231
+ if (layerResult === undefined) {
232
+ layerResult = result[layerID] = [];
233
+ }
234
+ layerResult.push({featureIndex, feature: geojsonFeature, intersectionZ});
235
+ }
236
+ }
237
+
238
+ // Given a set of symbol indexes that have already been looked up,
239
+ // return a matching set of GeoJSONFeatures
240
+ lookupSymbolFeatures(symbolFeatureIndexes: Array<number>,
241
+ serializedLayers: {[string]: StyleLayer},
242
+ bucketIndex: number,
243
+ sourceLayerIndex: number,
244
+ filterSpec: FilterSpecification,
245
+ filterLayerIDs: Array<string>,
246
+ availableImages: Array<string>,
247
+ styleLayers: {[_: string]: StyleLayer}) {
248
+ const result = {};
249
+ this.loadVTLayers();
250
+
251
+ const filter = featureFilter(filterSpec);
252
+
253
+ for (const symbolFeatureIndex of symbolFeatureIndexes) {
254
+ this.loadMatchingFeature(
255
+ result,
256
+ bucketIndex,
257
+ sourceLayerIndex,
258
+ symbolFeatureIndex,
259
+ filter,
260
+ filterLayerIDs,
261
+ availableImages,
262
+ styleLayers,
263
+ serializedLayers
264
+ );
265
+
266
+ }
267
+ return result;
268
+ }
269
+
270
+ hasLayer(id: string) {
271
+ for (const layerIDs of this.bucketLayerIDs) {
272
+ for (const layerID of layerIDs) {
273
+ if (id === layerID) return true;
274
+ }
275
+ }
276
+
277
+ return false;
278
+ }
279
+
280
+ getId(feature: VectorTileFeature, sourceLayerId: string): string | number | void {
281
+ let id = feature.id;
282
+ if (this.promoteId) {
283
+ const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId];
284
+ id = feature.properties[propName];
285
+ if (typeof id === 'boolean') id = Number(id);
286
+ }
287
+ return id;
288
+ }
289
+ }
290
+
291
+ register(
292
+ 'FeatureIndex',
293
+ FeatureIndex,
294
+ {omit: ['rawTileData', 'sourceLayerCoder']}
295
+ );
296
+
297
+ export default FeatureIndex;
298
+
299
+ function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) {
300
+ return mapObject(serializedProperties, (property, key) => {
301
+ const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null;
302
+ return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop;
303
+ });
304
+ }
305
+
306
+ function getBounds(geometry: Array<Point>) {
307
+ let minX = Infinity;
308
+ let minY = Infinity;
309
+ let maxX = -Infinity;
310
+ let maxY = -Infinity;
311
+ for (const p of geometry) {
312
+ minX = Math.min(minX, p.x);
313
+ minY = Math.min(minY, p.y);
314
+ maxX = Math.max(maxX, p.x);
315
+ maxY = Math.max(maxY, p.y);
316
+ }
317
+ return {minX, minY, maxX, maxY};
318
+ }
319
+
320
+ function topDownFeatureComparator(a, b) {
321
+ return b - a;
322
+ }