GIS 中 Raster 数据的处理

1 Raster 简介

Raster 一般翻译成 栅格(或 网格)。

1.1 什么是 Raster 数据?

​ 最简形式的 Raster 由按行和列(或格网)组织的像元(或像素)矩阵组成,其中的每个像元都包含一个信息值(例如温度)。Raster 可以是数字航空像片、卫星影像、数字图片或甚至扫描的地图。

Raster中的像元

Raster 格式存储的数据可以表示各种实际现象:

  • Thematic (专题)数据(也称为 discrete)表示土地利用或土壤数据等要素
  • Continuous (连续)数据表示温度、海拔高度或光谱数据(例如,卫星影像或航空像片)等现象
  • 图片则包括扫描的地图或绘图,以及建筑物照片

ThematicContinuous 可能会作为数据图层与地图中的其他地理数据一起显示,但也常在空间分析时作为源数据使用。

  • 图层

​ 可以通过图层使用地理数据。 图层,也称作 Web 图层,是用于创建地图和场景的地理数据的逻辑集合;图层也是地理分析的基础。例如,建筑物图层表示校园建筑物的集合并且包含描述每个建筑物属性的属性,例如建筑物的名称、建筑物的类型和建筑物的大小以及一些其他可能的属性。其他的图层示例包括地震震中、历史交通模式、地形、3D 建筑和宗地。

  • 数据源

​ 可在地图中显示的数据的基本类型是要素和影像。不同类型的图层拥有不同的功能。例如,在 CSV 文件中发布数据会创建要素图层。要素图层可使您在客户端应用程序内查询和编辑要素,并管理对实际数据的访问权限。图层中使用的数据可能来自多种数据源。一些数据源是各 GIS 厂商的原生数据源,而其他数据源是基于文件的数据源(如 CSVXLS 文件)或开放标准数据源(如 KMLOGC)。

​ 图片 Raster 通常用作表格中的属性,它们可同地理数据一同显示,并可传达有关地图要素的附加信息。示例见下一小节。

1.2 Raster 数据的应用

尽管 Raster 数据的结构很简单,但它在各种应用中都极为重要。在 GIS 中,Raster 数据的使用主要分为四个类别

1.2.1 将 Raster 用作底图

​ 在 GIS 中,Raster 数据通常用来作为其他要素图层的背景显示画面。例如,在其他图层下显示正射影像,这不仅可提供附加的信息,而且还可使地图用户更加确信地图图层在空间上已经对齐并代表着实际的对象。Raster 底图共有三种主要来源,分别为正射航空摄影、正射卫星影像和正射的扫描地图。下面是一个用作道路数据底图的 Raster

用作底层的Raster

1.2.2 将 Raster 用作表面地图

Raster 非常适合表示那些沿地表(表面)连续变化的数据。这是将连续数据存储为表面的有效方法。它们还能以固定间距来表示表面。从地球表面测得的海拔高度值是表面地图的最常见应用,但也可将其他值(例如降雨量、温度、密度和人口密度等)定义为可进行空间分析的表面。下方的 Raster 便显示了海拔高度,其中使用绿色显示较低的海拔高度,红色、粉红色和白色像元则表示较高的海拔高度。

显示海拔高度的地形分析实例

1.2.3 将 Raster 用作 Thematic 地图

​ 表示 Thematic 数 据的 Raster 可通过分析其他数据获得。一个常见的分析应用是按照土地覆盖类别来对卫星影像的内容进行分类。基本上,此活动可将多光谱数据划分到各个类(例如植被类型)中并指定类别值。通过将矢量、Rasterterrain 数据等不同来源的各种数据进行组合也可得到 Thematic 地图。例如,要为特定的活动创建一个适宜的 Raster 数据集,则可通过使用地理处理模型来处理数据的方式实现。下方的示例是显示土地利用的分类 Raster 数据集。

Raster 用作 Thematic 示例

1.2.4 将 Raster 用作要素的属性

​ 用作要素属性的 Raster 可以是与地理对象或位置相关的数字照片、扫描的文档或扫描的绘图。宗地图层可能具有识别宗地最新事务的扫描法律文档;表示洞穴开口的图层可能具有与点要素关联的实际洞穴开口的图片。下方是一棵大型古树的数字图片,可用作城市地表图层的属性。

树图片

2 OptimizeRasters

2.1 概述

2.1.1 OptimizeRasters 是什么?

使用 OptimizeRasters 来完成以下三个任务:

  1. Optimization 通过文件转换和压缩,将 Rasters 从各种文件格式转换为优化格式进行优化:MRFtiled TIFF 或 云优化 GeoTIFF
  2. 向云存储(包括 Amazon S3Microsoft Azure 和 谷歌云存储)或企业存储传输数据。
  3. 创建 Raster 代理(小文件被存储在本地文件系统上的,这些文件引用存储在云存储中的大文件),从而简化数据管理。

使用 OptimizeRasters 管理光栅集合的好处包括:

  • 精简的数据管理
  • 更快的读取性能
  • 简化进出云存储的传输
  • 最小化存储需求

这个 OptimizeRasters 包包含以下地质处理工具:

OptimizeRasters 工具:转换 Raster 到优化的输出格式,传输数据进出云存储,并创建 Raster 代理

​ 配置文件编辑器工具:为 Amazon S3Microsoft 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+

  • WindowsLinux

  • 即使没有安装 ArcGISOptimizeRasters 也可以从命令行运行

  • OptimizeRasters 可以与 Lambda 服务一起使用(用于小于 500MBRaster

2.2 介绍

OptimizeRasters是一种高效、可配置、健壮的工具,用于将 Raster 数据转换为优化的文件格式、将数据移动到云存储以及创建光栅代理。

2.2.1 将 Raster 数据转换为优化格式

OptimizeRasters 将各种未优化的 Raster 格式转换为优化的 MRFtiled TIFF 或 云优化的 GeoTIFFCOG)格式。其结果是更有效、可伸缩和弹性的数据访问,同时降低了存储成本。

有关这些文件格式之间的差异的更多信息,请参见附录E。

文件可以转换为 tiled TIFF,云优化的地理 TIFF,或 MRF 格式:

  • Tiled TIFF
  1. 来自数据提供商的 TIFF raster 产品通常不在内部 tiled
  2. Tiling 可以最小化磁盘访问请求的数量,从而获得像素的子集
  3. 可选的 JPEGLZW 压缩可以减少文件大小
  4. 可选的 pyramids 可以在较小的规模上提高访问效率
  • Cloud Optimized GeoTIFF
  1. 类似于 Tiled TIFF,但 pyramids 是必需的,文件组织是为 HTTP range 请求 优化
  2. 可以提供一个轻微的性能改进的应用程序,只在小规模或需要抓取元数据来查看图像的场景
  3. 创建比 Tiled TIFF 需要更长的时间
  4. ArcGIS 中,性能改进与 Tiled TIFF 相比微不足道
  • MRF
  1. MRF 是由 NASA 开发的一种基于磁贴的格式,专门用于更有效地存储和访问 Raster
  2. 可选的有限错误率压缩(LERC)节省额外的存储空间,同时加快数据访问,压缩和解压速度更快

将文件转换为 tiled TIFF、云优化的 GeoTIFFMRF (包括可选压缩)可以通过以下三种方式提高读取性能:

  • 改进数据结构,提高数据访问和传输(特别是从云存储)效率
  • 生成 pyramids,在较小的范围内提供更快的数据访问
  • 执行可选的 JPEGLERCLZW/Deflate 压缩,进一步减少存储和传输的数据量

注意:这三种格式都可以从云存储中读取,但是读取性能取决于为访问数据而发出的最少请求。

2.2.2 移动数据到云存储

​ 作为数据转换过程的一部分,OptimizeRasters 可以同时将 Raster 数据传输到云(或企业)存储和从云(或企业)存储,从而加快将 Raster 数据传输到云的过程。

OptimizeRasters 支持 Amazon S3Microsoft Azure 和 谷歌云存储服务。

​ 有关 Amazon S3Microsoft Azure 和 谷歌云存储的更多信息,请参见使用带有云存储的 OptimizeRasters

2.3 Linux/Unix 安装

2.3.1 GDAL 安装

源码下载

​ 下载地址 http://download.osgeo.org/gdal/CURRENT/,选择当前版本的 tar.gzzip 源码,本例中选择 gdal-2.3.2 版本。

1545114291573

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,然后选择 CloneDownload -> Download ZIP

​ 解压 OptimizeRasters-master。压缩文件,并做以下操作:

  1. 删除 OptimizeRastersGDAL/bin 文件夹中的所有文件
  2. 将您安装好的 Linux GDAL 二进制文件和共享库复制到 GDAL/bin 文件夹中

注意:

如果您已经在 Linux 机器上安装了 GDAL,那么只在 GDAL/bin 文件夹中包含以下二进制文件即可

gdalinfogdaladdogdalbuildvrtgdal_translategdalinfo

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 ~]# 
posted @ 2018-12-19 10:29  zhance  阅读(1810)  评论(0编辑  收藏  举报