COG(Cloud optimized GeoTIFF——云优化GeoTiff)简介与实践
参考
简介部分翻译自cogeo
关于GeoTIFF文件格式,参考了osgeo和awaresystems
关于HTTP请求范围,参考MDN-HTTP范围请求
云优化GeoTIFF(COG)是一个常规的GeoTIFF文件,旨在托管在 HTTP 文件服务器上,其内部组织可以在云上实现更高效的工作流。它通过利用客户端发出HTTP来仅请求他们需要的文件部分来做到这一点。
常见的问题:
- 不是很明白这个东西有啥用?
简单来说,可以代替geoserver/arcgis server发布栅格数据,比wms/wmts节省服务器空间和内存 - 支持多大的tif?
我试过最大4G多的tif,一点问题没有,缩放平移十分流畅 - 缺点和局限?
目前前端API里只知道OpenLayers支持COG直接渲染,其他api不清楚。
OL使用webgl渲染cog,对于用canvas渲染的图层适用的比如后处理功能,有些不适用。
需要对数据做转化处理。
技术概述
COG依赖两种技术
- 在GeoTIFF图片中保存除原始像元数据外的瓦片(tile)和概览(overview)
- 使用HTTP范围请求获取单一文件的所需部分
GeoTIFF构建
COG所需的GeoTIFF,主要技术是在文件内部构建瓦片和概览,辅以图像压缩。
关于瓦片
熟悉地图开发的小伙伴应该对瓦片都很熟悉了,不清楚的可以自己搜一下关键字地图瓦片,简单介绍就是将完整的影像像拼图一样按照横竖的格网拆分成瓦片,只加载需要范围内的一个个瓦片而不是完整的巨大TIFF。
常用的影像瓦片技术,比如ArcMap/ArcGIS Server,GeoServer的切片,都需要预先生成好切片存储到磁盘上,而COG是以瓦片格式存到TIFF文件中。
关于概览
概览创建同一图像的低分辨率重采样版本。这意味着它的细节要少得多(原始图像可能有 100 或 1000 像素对应到概览的 1 个像素),但也小得多。通常一个 GeoTIFF 会有很多概览,以匹配不同的缩放级别。这些增加了整个文件的大小,但能够更快地提供服务。
用过ArcMap的可能更熟悉影像金字塔这个概念,和同事讨论了下,影像金字塔应该和概览意思差不多。
完整的文件结构
- TIFF / BigTIFF 签名
- 全分辨率图像的 IFD ( Image File Directory文件图像目录 )
- 不适合内嵌在 IFD 目录中的 TIFF 标签的值,例如TileOffsets,TileByteCounts和GeoTIFF键
- 可选:第一个概览的 IFD(通常以 2 倍子采样),后跟不适合内联的标签值
- 可选:第二个概览的 IFD(图像文件目录)(通常以 4 倍子采样),后跟不适合内联的标签值
- ···
- 可选:最后概览的 IFD(通常以 2的N次幂进行二次采样),后跟不适合内联的标签值
- 可选:最后一个概览级别的瓦片内容
- ···
- 可选:第一个概览级别的瓦片内容
- 全分辨率图像的瓦片内容
HTTP范围请求
HTTP 协议范围请求允许服务器只发送 HTTP 消息的一部分到客户端。范围请求在传送大的媒体文件,或者与文件下载的断点续传功能搭配使用时非常有用。
检测服务器端是否支持范围请求
假如在响应中存在 Accept-Ranges 头部(并且它的值不为 “none”),那么表示该服务器支持范围请求。
这里请求的是我本地Nginx里的COG图像。
在上面的响应中, Accept-Ranges: bytes 表示界定范围的单位是 bytes 。这里 Content-Length 也是有效信息,因为它提供了要检索的图片的完整大小。
从服务器端请求特定的范围
假如服务器支持范围请求的话,你可以使用 Range 头来生成该类请求。该首部指示服务器应该返回文件的哪一或哪几部分。
这里就请求的该TIFF的0-65536字节。
两者结合
GeoTIFF将瓦片和概览按规则进行组织,存放放在云端(比如我本地测试用的Nginx),以便HTTP范围请求可以只请求相关的文件部分。
当客户端想要渲染整个文件的概览图像时,它不必下载每个像素,它可以只请求更小的、已经创建的概览。HTTP范围请求支持服务器上的 GeoTIFF 文件的结构使客户端能够轻松找到所需的整个文件的一部分。
当整个文件的一小部分需要处理或可视化时,瓦片就会发挥作用。这可能是概览的一部分,也可能是全分辨率。但是瓦片将一个区域的所有相关字节组织在文件的同一部分,因此范围请求可以获取它需要的内容。
如果 GeoTIFF 没有通过概览和瓦片进行“云优化”,那么对数据进行远程操作仍然有效。只是当实际只需要很小一部分数据时,他们可能会下载整个文件或大部分文件。
COG生成
可以使用GDAL生成COG。这里简单介绍下GDAL,它是一个基于C++的空间数据功能库,我这里有基于JAVA和Python的安装介绍,见Java安装GDAL依赖,python安装GDAL。
基于Java或Python开发可以将COG生成的功能比较方便地集成到现有工程里,除此之外也可以使用GDAL现成的脚本,这些脚本可以先按照Java安装GDAL依赖里下载的压缩包,解压后在release-1928-x64-dev\release-1928-x64\bin\gdal\apps下找到。
使用脚本将普通tif转成COG可以这样操作:
- CD到脚本目录
- 执行以下脚本,生成概览
gdaladdo -r average 你的tif路径 2 4 8 16 32
- 执行以下脚本,生成COG
gdal_translate 输入tif的路径 输出tif的路径 -co TILED=YES -co COMPRESS=DEFLATE -co COPY_SRC_OVERVIEWS=YES
主要参数的含义:
- TILED=YES 生成瓦片
- COMPRESS=DEFLATE 使用DEFLATE方法压缩
- COPY_SRC_OVERVIEWS=YES 从原数据中拷贝概览
使用Python程序生成的代码见这篇文章
成果查看
生成的COG有多种方法检验和查看,比如使用validate_cloud_optimized_geotiff.py检验
python validate_cloud_optimized_geotiff.py test.tif
至于查看,个人感觉比较方便的是使用QGIS(3.2以上版本)。
QGIS是一个免费开源的GIS桌面端软件,和常用的ArcMap相比最大的优点肯定是免费(不需要破解 ),而且体量较轻,打开比较快,而且基本功能也比较全。
当你生成了一个COG并且启用网络容器,如Nginx,就可以用QGIS打开COG的网络地址来在线查看。
这样就可以看到了。右键图层窗口里的图层对象,查看Properties,可以查看该COG的属性信息,如范围,波段信息,空间参考等
QGIS还可以加载在线地图服务,可以看下影像位置准不准,和其他资源对比下之类的
这里做了波段拉伸,不然影像一片黑
在线渲染(基于Openlayers)
Openlayers更新了WebGLTile图层和GeoTIFFSource数据源,用geotiffjs解析tif源数据,再用WebGL渲染,实现了前端渲染GeoTIFF图像并进行波段组合,拉伸等功能。
这里的例子用的是VUE2+TypeScript
OL的引入不赘述了,下面是用到的组件
import GeoTIFFSource from "ol/source/GeoTIFF";
import Map from "ol/Map";
import WebGLTile from "ol/layer/WebGLTile";
import View from "ol/View";
获取元信息
COG文件里存储的波段信息和nodata值可以通过geotiffjs获取。
注意,这里获取是为了演示功能,如果仅为了显示不需要提前获取并使用自己指定的像素真实值范围,OL的GeoTIFFSource默认开启了normalize属性,将波段像素范围自动标准化为0-1之间的比例。
/*** 获取tif元信息* @param url* @returns noData,波段信息*/
export async function getGeoTifMetaData(url: string) {// 返回的是GeoTIFF对象 https://geotiffjs.github.io/geotiff.js/module-geotiff-GeoTIFF.htmlconst tiff = await fromUrl(url);// 返回GeoTIFFImage https://geotiffjs.github.io/geotiff.js/module-geotiffimage-GeoTIFFImage.htmlconst image = await tiff.getImage();const bands = [];// 获取波段数const samples = image.getSamplesPerPixel();for (let i = 0; i < samples; i++) {// 获取该波段信息const element = image.getGDALMetadata(i);bands.push(element);}// 获取nodata值const noData = image.getGDALNoData();return { noData, bands };
}
获取的元信息如下
编写渲染表达式
OL的WebGL图层使用表达式配置图层的渲染样式,具体的语法详见ExpressionValue
const url = "http://localhost:8082/static/cogtest/cog_origin.tif";const metaData = await this.getGeoTifMetaData(url);
// 取出元信息里的波段最大最小值
const bands = metaData.bands.map((item) => {return {min: parseFloat(item.STATISTICS_MINIMUM),max: parseFloat(item.STATISTICS_MAXIMUM),};
});const style = {color: ["array",// 这里123波段对应RGB,分别做线性拉伸,最大值*0.1为了效果比较好// 若初始化GeoTIFFSource时normalize为true则不需要使用像素值拉伸,而是0-1之间的比例["interpolate", ["linear"], ["band", 1], bands[0].min, 0, bands[0].max * 0.1, 1],["interpolate", ["linear"], ["band", 2], bands[1].min, 0, bands[1].max * 0.1, 1],["interpolate", ["linear"], ["band", 3], bands[2].min, 0, bands[2].max * 0.1, 1],1,],
};
加载图层
const source = new GeoTIFFSource({// 默认为true,这里为了演示使用真实值拉伸设为falsenormalize: false,sources: [{url,// 这里可以手动重设min,max,nodata等属性以覆盖tif原始信息nodata: 0,},],
});
// GeoTIFF的view是异步的,里面存了COG的范围,空间参考等信息
source.getView().then((view) => {const layer = new WebGLTile({className: "WebGLTile",style,source,extent: view.extent,});const map = new Map({target: "map",layers: [layer],view: new View({projection: "EPSG:3857",}),});map.getView().fit(view.extent!, { padding: [50, 50, 50, 50] });
});
显示效果
其他功能示例可以参考OL官网的示例
COG(Cloud optimized GeoTIFF——云优化GeoTiff)简介与实践相关推荐
- COG:云优化GeoTIFF(Cloud Optimized GeoTIFF)
介绍 COG(Cloud Optimized GeoTIFF)本质上是一个GeoTIFF文件,但与常规的大文件GeoTIFF相比,它更加适合用于HTTP文件服务器进行数据发布.它不仅仅存储了影像中的原 ...
- 使用python GDAL生成COG(Cloud Optimized GeoTIFF)
参考资料: https://trac.osgeo.org/gdal/wiki/CloudOptimizedGeoTIFF#HowtogenerateitwithGDAL https://gdal.or ...
- AI之AutoML:Google AutoML(Google Cloud自动化机器学习平台库)的简介、安装、使用方法
AI之AutoML:Google AutoML(Google Cloud自动化机器学习平台库)的简介.安装.使用方法 目录 Google AutoML(Google Cloud自动化机器学习平台库)的 ...
- SAP CRM Fiori 应用和 SAP Commerce Cloud (电商云) UI 如何通过调整 CSS 来改变UI显示风格
这是Jerry 2021年的第 19 篇文章,也是汪子熙公众号总共第 290 篇原创文章. 本文分别针对 SAP CRM Fiori 应用和 SAP Commerce Cloud (电商云) UI,介 ...
- Bespin Global武文广:企业数字化转型进入深水区,Cloud IT成为云MSP发展新方向
云原生的普及正在给企业对云的应用能力(Cloud IT)提出了更高要求,传统云MSP已经无法满足这些新要求. 出品 | 常言道 作者 | 丁常彦 从2020年初至今,疫情让整个世界不得不寻找一种新的方 ...
- 叮,你收到一份云原生景观简介
原文发表于kubernetes中文社区,为作者原创翻译 ,原文地址 更多kubernetes文章,请多关注kubernetes中文社区 云原生景观系列 叮,你收到一份云原生景观简介 云原生景观:供应层 ...
- Microsoft和AWS推出免费的云优化服务
当一些小公司发展到为最优化云的使用和成本提供服务的时候,大型云提供商就开始推销他们自己的优化产品了.Microsoft最近收购了一家云性能 管理公司,为用户提供免费的产品.它的竞争者Amazon We ...
- 阿里云物联网生活平台简介
文章目录 1 阿里云物联网生活平台简介 1.1 阿里云物联网平台和阿里云生活物联网平台的区别 1.2 设备和阿里云通信使用的协议 1.3 设备和云端通信的数据格式 1.4 对端对设备的身份识别 1.5 ...
- SAP Commerce Cloud ( 电商云 ) 路由路径的自定义配置与开发
这是Jerry 2021年的第 24 篇文章,也是汪子熙公众号总共第 295 篇原创文章. 最近看到 SAP天天事 公众号发布的一篇文章: 基于 SAP Commerce Cloud,老娘舅构建的餐饮 ...
最新文章
- python 字典中的value 不在字典中,key才在
- 这么香的技术还不快点学起来,不吃透都对不起自己
- 怎么知道wx.config执行成功没_作为一个减肥40斤,且10年没反弹的普通人,这份瘦身经验分享给你...
- 国庆档票房近50亿创纪录 背后影视股却遭遇集体下跌
- 创建室内导航地图的9个步骤
- docker安装时报服务失败,因为控制进程退出并带有错误代码
- 全方面手把手从0到1带你开发谷歌浏览器插件
- ZZULIOJ:1000: 从今天开始入坑C语言 JAVA
- 金蝶shr动态列表展示自定义字段
- Credential Provider
- James Gosling : Java之父
- Express Pi 嵌入式开发板
- 贺州教师评职称计算机考试,2017年广西贺州市中职教师系列中级职称评选结果公示...
- 华为手机开启adb调试模式
- 快递查询小程序的源码
- CTF平台题库writeup(一)--南邮CTF-WEB(部分)
- 论我的dfs经验总结
- html怎么编写化学符号,水的化学符号怎么写
- 启动3dmax 9,出现脚本错误警告的解决方法
- AsciiDoc入门
热门文章
- 2022年讲究高效办公,快来看看这些让你提高效率的软件
- Educational Codeforces Round 120 (Rated for Div. 2)
- 社区团购系统案例:亲民诚品社区拼团怎么样?
- NVIDA CUDA-DirverAPI入门
- PSAM嵌入式驱动——概念
- rnss和rdss的应用_北斗RNSS/RDSS多模手持终端设计与实现
- antV G2plot清除图注removeAnnotation
- ubuntu18.04彻底卸载fcitx
- 超全客厅su模型素材网站整理
- 台式电脑怎么进入修复计算机,你的电脑/设备需要修复,请问怎么处理?