mapbox加载tif(利用geotiff.js)

贴个群号

WebGIS学习交流群461555818,欢迎大家

源码

代码我也是从网上抄的,所以此处不做介绍了,自己记录一下我遇到的问题。

记得要注意coordinates中的bbox的取值顺序,顺序会导致其旋转或者镜像的展示,文中顺序为正常顺序。
还有颜色的区分要根据灰度值那里自己选择范围取色,文中颜色的取值为全白。

      let url = './static/测试.tif'
      console.log(GeoTIFF)
      // async function getData() {
      GeoTIFF.fromUrl(url).then(tiff => {
        console.log(tiff)
        this.getImage(tiff)
      });
    async  getImage(tiff) {
      const image = await tiff.getImage();
      let bbox = await image.getBoundingBox();
      console.log(bbox)
      let data = await image.readRasters({
        // samples: rgbBands // 波段数量,一个波段:[0],三个波段:[2,1,0]
        
        samples: [0] // 波段数量,一个波段:[0],三个波段:[2,1,0]
      });
      let base64Image = this.getBase64Image(data)
      this.addToMapboxgl(base64Image,bbox)
    },
    getBase64Image(data) {
      console.log('tiff',data)
      let thumbnailPixelHeight = data.height
      let thumbnailPixelWidth = data.width
      let canvas = document.createElement('canvas')
      canvas.width = thumbnailPixelWidth
      canvas.height = thumbnailPixelHeight
      let ctx = canvas.getContext("2d")
      let totalPixelCount = 0
      for (let y = 0; y < thumbnailPixelHeight; y++) {
        for (let x = 0; x < thumbnailPixelWidth; x++) {
          let colour = 'rgb(0, 0, 0, 0)' // let the default be no data (transparent)
          // 根据灰度值所在范围渲染颜色
          if (data[0][totalPixelCount] > 0) {
            colour = 'rgb(255, 255, 255, 1)'
            // if (data[0][totalPixelCount] > 0 && data[0][totalPixelCount] <= 1) {
            //   colour = `rgb(0, 0, 0, 1)`
            // } else if (data[0][totalPixelCount] > 2 && data[0][totalPixelCount] <= 3) {
            //   colour = `rgb(64, 64, 64, 1)`
            // } else if (data[0][totalPixelCount] > 3 && data[0][totalPixelCount] <= 4) {
            //   colour = `rgb(128, 128, 128, 1)`
            // } else {
            //   colour = `rgb(191, 191, 191, 1)`
            // }
          }
          ctx.fillStyle = colour
          ctx.fillRect(x, y, 1, 1)
          totalPixelCount++
        }
      }
      let canvasImage = canvas.toDataURL("image/png")
      return canvasImage
    },
    // 将图片添加到地图
    addToMapboxgl(image,bbox) {
      // bbox = [120,20,140,40]
      if(!this.map.getSource('tiff-test')){
        this.map.addSource('tiff-test', {
          "type": "image",
          "url": image,
          "coordinates": [
            [bbox[0],bbox[3]],
            [bbox[2],bbox[3]],
            [bbox[2],bbox[1]],
            [bbox[0],bbox[1]],
          ]
        });
        this.map.addLayer({
          id: 'tiff-test',
          'type': 'raster',
          'source': 'tiff-test',
          'paint': {
            'raster-fade-duration': 0
          }
        });
      }else{
        this.map.getSource('tiff-test').updateImage({
          url:image,
          coordinates: [
            [bbox[0],bbox[3]],
            [bbox[2],bbox[3]],
            [bbox[2],bbox[1]],
            [bbox[0],bbox[1]],
          ]
        })
      }
      mapFunction.controlLayerLocation({
        type:'image',
        id:'tiff-test'
      },this.map)

    },
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值