关于cesium中tif文件处理加载在三维地图中得方式

项目场景:

在Gis项目关于tif影像数据是不能直接在地图上面加载,只能通过后端进行处理,或者前端进行处理之后才能叠加到地图上面!


处理方式

1.安装geotiff插件

c 复制代码
npm install geotiff -g

2.利用插件处理tif文件

c 复制代码
import GeoTIFF, { fromBlob, fromUrl, fromArrayBuffer } from 'geotiff';
import GeoTIFFImage from 'geotiff/dist-node/geotiffimage';
export default class GeoTiffUtil {
  tiff: GeoTIFF;
  img: GeoTIFFImage;
  constructor() {}
  async init(blob: string) {
    //this.tiff = await fromBlob(blob);

    let response = await fetch(blob);

    let af = await response.arrayBuffer();

    this.tiff = await fromArrayBuffer(af);
    this.img = await this.tiff.getImage();
  }
  getBbox(): number[] {
    return this.img.getBoundingBox();
  }
  getEPSGCode() {
    return this.img.geoKeys;
  }
  async getRasters(): Promise<any> {
    return await this.img.readRasters();
  }
  getWidthHeight(): { width: number; height: number } {
    return { width: this.img.getWidth(), height: this.img.getHeight() };
  }
}

3上传文件

c 复制代码
<Dragger {...uploadProps}>
               <p className="ant-upload-hint" style={{ color: 'white' }}>
                 파일을 드래그 앤 드롭하여 업로드 하세요.
               </p>
</Dragger>

4核心处理

c 复制代码
const uploadProps = {
    name: 'file',
    action: '/server/api/file/upload',
    accept: '.png,.jpg,.tif',
    headers: {
      authorization: '',
    },
    data: {
      userAccount: 'userId',
    },
    maxCount: 1,
    onChange(info: { file: any; fileList?: any; }) {
      const { status } = info.file;
      const { file } = info;
      if (status !== 'uploading') {
        console.log(info.file, info.fileList);
      }
      if (status === 'done') {
        message.success(`${info.file.name} file uploaded successfully.`);
        if (file.response && file.response.code == 200) {
          if (file.response.data.fileSuffix == '.tif') {
            let newUrl = AppConfig.flightUrl1 + file.response.data.fileUrl;
            // const imageryLayer = new Cesium.ImageryLayer(new Cesium.SingleTileImageryProvider({
            //     url: newUrl
            // }));
            // window.cviewer.flyTo(imageryLayer)
            // window.cviewer.imageryLayers.add(imageryLayer);
            console.log(111111111,newUrl)
            let tiffUtil = new GeoTiffUtil();
            tiffUtil.init(newUrl).then(() => {
              let hw = tiffUtil.getWidthHeight();
              tiffUtil
                  .getRasters()
                  .then((rs) => {
                    const [red = [], green = [], blue = []] = rs;
                    let canvas = document.createElement('canvas');
                    canvas.width = hw.width;
                    canvas.height = hw.height;
                    let ctx = canvas.getContext('2d');
                    let imageData = ctx.createImageData(hw.width, hw.height);
                    for (var i = 0; i < imageData.data.length / 4; i++) {
                      imageData.data[i * 4 + 0] = red[i];
                      imageData.data[i * 4 + 1] = green[i] || 0;
                      imageData.data[i * 4 + 2] = blue[i] || 0;
                      imageData.data[i * 4 + 3] = red[i] === 0 ? 0 : 255;
                    }
                    ctx.putImageData(imageData, 0, 0);
                    let temp1 = {
                      key: file.response.fileName,
                      fileNm: file.response.data.fileName,
                      fileNmOriginal: file.name,
                      filePath: canvas.toDataURL(),
                      fielSize: file.size,
                      fielExt: file.response.data.fileSuffix,
                      date:
                          new Date().getFullYear() +
                          '.' +
                          (new Date().getMonth() + 1) +
                          '.' +
                          new Date().getDate(),
                    };
                    console.log(999999,temp1)
                    setData([...data, temp1]);
                  })
                  .catch((res) => {
                    console.log(res);
                  });
            });
          } else {
            let temp = {
              key: file.response.fileName,
              fileNm: file.response.data.fileName,
              fileNmOriginal: file.name,
              filePath: AppConfig.flightUrl1 + file.response.data.fileUrl,
              fielSize: file.size,
              fielExt: file.response.data.fileSuffix,
              date:
                  new Date().getFullYear() +
                  '.' +
                  (new Date().getMonth() + 1) +
                  '.' +
                  new Date().getDate(),
            };
            setData([...data, temp]);
          }
        }
      } else if (status === 'error') {
        message.error(`${info.file.name} file upload failed.`);
      }
    },
    onRemove: (file) => {
      setfileListobj(null);
    },
  };
相关推荐
你怎么知道我是队长4 小时前
C语言---头文件
c语言·开发语言
期待のcode4 小时前
Java虚拟机的运行模式
java·开发语言·jvm
hqwest4 小时前
码上通QT实战25--报警页面01-报警布局设计
开发语言·qt·qwidget·ui设计·qt布局控件
a程序小傲5 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
HellowAmy5 小时前
我的C++规范 - 玩一个小游戏
开发语言·c++·代码规范
Irene19915 小时前
Vue 官方推荐:kebab-case(短横线命名法)
javascript·vue.js
徐先生 @_@|||5 小时前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
tang777896 小时前
爬虫如何绕过绕过“5秒盾”Cloudflare:从浏览器指纹模拟到Rust求解之不完全指南
开发语言·爬虫·rust·cloudflare
Yuer20256 小时前
什么是 Rust 语境下的“量化算子”——一个工程对象的最小定义
开发语言·后端·rust·edca os·可控ai
2501_948195346 小时前
RN for OpenHarmony英雄联盟助手App实战:符文配置实现
javascript·react native·react.js