『公告』 预祝您龙年大吉,万事如意, 过节期间, 大家如需数据服务,请拨打400 或直接添加客服微信,再祝大家龙年,心想事成。
关注我们 新浪 腾讯

基于arcpy的常规栅格数据读写——以tif影像为例

基于arcpy的常规栅格数据读写——以tif影像为例

栅格(Raster)数据是最常见的数据图像的存储方式,对栅格影像的像元值进行读写、计算是栅格影像数据处理的基本方式,比如,归一化差异植被指数(NDVI)就是利用近红外(NIR)和红色(R)波段对应像元值的差与和的比值来进行计算的。为了能够处理栅格影像数据,我们首先需要将栅格数据读取到电脑的内存(Memory),待处理完后,我们又需要将内存中的数据写入到磁盘(Disk)。本文,小编将和大家一起学习在ArcPy的基础上,如何编写Python脚本来实现栅格影像的读写,本文中会以最常用的tif格式的栅格为例,其它栅格数据的读写方法与此类似。

       现有Landsat5 第一波段(band01)的TM影像,要求编写Python脚本读取该影像,然后创建一个行列数(图像大小)、空间分辨率、空间参考信息均与所读取影像相同的tif格式的“国际棋盘”影像。(即看起来和下图所示相同的影像,但不同之处是,我们要创建的是具有空间投影、空间分辨率,行列数远大于该图的影像。)


       如上图,对于栅格影像数据读写问题,首先,在“ArcGIS 10.2 for Desktop Help ”文档中的“目录“选项卡下,定位到”Desktop“—>”Geoprocessing“—>“ArcPy”—>“ArcPy classes”—>“General”—>目录下,我们可以找到一个名为“Raster”的工具,点击打开可以看到如下表所示的“Raster”函数说明:


       实现本文读写栅格影像数据集的Python脚本代码如下图所示:


  • 代码注释:

(1)第8行代码,设置ArcMap新的输出结果能够覆盖之前的输出,这是因为,第42行的save函数,已经将文件写到了磁盘上,如果不设置,则第45行代码再次读取save所输出的数据并以保存时,会提示错误!

(2)第12行代码,这里完成了根据文件路劲读取栅格影像;

(3)第13行代码,这里创建了一个Python字典,字典内容,则是利用了第12行所读取的栅格数据的,即Raster对象的属性来获取;

(4)第34—36行代码,首先利用numpy创建了与所读取的栅格数据相同大小的全为0的数组,然后,通过赋值,创造了一个二值数组,即所创建的数组,就255和0两个值,这是实现国际象棋棋盘效果的关键。

(5)第37行,使用NumPyArrayToRaster函数,根据之前所读取的栅格数据的信息将上述创建的数组转换为Raster对象,以备下文写出save之用(关于如何实现Raster与Numpy之间的转换,请参考本公众号,“GIS数据处理”模块下的文章——“1.1.2 栅格数据计算——栅格数据与numpy的转换”);

(6)第42行,这则是将内存中创建的国际象棋的棋盘栅格数据集写入到本地磁盘;

(7)第45行,根据第44行创建的空间参考信息——PCS信息,再次读取国际象棋的棋盘栅格数据,并为之定义空间信息。(关于如何定义空间参考信息,请参考本公众号,“GIS数据处理”模块下的文章——“1.2.1GCS、PCS的定义与转换”)


  • 结果展示

       如下图所示,执行完脚本后,ArcMap中将自动加载结果,一开始,可能颜色并不黑白色(这知识ArcMap的显示原因,数据处理上并没有问题),我们做一下更改即可:


       放大后的结果,如下图所示,有的地方两个黑色的正方形链接在一块了,这是因为,黑白相间的像元,在一定的行列号的限制下,达到一定数目后,就会周期性的重复。


      京ICP备2025132830号-1 京公网安备 号