mapbox-gl.js:30 Error: Layer with id “test_map“ already exists on this map

mapbox-gl多次绘制地图报错问题

初次点击控制台显示正常,第二次点击时控制台报Error,报错内容如下:

mapbox-gl.js:30 Error: Layer with id "test_map" already exists on this map
    at i.addLayer (mapbox-gl.js:34:125707)
    at r.addLayer (mapbox-gl.js:34:328187)
    at drawHN (TestMap.vue?./node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/ts-loader??ref--14-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader-v16/dist??ref--0-1:46:17)
    at callWithErrorHandling (runtime-core.esm-bundler.js:276:22)
    at callWithAsyncErrorHandling (runtime-core.esm-bundler.js:285:21)
    at emit (runtime-core.esm-bundler.js:761:9)
    at Proxy.handleClick (button.js:147:12)
    at callWithErrorHandling (runtime-core.esm-bundler.js:276:22)
    at callWithAsyncErrorHandling (runtime-core.esm-bundler.js:285:21)
    at HTMLButtonElement.invoker (runtime-dom.esm-bundler.js:521:97)

猜测错误产生原因:mapbox-gl 绘制图层是都会有一个图层ID,多次点击时图层ID 没变,导致图层ID 重复。

验证猜测:荣国随机数产生图层ID,查看控制台是否还继续报错

验证结果:控制台无报错,猜测正确

解决问题:在绘制图层前,先判断图层是否绘制,如已绘制清除重新绘制。

代码如下:

const drawHN = () => {
  if ((state.map as any).getLayer("test_map")) {
    (state.map as any).removeLayer("test_map"); //清除图层
    (state.map as any).removeSource("test_map"); //清除图层数据
  }
  (state.map as any).addLayer({
    id: "test_map",
    type: "fill",
    source: {
      type: "geojson",
      data: HN
    },
    layout: {},
    paint: {
      "fill-color": "#ff0000",
      "fill-opacity": 0.8
    },
    maxzoom: 6
  });
};

mapbox-gl多次绘制地图报错问题

初次点击控制台显示正常,第二次点击时控制台报Error,报错内容如下:

mapbox-gl.js:30 Error: Layer with id "test_map" already exists on this map
    at i.addLayer (mapbox-gl.js:34:125707)
    at r.addLayer (mapbox-gl.js:34:328187)
    at drawHN (TestMap.vue?./node_modules/cache-loader/dist/cjs.js??ref--14-0!./node_modules/babel-loader/lib!./node_modules/ts-loader??ref--14-2!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader-v16/dist??ref--0-1:46:17)
    at callWithErrorHandling (runtime-core.esm-bundler.js:276:22)
    at callWithAsyncErrorHandling (runtime-core.esm-bundler.js:285:21)
    at emit (runtime-core.esm-bundler.js:761:9)
    at Proxy.handleClick (button.js:147:12)
    at callWithErrorHandling (runtime-core.esm-bundler.js:276:22)
    at callWithAsyncErrorHandling (runtime-core.esm-bundler.js:285:21)
    at HTMLButtonElement.invoker (runtime-dom.esm-bundler.js:521:97)

猜测错误产生原因:mapbox-gl 绘制图层是都会有一个图层ID,多次点击时图层ID 没变,导致图层ID 重复。

验证猜测:荣国随机数产生图层ID,查看控制台是否还继续报错

验证结果:控制台无报错,猜测正确

解决问题:在绘制图层前,先判断图层是否绘制,如已绘制清除重新绘制。

代码如下:

const drawHN = () => {
  if ((state.map as any).getLayer("test_map")) {
    (state.map as any).removeLayer("test_map"); //清除图层
    (state.map as any).removeSource("test_map"); //清除图层数据
  }
  (state.map as any).addLayer({
    id: "test_map",
    type: "fill",
    source: {
      type: "geojson",
      data: HN
    },
    layout: {},
    paint: {
      "fill-color": "#ff0000",
      "fill-opacity": 0.8
    },
    maxzoom: 6
  });
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万水千山走遍TML

您的鼓励,将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值