ArcGIS JS API 4.x 在二维场景(MapView)下加载天地图影像,及防止出现此级别,无影像

一些需要引入的Api,就不提了,直接上代码:

       const TintLayer = BaseTileLayer.createSubclass({
        properties: {
          urlTemplate: null,
          tint: {
            value: null,
            //type: Color
          }
        },
        // 生成给定级别、行和列的平铺url
        getTileUrl: function (level, row, col) {
          return this.urlTemplate.replace("{z}", level).replace("{x}",
            col).replace("{y}", row);
        },
        fetchTile: function (level, row, col) {
          // let url = this.getTileUrl(level, row, col);
          var p = 1
          var oldLv = level
          if (level > 18) {
            p = Math.pow(2, level - 18)
            var oldRow = row
            var oldCol = col
            row = Math.trunc(row / p)
            col = Math.trunc(col / p)
            level = 18
          }
          var url = this.urlTemplate.replace("{z}", level).replace("{x}", col).replace("{y}", row);
          return esriRequest(url, {
            responseType: "image",
            allowImageDataAccess: true
          }).then(function (response) {
            let image = response.data;
            let width = this.tileInfo.size[0];
            let height = this.tileInfo.size[0];
            // create a canvas with 2D rendering context
            let canvas = document.createElement("canvas");
            let context = canvas.getContext("2d");
            canvas.width = width;
            canvas.height = height;
            // Draw the blended image onto the canvas.
            if (oldLv > 18) {
              var ux = width / p
              var uy = height / p
              var r = oldRow % p
              var c = oldCol % p
              context.drawImage(image, c * ux, r * uy, ux, uy, 0, 0, width, height)
            } else {
              context.drawImage(image, 0, 0, width, height);
            }
            return canvas;
          }.bind(this));
        }
      });
      //随机算出八个数带入url
      const tdt_n = Math.floor(Math.random() * 8);
      const tiandituVec = new TintLayer({
        urlTemplate: "http://t" + tdt_n + ".tianditu.gov.cn/DataServer?T=vec_w&tk=" + “天地图Key” + "&x={x}&y={y}&l={z}",
        tint: new Color("#004FBB"),
        title: "矢量图"
      });
      const tiandituCva = new TintLayer({
        urlTemplate: "http://t" + tdt_n + ".tianditu.gov.cn/DataServer?T=cva_w&tk=" + “天地图Key” + "&x={x}&y={y}&l={z}",
        tint: new Color("#004FBB"),
        title: "注记"
      });
      const tiandituImg = new TintLayer({
        urlTemplate: "http://t" + tdt_n + ".tianditu.gov.cn/DataServer?T=img_w&tk=" + “天地图Key” + "&x={x}&y={y}&l={z}",
        tint: new Color("#004FBB"),
        title: "影像图"
      });

      const map = new Map({
        logo: false,
      });
      this.map = map
      map.add(tiandituImg)
      map.add(tiandituCva)

      const view = new MapView({
        map: map,
        center:[122.106863,30.016028],
        zoom: 12,
        container: "map"
      });
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值