Skip to content

瓦片系统

Mapbox GL JS 中的瓦片系统管理地图瓦片的组织、加载和缓存——这是 Web 地图的基本构建块。该系统负责高效地请求、处理和渲染各种缩放级别的地理数据,以创建无缝的地图体验。

有关提供这些瓦片的不同 source 类型的信息,请参阅 数据源类型。有关瓦片如何并行处理的详细信息,请参阅 工作线程架构

瓦片坐标和结构

Web Mercator 投影

Mapbox GL JS 使用 Web Mercator 投影(EPSG:3857),将球形地球映射到可以划分为瓦片的正方形。

瓦片坐标系统

瓦片由三个整数坐标标识:

CoordinateDescription
z缩放级别(0 是整个世界,每次增量使分辨率翻倍)
x列(从 0 到 2^z-1 向东增加)
y行(从 0 到 2^z-1 向南增加)

TileCoord 类封装这些坐标并提供比较瓦片和计算关系的方法。

来源:

瓦片加载生命周期

地图瓦片在其生命周期中经历几个状态,由 SourceCache 类管理。

SVG
100%

SourceCache 实现了优化性能的策略:

  1. 预测性加载: 预先加载视口相邻的瓦片,以预期用户的平移
  2. 父瓦片显示: 在加载更高缩放级的子瓦片时显示较低缩放级的父瓦片
  3. 保留策略: 将最近使用的瓦片保留在内存中,以避免在返回区域时重新加载
  4. 淡入动画: 在不同分辨率的瓦片之间平滑过渡

来源:

过缩放

过缩放是一种技术,允许用户缩放超过瓦片数据可用的最大缩放级别。

SVG
100%

当用户缩放超过最大可用缩放级别时:

  1. TileCoord 类创建一个"过缩放"坐标,包括:

    • 与用户视图匹配的显示缩放级别
    • 指向实际源数据的"规范"缩放级别
    • 调整后的 x 和 y 坐标
  2. 对于 vector tiles,vertex 数据被转换以更高分辨率渲染

  3. 对于 raster tiles,像素数据被放大(可能会显得模糊)

来源:

Source 缓存

SourceCache 类是瓦片系统的核心组件,管理特定 source 的瓦片。

SVG
100%

当地图视图更改时,SourceCache.update() 方法:

  1. 计算当前视图需要哪些瓦片
  2. 请求缺失的瓦片
  3. 卸载不再需要的瓦片
  4. 确定要渲染哪些已加载的瓦片

来源:

瓦片生成和处理

SVG
100%

对于 vector tiles,过程包括:

  1. Map 类根据当前视图触发 updateSources()
  2. SourceCache 使用 getCoveringTiles() 确定需要的瓦片
  3. 对于每个需要的瓦片,创建并加载一个 Tile 实例
  4. Vector tile 数据被发送到 web workers 进行解析
  5. 解析的数据返回到主线程并被组织为用于渲染的"buckets"
  6. 地图使用新的瓦片数据重新绘制

来源:

瓦片坐标工具

Mapbox GL JS 包括几个用于处理瓦片坐标的工具函数:

FunctionPurpose
pointToTileCoord将墨卡托坐标中的点转换为瓦片坐标
tileCoordsAtZoom获取给定缩放级别的所有可能瓦片坐标
getTileCoordCenter计算瓦片中心的墨卡托坐标
pointToLatLng将墨卡托坐标转换为纬度/经度
latLngToPoint将纬度/经度转换为墨卡托坐标

这些工具有助于执行以下操作:

  • 确定给定地图视图需要加载哪些瓦片
  • 在不同坐标系统之间转换
  • 计算瓦片的地理边界

来源:

与其他系统的集成

瓦片系统与 Mapbox GL JS 中的其他几个组件交互:

SVG
100%

关键集成点:

  1. Style 系统: Style 确定哪些 sources 和 layers 处于活动状态,这影响需要加载哪些瓦片
  2. Source 类型: 不同的 source 类型(vector、raster、GeoJSON)实现专门的加载行为
  3. Worker 架构: Web workers 解析和处理 vector tile 数据而不阻塞主线程
  4. 渲染系统: 处理后的瓦片数据被传递到渲染管线进行绘制
  5. 交互: Feature 索引允许查询瓦片内的 features 以实现交互式地图

来源:

缓存和性能优化

Mapbox GL JS 实现了几种缓存策略来优化性能:

  1. 本地瓦片缓存: SourceCache 维护最近使用的瓦片的内存缓存
  2. HTTP 缓存: 利用标准 HTTP 缓存头进行网络请求
  3. 父/子关系: 在加载子瓦片时显示可用的父瓦片
  4. 坐标覆盖算法: 优化为当前视图请求哪些瓦片
  5. 瓦片过期: 在瓦片过期时间后自动重新加载

这些策略协同工作,以提供响应式地图体验,同时最大限度地减少网络使用和处理时间。