openlayer vue3直接加载COG格式的TIF影像文件


前言

地图影像一般都为TIF格式的数据,但是直接加载TIF影像的话会存在一些性能问题,想比传统的TIF数据,COG格式的TIF数据对前端渲染来说更加的方便,快捷,因此需要后台对tif文件进行切割为COG 格式的数据。


一、COG是什么?

这里直接引用一些大佬的博文进行解释,https://blog.csdn.net/Neuromancerr/article/details/123568413;
下面的文章也采用了该博文片段,写出来的目的记录一下并方便以后查阅。

二、Openlayer加载COG文件

1.引入库

用到的是vue3模版,渲染tif文件需要借助geotiff.js库

import { onMounted } from 'vue';
import GeoTIFF, { fromBlob, fromUrl, fromArrayBuffer, Pool } from 'geotiff';

import GeoTIFFSource from 'ol/source/GeoTIFF';
import Map from 'ol/Map';
import WebGLTile from 'ol/layer/WebGLTile';
import View from 'ol/View';

2.渲染COG数据

/**
 * 获取tif元信息
 * @param url
 * @returns  noData,波段信息
 */
const getGeoTifMetaData = async url => {
  const tiff = await fromUrl(url);
  const image = await tiff.getImage();
  const bands = [];
  // 获取波段数
  const samples = image.getSamplesPerPixel();
  for (let i = 0; i < samples; i++) {
    // 获取该波段信息 如果element都为null 需要后台对波段执行ComputeStatistics,生成GDAL_METADATA
    const element = image.getGDALMetadata(i);
    console.log('ele', element);
    bands.push(element);
  }
  // 获取nodata值 暂时并不知道这个值有什么用!!!
  const noData = image.getGDALNoData();
  return { noData, bands };
};

onMounted(async () => {
  // 这里在本地进行了代理,真实地址为http://***.**.**
  const url = '/cog1/tif/L1C_T51TWJ_A037266_20220811T024318.tif ';
  const source = new GeoTIFFSource({
    normalize: false,
    sources: [
      {
        url,
        // 这里可以手动重设min,max,nodata等属性以覆盖tif原始信息
        nodata: 0,
      },
    ],
  });
  const map = new Map({
    target: 'map',
    layers: [],
    view: source.getView(),
  });

  const metaData = await getGeoTifMetaData(url);
  // 取出元信息里的波段最大最小值
  const bands = metaData.bands.map(item => {
    console.log('itm', item);
    return {
      min: parseFloat(item.STATISTICS_MINIMUM),
      max: parseFloat(item.STATISTICS_MAXIMUM),
    };
  });

  const style = {
    color: [
      'array',
      // 线性映射字段,把波段里面的最小值映射为0,最大值映射为1(0-1的区间与计算机图形处理相关)
      // 最后一位数值代表颜色深浅
      ['interpolate', ['linear'], ['band', 1], bands[0].min, 0, bands[0].max, 4],
      ['interpolate', ['linear'], ['band', 2], bands[1].min, 0, bands[1].max, 4],
      ['interpolate', ['linear'], ['band', 3], bands[2].min, 0, bands[2].max, 4],
      1,
    ],
  };

  // 加载是异步的
  source.getView().then(view => {
    const layer = new WebGLTile({
      className: 'WebGLTile',
      style,
      source,
      zIndex: 999,
      extent: view.extent,
    });
    map.addLayer(layer);
    map.getView().fit(view.extent);
  });
});

总结

另外:影像的波段颜色这块代码调试比较麻烦点。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种流行的JavaScript框架,而OpenLayers是一种开源JavaScript库,用于创建交互式地图应用程序。要在Vue项目中加载地图,我们需要在Vue组件中引入OpenLayers库,并使用相关的JavaScript代码来实现。 首先,在Vue项目中安装OpenLayers库。我们可以使用npm或yarn来安装OpenLayers。在项目的根目录中打开终端,并运行以下命令: ``` npm install ol ``` 或 ``` yarn add ol ``` 安装完成后,我们可以在Vue组件中引入OpenLayers库。在需要加载地图的Vue组件中的script标签中,添加以下代码: ```javascript import ol from 'ol'; export default { data() { return { map: null }; }, mounted() { this.initializeMap(); }, methods: { initializeMap() { this.map = new ol.Map({ target: 'map-container', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: [0, 0], zoom: 2 }) }); } } }; ``` 上述代码中,我们首先引入了OpenLayers库并创建了一个名为`map`的data属性。在`mounted`生命周期钩子中,我们调用了`initializeMap`方法来初始化地图。在`initializeMap`方法中,我们创建一个新的`ol.Map`实例,并将其绑定到id为`map-container`的HTML元素上。同时,我们还添加了一个基本的Tile图层,使用OpenStreetMap的数据源,并设置了初始的视图中心和缩放级别。 最后,在Vue组件的模板中,我们需要添加一个id为`map-container`的HTML元素,作为地图的容器,例如: ```html <template> <div id="map-container"></div> </template> ``` 运行项目,你就能够在浏览器中看到OpenLayers加载的地图了。通过使用OpenLayers的各种功能和选项,我们可以进一步自定义和扩展地图应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值