geotrellis使用(三十七)COG 基础介绍
前言
Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 COG,COG 是什么鬼?刚看到时我也是一脸懵,认认真真的学习了一天,稍有体会,本文对此进行简单介绍。
一、COG 简介
1.1 什么是 COG
COG 是 Cloud Optimized GeoTIFF's 的简称,从这个名字就能大概猜出他的意义——云端优化的 GeoTIFF。GDAL 官方 WIKI 定义如下:
A cloud optimized GeoTIFF is a regular GeoTIFF file, aimed at being hosted on a HTTP file server, whose internal organization is friendly for consumption by clients issuing HTTP GET range request ("bytes: start_offset-end_offset" HTTP header).
It contains at its beginning the metadata of the full resolution imagery, followed by the optional presence of overview metadata, and finally the imagery itself. To make it friendly with streaming and progressive rendering, we recommand starting with the imagery of the smallest overview and finishing with the imagery of the full resolution level.
简单来说 COG 是规则的 GeoTIFF 文件,只是对普通 GeoTIFF 文件加了些概览等元数据信息,使得可以通过 HTTP 进行局部数据的读取,即需要哪部分的数据就下载哪部分数据。
那么这有什么好处呢?
1.2 COG 的好处
COG 的产生是针对云端文件的(cloud),现在有很多云存储供应商,如 S3、Google Cloud Storage、Azure 等等,GeoTIFF 文件存在云端最大的问题是每次对文件进行处理都需要将其全部取回到本地,处理完成后再上传到云端,这会耗费大量下载和上传的时间、占用存储空间,并且云存储多是根据流量收费,多次下载、上传又会增加网络费用支出。
于是 COG 便应运而生,他以云端为工作流的中心而非本地,不需每次处理 GeoTIFF 文件时将整个文件下载下来,只需要下载需要处理的部分,并且尽量实现数据的云端处理。
1.3 创建 COG
最简单的方式是通过 GDAL 创建 COG,GDAL 无需多言,凡是接触过地理信息的应该都知道此框架,执行如下命令:
gdal_translate in.tif out.tif -co TILED=YES -co COPY_SRC_OVERVIEWS=YES -co COMPRESS=DEFLATE
这样就可以将普通 GeoTIFF 文件转为 COG 文件,而后只需要将其发布为 HTTP 服务即可(文件下载服务),但是此 HTTP 服务必须支持 HTTP range queries,当前 Nginx、Apache 等都是支持此特性的,这也是断点续传的实现方式。当然你也可以直接将其上传到 S3 等云存储,会达到相同的效果。
二、COG 在 Geotrellis 中的应用
2.1 Geotrellis 当前工作流的弊端
在 Geotrellis 中要对一个数据进行处理,首先进行 ETL 操作,将数据 ingest 到其支持的后端中(S3、Hadoop、Accumulo、HBASE 等)形成 Layer 的概念,这样其实在后端中存储的是切割好的不同层级的大量小瓦片;然后再根据需求读出相应的瓦片进行处理或者发送到前端。
到了 2.0 版开发人员意识到一个问题,或者说是早就意识到了这个问题,那就是与 COG 建立的初衷相似,无论是 S3 还是 HDFS 其实都对大量小文件的支持不好、性能不高且占用大量的存储空间,严重影响服务性能。
2.2 COG 支持
于是 Geotrellis 开发人员想到将 COG 运用到此框架中。简单来说不再需要 ETL 操作,或者说是另外一种的 ETL 操作——将普通的 GeoTIFF 文件转换为 COG 文件。在转换的过程中也同样生成对应的元数据,这个元数据里描述的是如何找到x、y、z(SpatialKey 等)请求对应的数据,包括文件名称、存储位置、数据范围(HTTP Range)等,这样就可以通过此范围请求到此数据,并可以对此数据进行其他处理。
有了 COG 的支持,对 Geotrellis 来说无疑是如虎添翼,不仅解决了瓦片数据性能及占用大量存储空间的问题,也解决了瓦片切割耗时长的问题,数据处理不再耗用大量时间,当然任何事情都是辩证的,我猜测在数据读取的时候会比原有方式稍慢(未经过实际测试),这个还是要看系统的需求,平衡各方利弊之后设计满足自身需要的合理解决方案,这也正是一个“资深”程序员应当考虑的事情。
三、总结
本文简单介绍了 COG 以及其在 Geotrellis 中的使用,此处仅是理论和概念探讨,会在后续文章中详细介绍如何在 Geotrellis 中使用 COG。
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html
geotrellis使用(三十七)COG 基础介绍的更多相关文章
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- 【Hadoop离线基础总结】Apache Hadoop的三种运行环境介绍及standAlone环境搭建
Apache Hadoop的三种运行环境介绍及standAlone环境搭建 三种运行环境 standAlone环境 单机版的hadoop运行环境 伪分布式环境 主节点都在一台机器上,从节点分开到其他机 ...
- Web3D编程入门总结——WebGL与Three.js基础介绍
/*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...
- 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索
第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...
- Node.js学习笔记(一)基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- Node.js 基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- Gradle 1.12用户指南翻译——第三十七章. OSGi 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 日志学习系列(三)——NLog基础知识
前边我们解释了log4net的学习,我们再介绍一下NLog 一.什么是NLog NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单 ...
- SQL注入之Sqli-labs系列第三十六关(基于宽字符逃逸GET注入)和三十七关(基于宽字节逃逸的POST注入)
0X1 查看源码 function check_quotes($string) { $string= mysql_real_escape_string($string); return $string ...
随机推荐
- angularjs上传图片和文件
很简单: $scope.upload = function() { var f = $scope.myFile; var fd = new FormData(); var img = document ...
- Javscript的函数链式调用基础篇
我们都很熟悉jQuery了,只能jQuery中一种非常牛逼的写法叫链式操作: $('#div').css('background','#ccc').removeClass('box').stop(). ...
- nuxt 的一些报错和插件推荐
1.项目有启动报这个错误的,是因为node版本太低了,nuxt要求node版本要达到8.0.0以上 . 2.插件推荐
- Android实用代码七段(二)
正文 一.获取应用程序下所有Activity public static ArrayList<String> getActivities(Context ctx) { Arra ...
- 笔试常考--浏览器兼容性问题及解决方案(CSS)
问题一:不同浏览器的标签默认的外补丁和内补丁不同 问题现象:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大. 解决方案:css里加: ;;} 备注:这个是最常见的也 ...
- git常用命令速查
创建 $ git init #在当前目录下创建一个空的本地仓库 $ rm -rf .git #删除本地仓库 $ git add . #把当前目录下的所有文件添加到暂存区 $ git commi ...
- 关于C语言的第0次作业
1.你认为大学的学习生活.同学关系.师生关系应该是怎样的?请一个个展开描述. 我认为的大学学习生活是充实的,丰富多彩的,与高中快节奏.繁忙的生活有所不同.在上了大学我们都成熟了很多,懂得了包容与忍让, ...
- vmware ubuntu蓝屏
ctrl+alt+f4 sudo apt-get update sudo apt-get upgrade sudo apt-get install xserver-xorg-lts-utopic su ...
- 201621123068 《Java程序设计》第1周学习总结
1. 本周学习总结 本周学习了如何使用Java来编写程序,还没展开学习具体的语言,但是也花了大量的时间搞清楚Java运行的原理.明白了Java是一种可以跨平台运行语言,搞清了jdk,jre,jvm之间 ...
- JAVA_SE基础——1.JDK&JRE下载及安装
这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...