GIS 中 Raster 数据的处理
1 Raster 简介
Raster
一般翻译成 栅格
(或 网格
)。
1.1 什么是 Raster 数据?
最简形式的 Raster
由按行和列(或格网)组织的像元(或像素)矩阵组成,其中的每个像元都包含一个信息值(例如温度)。Raster
可以是数字航空像片、卫星影像、数字图片或甚至扫描的地图。
以 Raster
格式存储的数据可以表示各种实际现象:
Thematic
(专题)数据(也称为discrete
)表示土地利用或土壤数据等要素Continuous
(连续)数据表示温度、海拔高度或光谱数据(例如,卫星影像或航空像片)等现象- 图片则包括扫描的地图或绘图,以及建筑物照片
Thematic
和 Continuous
可能会作为数据图层与地图中的其他地理数据一起显示,但也常在空间分析时作为源数据使用。
- 图层
可以通过图层使用地理数据。 图层,也称作
Web 图层
,是用于创建地图和场景的地理数据的逻辑集合;图层也是地理分析的基础。例如,建筑物图层表示校园建筑物的集合并且包含描述每个建筑物属性的属性,例如建筑物的名称、建筑物的类型和建筑物的大小以及一些其他可能的属性。其他的图层示例包括地震震中、历史交通模式、地形、3D 建筑和宗地。
- 数据源
可在地图中显示的数据的基本类型是要素和影像。不同类型的图层拥有不同的功能。例如,在
CSV
文件中发布数据会创建要素图层。要素图层可使您在客户端应用程序内查询和编辑要素,并管理对实际数据的访问权限。图层中使用的数据可能来自多种数据源。一些数据源是各GIS
厂商的原生数据源,而其他数据源是基于文件的数据源(如CSV
和XLS
文件)或开放标准数据源(如KML
和OGC
)。
图片 Raster
通常用作表格中的属性,它们可同地理数据一同显示,并可传达有关地图要素的附加信息。示例见下一小节。
1.2 Raster 数据的应用
尽管 Raster
数据的结构很简单,但它在各种应用中都极为重要。在 GIS
中,Raster
数据的使用主要分为四个类别:
1.2.1 将 Raster 用作底图
在 GIS
中,Raster
数据通常用来作为其他要素图层的背景显示画面。例如,在其他图层下显示正射影像,这不仅可提供附加的信息,而且还可使地图用户更加确信地图图层在空间上已经对齐并代表着实际的对象。Raster
底图共有三种主要来源,分别为正射航空摄影、正射卫星影像和正射的扫描地图。下面是一个用作道路数据底图的 Raster
。
1.2.2 将 Raster 用作表面地图
Raster
非常适合表示那些沿地表(表面)连续变化的数据。这是将连续数据存储为表面的有效方法。它们还能以固定间距来表示表面。从地球表面测得的海拔高度值是表面地图的最常见应用,但也可将其他值(例如降雨量、温度、密度和人口密度等)定义为可进行空间分析的表面。下方的 Raster
便显示了海拔高度,其中使用绿色显示较低的海拔高度,红色、粉红色和白色像元则表示较高的海拔高度。
1.2.3 将 Raster 用作 Thematic 地图
表示 Thematic
数 据的 Raster
可通过分析其他数据获得。一个常见的分析应用是按照土地覆盖类别来对卫星影像的内容进行分类。基本上,此活动可将多光谱数据划分到各个类(例如植被类型)中并指定类别值。通过将矢量、Raster
和 terrain
数据等不同来源的各种数据进行组合也可得到 Thematic
地图。例如,要为特定的活动创建一个适宜的 Raster
数据集,则可通过使用地理处理模型来处理数据的方式实现。下方的示例是显示土地利用的分类 Raster
数据集。
1.2.4 将 Raster 用作要素的属性
用作要素属性的 Raster
可以是与地理对象或位置相关的数字照片、扫描的文档或扫描的绘图。宗地图层可能具有识别宗地最新事务的扫描法律文档;表示洞穴开口的图层可能具有与点要素关联的实际洞穴开口的图片。下方是一棵大型古树的数字图片,可用作城市地表图层的属性。
2 OptimizeRasters
2.1 概述
2.1.1 OptimizeRasters 是什么?
使用 OptimizeRasters 来完成以下三个任务:
Optimization
通过文件转换和压缩,将Rasters
从各种文件格式转换为优化格式进行优化:MRF
、tiled TIFF
或 云优化GeoTIFF
。- 向云存储(包括
Amazon S3
、Microsoft Azure
和 谷歌云存储)或企业存储传输数据。 - 创建
Raster
代理(小文件被存储在本地文件系统上的,这些文件引用存储在云存储中的大文件),从而简化数据管理。
使用 OptimizeRasters 管理光栅集合的好处包括:
- 精简的数据管理
- 更快的读取性能
- 简化进出云存储的传输
- 最小化存储需求
这个 OptimizeRasters 包包含以下地质处理工具:
OptimizeRasters
工具:转换 Raster
到优化的输出格式,传输数据进出云存储,并创建 Raster
代理
配置文件编辑器工具:为 Amazon S3
和 Microsoft Azure
维护云存储配置文件
恢复作业工具:跟踪不完整的作业并允许用户稍后恢复
2.1.2 系统要求是什么?
-
Python 2.7+
或Python 3.0+
(分别安装ArcMap 10.4+
和ArcGIS Pro 1.4+
) -
OptimizeRasters
地质处理工具箱需要ArcMap 10.4.1+
或ArcGIS Pro 1.3+
-
Windows
或Linux
-
即使没有安装
ArcGIS
,OptimizeRasters
也可以从命令行运行 -
OptimizeRasters
可以与Lambda
服务一起使用(用于小于500MB
的Raster
)
2.2 介绍
OptimizeRasters
是一种高效、可配置、健壮的工具,用于将 Raster
数据转换为优化的文件格式、将数据移动到云存储以及创建光栅代理。
2.2.1 将 Raster 数据转换为优化格式
OptimizeRasters
将各种未优化的 Raster
格式转换为优化的 MRF
、tiled TIFF
或 云优化的 GeoTIFF
(COG
)格式。其结果是更有效、可伸缩和弹性的数据访问,同时降低了存储成本。
有关这些文件格式之间的差异的更多信息,请参见附录E。
文件可以转换为 tiled TIFF
,云优化的地理 TIFF
,或 MRF
格式:
- Tiled TIFF
- 来自数据提供商的
TIFF raster
产品通常不在内部tiled
Tiling
可以最小化磁盘访问请求的数量,从而获得像素的子集- 可选的
JPEG
或LZW
压缩可以减少文件大小- 可选的
pyramids
可以在较小的规模上提高访问效率
- Cloud Optimized GeoTIFF
- 类似于
Tiled TIFF
,但pyramids
是必需的,文件组织是为HTTP range 请求
优化- 可以提供一个轻微的性能改进的应用程序,只在小规模或需要抓取元数据来查看图像的场景
- 创建比
Tiled TIFF
需要更长的时间- 在
ArcGIS
中,性能改进与Tiled TIFF
相比微不足道
- MRF
MRF
是由NASA
开发的一种基于磁贴的格式,专门用于更有效地存储和访问Raster
- 可选的有限错误率压缩(
LERC
)节省额外的存储空间,同时加快数据访问,压缩和解压速度更快
将文件转换为 tiled TIFF
、云优化的 GeoTIFF
或 MRF
(包括可选压缩)可以通过以下三种方式提高读取性能:
- 改进数据结构,提高数据访问和传输(特别是从云存储)效率
- 生成
pyramids
,在较小的范围内提供更快的数据访问 - 执行可选的
JPEG
、LERC
或LZW/Deflate
压缩,进一步减少存储和传输的数据量
注意:这三种格式都可以从云存储中读取,但是读取性能取决于为访问数据而发出的最少请求。
2.2.2 移动数据到云存储
作为数据转换过程的一部分,OptimizeRasters
可以同时将 Raster
数据传输到云(或企业)存储和从云(或企业)存储,从而加快将 Raster
数据传输到云的过程。
OptimizeRasters
支持 Amazon S3
、Microsoft Azure
和 谷歌云存储服务。
有关 Amazon S3
、Microsoft Azure
和 谷歌云存储的更多信息,请参见使用带有云存储的 OptimizeRasters
。
2.3 Linux/Unix 安装
2.3.1 GDAL 安装
源码下载:
下载地址 http://download.osgeo.org/gdal/CURRENT/,选择当前版本的 tar.gz
或 zip
源码,本例中选择 gdal-2.3.2
版本。
wget http://download.osgeo.org/gdal/CURRENT/gdal-2.3.2.tar.gz
tar -xzvf gdal-2.3.2.tar.gz
编译源码:
默认安装在 /usr/local/lib
中。
cd gdal-2.3.2
./configure
make
安装:
整个编译和安装的过程会有点长,请耐心等待。
make install
配置环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
可以将该配置写在 ~/.bashrc
中,并执行 source ~/.bashr
直接 apply
修改。
2.3.2 下载 OptimizeRasters
下载 OptimizeRasters ZIP
文件。为此,导航到 OptimizeRasters GitHub repo,然后选择 Clone
或 Download
-> Download ZIP
。
解压 OptimizeRasters-master
。压缩文件,并做以下操作:
- 删除
OptimizeRasters
的GDAL/bin
文件夹中的所有文件 - 将您安装好的
Linux GDAL
二进制文件和共享库复制到GDAL/bin
文件夹中
注意:
如果您已经在
Linux
机器上安装了GDAL
,那么只在GDAL/bin
文件夹中包含以下二进制文件即可
gdalinfo
、gdaladdo
、gdalbuildvrt
、gdal_translate
、gdalinfo
。
2.3.3 验证
此时,您可以打开一个终端并输入 python OptimizeRasters.py
,如下输出则安装成功。
[root@tensorflow OptimizeRasters]# python OptimizeRasters.py
OptimizeRasters.py v2.0.4a/20181111
Convert raster formats to a valid output format through GDAL_Translate.
Please Note:
OptimizeRasters.py is entirely case-sensitive, extensions/paths in the config file are case-sensitive and the program will fail if t
he correct path/case is not entered at the cmd-line or in the config file.
Invalid log-path (c:\image_mgmt_workflows\optimizeraster\logs). Resetting to (/root/ESRI/OptimizeRasters/logs)
Log-path set to (/root/ESRI/OptimizeRasters/logs)
log-msg:version=v2.0.4a/20181111
log-msg:-config="/root/ESRI/OptimizeRasters/OptimizeRasters.xml"
log-msg:ExcludeFilter=[u'tmp', u'ovr', u'rrd', u'idx', u'lrc', u'mrf_cache', u'pjp', u'ppng', u'pft', u'pzp']
log-msg:Compression=lerc
log-msg:Out_S3_Upload=F
log-msg:KeepExtension=True
log-msg:In_S3_Bucket=In_BucketName
log-msg:PyramidFactor=2 4 8 16 32 64
log-msg:Threads=2
log-msg:RasterFormatFilter=[u'tif', u'TIF', u'mrf']
log-msg:Out_S3_Secret=Out_S3_secret_key
log-msg:In_S3_Secret=In_S3_Secret
log-msg:In_S3_ParentFolder=sampletest/02042014
log-msg:BlockSize=512
log-msg:In_S3_ID=In_S3_ID
log-msg:Mode=mrf
log-msg:Out_S3_Bucket=Out_BucketName
log-msg:IncludeSubdirectories=True
log-msg:Out_S3_ParentFolder=Out_S3Parent_folder
log-msg:BuildPyramids=true
log-msg:Out_S3_ID=Out_S3_ID
log-msg:Out_S3_DeleteAfterUpload=True
log-msg:LogPath=c:\Image_Mgmt_Workflows\OptimizeRaster\Logs
log-msg:PyramidCompression=JPEG
log-msg:Quality=85
log-critical:-input/-output is not specified!
log-status:[Failed!]
Time taken> 0.003252s
Done..
[root@tensorflow OptimizeRasters]#
2.4 测试
2.4.1 构造测试目录
input
作为输入目录,放入文件 test.jpg
测试文件。
[root@tensorflow ~]# tree OptimizeRasters-Test/
OptimizeRasters-Test/
├── input
│ └── test.jpg
└── output
2 directories, 1 file
[root@tensorflow ~]#
2.4.2 创建测试脚本
直接在 OptimizeRasters.py
所在目录创建,方便 import
。文件格式转换的配置使用默认提供的 OptimizeRasters/Templates/Imagery_to_TIF_JPEG.xml
。
import OptimizeRasters
def messages(msg, status):
print ('**{} - {}'.format(msg, status))
return True
args = {
'input': r'/root/OptimizeRasters-Test/input',
'output': r'/root/OptimizeRasters-Test/output',
'subs': 'true',
'config': '/root/ESRI/OptimizeRasters/Templates/Imagery_to_TIF_JPEG.xml'
}
app = OptimizeRasters.Application(args)
app.registerMessageCallback(messages)
app.init()
app.run()
rpt = app.getReport()
isSuccess = False
if (rpt and not rpt.hasFailures()):
isSuccess = True
print ('Results> {}'.format(str(isSuccess)))
2.4.3 执行测试脚本
最后一行打印 Results> True
表示执行成功。
[root@tensorflow OptimizeRasters]# python test.py
**OptimizeRasters.py v2.0.4a/20181111 - 0
**Convert raster formats to a valid output format through GDAL_Translate.
Please Note:
OptimizeRasters.py is entirely case-sensitive, extensions/paths in the config file are case-sensitive and the program will fail if t
he correct path/case is not entered at the cmd-line or in the config file. - 0
Log-path set to (/root/ESRI/OptimizeRasters/logs)
log-msg:version=v2.0.4a/20181111
log-msg:-input=/root/OptimizeRasters-Test/input -resume=True -config=/root/ESRI/OptimizeRasters/Templates/Imagery_to_TIF_JPEG.xml -s
ubs=true -output=/root/OptimizeRasters-Test/outputlog-msg:ExcludeFilter=[u'tmp', u'rrd', u'idx', u'lrc', u'mrf_cache', u'pjp', u'ppng', u'pft', u'pzp', u'ovr', u'aux.xml', u'aux', u'
tfw', u'TFW', u'pjg']log-msg:BuildPyramids=true
log-msg:Compression=JPEG
log-msg:KeepExtension=false
log-msg:BlockSize=512
log-msg:Out_S3_DeleteAfterUpload=true
log-msg:PyramidCompression=JPEG
log-msg:Interleave=Pixel
log-msg:CloudUpload=false
log-msg:PyramidSampling=average
log-msg:Mode=tif
log-msg:RasterFormatFilter=[u'tif', u'tiff', u'TIF', u'TIFF', u'jpg', u'JPG', u'img', u'IMG', u'sid', u'SID']
log-msg:Threads=4
log-msg:Quality=90
log-msg:IncludeSubdirectories=true
**Copying non rasters/aux files (/root/OptimizeRasters-Test/input/=>/root/OptimizeRasters-Test/output/).. - None
**Done. - None
**Converting.. - 0
**[Resume] Creating job (/root/ESRI/OptimizeRasters/OR_20181218T023124737116.orjob) - 0
**Copying non rasters/aux files (/root/OptimizeRasters-Test/input/=>/root/OptimizeRasters-Test/output/).. - None
**Done. - None
**Converting.. - 0
**Using GDALInfo (/root/OptimizeRasters-Test/input/test.jpg).. - 0
**Applying compression (/root/OptimizeRasters-Test/input/test.jpg) - 0
**messages: - 0
**Input file size is 5025, 2535 - 0
**0...10...20...30...40...50...60...70...80...90...100 - done. - 0
**Status: (OK). - 0
**Creating pyramid ("/root/OptimizeRasters-Test/output/test.tif") - 0
**Using GDALInfo ("/root/OptimizeRasters-Test/output/test.tif").. - 0
**<PyramidFactor> set to (2 4 8 16) - 0
**messages: - 0
**0...10...20...30...40...50...60...70...80...90...100 - done. - 0
**Status: (OK). - 0
**[MV] /root/ESRI/OptimizeRasters/logs/OR_20181218T023124737116.orjob - 0
**Done..
- 0
**[OK] - 3
Results> True
[root@tensorflow OptimizeRasters]#
2.4.4 查看输出
可以看到 output
目录中已经输出了 test.tif
文件,测试成功。
[root@tensorflow ~]# tree OptimizeRasters-Test/
OptimizeRasters-Test/
├── input
│ └── test.jpg
└── output
└── test.tif
2 directories, 2 files
[root@tensorflow ~]#