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 基礎介紹