You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mapbox离线下载报错:Failed to resolve tileset descriptors: Loading request canceled

问题分析与解决方案

问题背景

使用Mapbox离线管理器异步下载多个地图区域时,开发模式极少出错,但生产环境偶尔出现Failed to resolve tileset descriptors: Loading request canceled错误。同一下载函数,用户区域基本正常,地块区域大多失败,改为同步执行后仍报错,仅最后一个包常能成功。

相关代码

const downloadPack = async (packName, bounds) => {
  console.log("bounds", packName, bounds);

  // Delete old pack
  await MapboxGL.offlineManager.deletePack(packName);

  const progressListener = (offlineRegion, status) => {
    if (status.state === "complete") {
      console.log(
        `Pack: ${packName}`,
        formatBytes(status.completedResourceSize),
        status.percentage,
        status.state,
      );
    }
  };

  const errorListener = (offlineRegion, err) => {
    console.log("pack error", offlineRegion, err);
  };

  const packConfig = {
    name: packName,
    styleURL: styleURL,
    minZoom: MAP_CONFIG.MIN_ZOOM_ALLOWED,
    maxZoom: MAP_CONFIG.MAX_ZOOM_ALLOWED,
    bounds,
  };

  await MapboxGL.offlineManager.createPack(
    packConfig,
    progressListener,
    errorListener,
  );

  // console.log("packConfig", packConfig);
};

区域参数

LOG  bounds field-region-74 [[67.05473691050432, 24.859774187835313], [67.05879400202377, 24.864996599470516]]
LOG  bounds field-region-73 [[67.05603555964123, 24.863974062407152], [67.06011966003771, 24.86902696726922]]
LOG  bounds field-region-72 [[67.05860259878298, 24.868365914318616], [67.06177770104551, 24.871585472853567]]
LOG  bounds field-region-71 [[67.0527601437771, 24.865385527088804], [67.06248793623786, 24.878936670953124]]
LOG  bounds field-region-70 [[67.0575708775574, 24.859917106865936], [67.06827409941002, 24.868984873055723]]

错误日志

LOG  pack error {"pack":{"metadata":"{\n  \"name\" : \"field-region-74\"\n}","bounds":"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.05473691050432,24.859774187835313]}},{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.05879400202377,24.864996599470516]}}]}","_metadata":null} {"message":"Failed to resolve tileset descriptors: Loading request canceled","name":"field-region-74"}

LOG  pack error {"pack":{"metadata":"{\n  \"name\" : \"field-region-73\"\n}","bounds":"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.05603555964123,24.863974062407152]}},{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.06011966003771,24.86902696726922]}}]}","_metadata":null} {"name":"field-region-73","message":"Failed to resolve tileset descriptors: Loading request canceled"}

LOG  pack error {"pack":{"metadata":"{\n  \"name\" : \"field-region-72\"\n}","bounds":"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.05860259878298,24.868365914318616]}},{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.06177770104551,24.871585472853567]}}]}","_metadata":null} {"name":"field-region-72","message":"Failed to resolve tileset descriptors: Loading request canceled"}

LOG  pack error {"pack":{"metadata":"{\n  \"name\" : \"field-region-71\"\n}","bounds":"{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.0527601437771,24.865385527088804]}},{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Point\",\"coordinates\":[67.06248793623786,24.878936670953124]}}]}","_metadata":null} {"name":"field-region-71","message":"Failed to resolve tileset descriptors: Loading request canceled"}
 
LOG  Pack: field-region-70 2.18 MB 100 complete

解决方案

1. 预加载样式文件,确保tileset描述符解析完成

createPack依赖样式文件中的tileset配置,生产环境下样式加载可能因网络或资源调度问题被中断。先预加载样式,确认解析完成后再创建离线包:

const downloadPack = async (packName, bounds) => {
  console.log("bounds", packName, bounds);

  // 预加载并解析样式
  await MapboxGL.Style.load(styleURL);

  // Delete old pack
  await MapboxGL.offlineManager.deletePack(packName);

  // ... 剩余原有代码不变
};

2. 添加重试机制,处理临时网络/资源竞争问题

针对Loading request canceled这类临时错误,添加指数退避重试逻辑:

const downloadPack = async (packName, bounds, retries = 3) => {
  console.log("bounds", packName, bounds);

  try {
    await MapboxGL.Style.load(styleURL);
    await MapboxGL.offlineManager.deletePack(packName);

    const progressListener = (offlineRegion, status) => {
      if (status.state === "complete") {
        console.log(
          `Pack: ${packName}`,
          formatBytes(status.completedResourceSize),
          status.percentage,
          status.state,
        );
      }
    };

    const errorListener = (offlineRegion, err) => {
      console.log("pack error", offlineRegion, err);
    };

    const packConfig = {
      name: packName,
      styleURL: styleURL,
      minZoom: MAP_CONFIG.MIN_ZOOM_ALLOWED,
      maxZoom: MAP_CONFIG.MAX_ZOOM_ALLOWED,
      bounds,
    };

    await MapboxGL.offlineManager.createPack(
      packConfig,
      progressListener,
      errorListener,
    );
  } catch (err) {
    if (retries > 0 && err.message.includes("Loading request canceled")) {
      console.log(`Retrying ${packName}, remaining retries: ${retries - 1}`);
      // 指数退避延迟
      await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, 3 - retries)));
      return downloadPack(packName, bounds, retries - 1);
    }
    throw err;
  }
};

3. 确保旧包完全删除后再创建新包

删除包后,等待离线管理器状态同步,避免资源竞争:

// 替换原删除包的逻辑
await MapboxGL.offlineManager.deletePack(packName);
// 确认包已删除
const packs = await MapboxGL.offlineManager.getAllPacks();
const exists = packs.some(pack => pack.metadata.name === packName);
if (exists) {
  await new Promise(resolve => setTimeout(resolve, 500));
}

4. 验证生产环境网络访问权限

确保生产环境允许访问Mapbox相关域名(如api.mapbox.com、tiles.mapbox.com),避免请求被代理、防火墙或CDN拦截。

5. 检查bounds坐标顺序

确认bounds使用Mapbox要求的**[西南经纬度, 东北经纬度]**顺序,避免因坐标顺序错误导致tileset解析异常。

内容的提问来源于stack exchange,提问作者Waleed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:05:21