arcpy基础篇(5)-使用栅格数据
创始人
2025-05-31 10:43:05
0

栅格数据是一个独特的空间数据类型。ArcPy中有一个名为arcpy.sa的空间分析模块,该模块将地图代数全部整合到Python环境中,从而提高了脚本运行效率

1.列出栅格要素

ListRaster函数是以Python列表的形式返回工作空间中的栅格要素,该函数语法如下:

ListRasters({wild_crad},  {raster_type})

可选参数wild_crad通过名称限制返回的结果。参数raster_type通过栅格数据的类型显示返回的结果。
例如:

import arcpy
from arcpy import env
env.workspace = "C:/rasters"
rasterlist = arcpy.ListRasters()
for raster in rasterList:print raster

ListRasters函数可以根据参数过滤一部分数据。下面的代码就只输出了ERDAS IMAGINE格式的文件名称。

import arcpy
from arcpy import env
env.workspace = "C:/raster"
rasterlist = arcpy.ListRasters("*", "IMG")
for raster in rasterlist:print raster

一旦获取到栅格数据,就可以将相关函数应用于这些栅格数据。

2.描述栅格数据

Describe函数将返回指定数据元素的各种属性。针对不同的栅格元素,还会有一些具有针对性的属性。
三种不同类型的栅格元素如下:
(1)栅格数据集–一种栅格数据模型,可以存储在磁盘或者地理数据库中。又多种存储格式,包括TIFF、JPEG、IMAGINE、Ersi GRID和MrSID。可以是单波段,也可是多波段组成。
(2)栅格波段–栅格数据集中的一个图层,代表电磁光普某个范围内或波段内的值。
(3)栅格目录–以表格形式定义的栅格数据集的集合,目录中的每条记录表示一个栅格数据集。通常用于显示相邻、完全重叠的栅格数据集。

2.1栅格数据集

上述3中栅格元素具有不同的属性。例如,数据格式(TIFF,JPRG等)是栅格数据集的属性,栅格单元的大小是栅格波段的属性。可以通过dataType属性来确定栅格元素的类型。

import arcpy
from arcpy import env
env.workspace = "C:/raster"
raster = "landcover.tif"
desc = arcpy.Describe(raster)
print desc.dataType

上面的例子使用了TIFF格式的栅格数据。dataType属性的返回值为RasterDataset。栅格数据集的属性包含了一下内容:
在这里插入图片描述

2.2栅格波段

大多数与栅格相关属性只能通过栅格波段获取。例如分辨率。需要属性都是栅格波段所特有的,包括以下内容:
在这里插入图片描述
对于单波段的栅格数据集,并不需要指定波段(毕竟它只有一个波段)。因此,在描述栅格数据集时可以直接访问其属性。

import arcpy
from arcpy import envenv.workspace = "C:/Data"
rasterband = "landcover.tif"
desc = arcpy.Describe(raster)
print desc.meanCellHeight
print desc.meanCellWidth
print desc.pixelType

度量单位的类型并不包含在这些属性中,它是Spatial Reference的属性。例如下面的代码获取了一个空间参考的名称及度量单位:

spatialref = desc.spatialReference
print spatialref.name
print spatialref.linearUnitName
>>> WGS_1984_UTM_zone_50N
>>> Meter

对于多波段栅格数据来说,需要指定特定的波段,可以类似于Bnad_1、Band_2,之后才能访问栅格分辨率等属性。

import arcpy
from arcpy import envenv.workspace = "C:/raster"
rasterband = "img.tif/Band_1"
desc = arcpy.Describe(rasterband)
print desc.meanCellHeight
print desc.meanCellWidth
print desc.PixelType

注释:多波段栅格数据的某一波段有时用Layer_1表示,而不用Band_1。

3.处理栅格对象

3.1.创建栅格数据

在ArcPy中,有两种方式创建栅格对象:
(1)直接引用磁盘上已有的栅格数据

import arcpy
myraster = arcpy.Raster("C:/raster/elevation")

(2)使用地图代数语句创建栅格对象。
import arcpy
outraster = arcpy.sa.Slope(“C:/raster/evelation”)
通过这两种方式得到的栅格对象既可用于Python语句中,也可以用于地图代数的表达式中。

3.2save方法

栅格对象只有一个方法:save方法。由地图代数语句返回的栅格对象默认为临时数据,这意味着他们将在使用后被删除,save方法可以使用使栅格对象永久的保存在磁盘中,其语法如下:

save({name})

在先前的例子中,栅格对象是临时的,但是可以使用下面的代码使之变成永久的数据:

import arcpy
outrater = arcpy.sa.Slope("C:/raster/elevation")
outraster.save("C:/raster/slope")

4.Spatial Analyst模块

ArcPy中的Spatial Analyst模块arcpy.sa可以执行地图代数和其他相关操作。Spatial Analyst模块为所有的栅格处理工具提供了访问接口。通过这种方式比使用Spatial Analyst工具箱更高效。下面的代码调用Slope工具:

import arcpy
elevraster = arcpy.Raster("C:/raster/elevation")
outraster = arcpy.sa.Slope(elevraster)

5.地图代数

arcpy.sa模块处理可以访问Spatial Analyst工具接口,还提供了一系列用于执行地图代数的运算符。下面的代码使用Times工具将高程值从英尺转换成米:

import arcpy
from arcpy.sa import *
elevraster = arcpy.Raster("C:/raster/elevation")
outraster = Times(elevraster, "0.3048")
outraster.save("C:/raster/elev_m")

使用地图代数运算符可以代替Times工具。将倒数第二行代码改为:
outraster = elevraster * 0.3048"

当某些地图代数操作符不能直接用在Python表达式中,可以使用Raster Calculator工具:

RasterCalculator(expression, output_raster)

arcpy.sa模块中可用的地图代数操作符,可以分为四类:算数、按位、布尔、关系.
在这里插入图片描述
在这里插入图片描述

6.ApplyEnvironment函数

Spatial Analyst工具处理地理处理外,还有一个ApplyEnvironment函数。语法如下:

ApplyEnvironment(in_raster)

这个函数可以改变输入数据的范围、分辨率,或者为数据添加分析掩膜。下面的代码使用ApplyEnvironment函数将输出数据分辨率改为30,并将一个已有的shapefile设置为分析掩膜。

import arcpy
from arcpy import env
from arcpy.sa import *elevfeet = arcpy.Raster("C:/raster/elevation")
elevmeter = elevfeet * 0.3048
env.cellsize = 30
env.mask = "C:/raster/studyarea.shp"
elevrasterclip = ApplyEnvironment(elevmeter)
elevrasterclip.save("C:/raster/dem30_m")

并非所有的环境设置参数都适用于ApplyEnvironment函数,而是是仅限于Cell Size、Current Workspace、Extent、Mask、Output Coordinate System、scratch Workspace和snap Raster。这些都是处理栅格数据最常用的环境参数。

7.arcpy.as模块中的类

arcpy.sa模块中也包含很多用于定义栅格工具参数的类。这些类以简洁的方式描述参数,避免了一些复杂的字符串。

7.1 remap类

Reclassification可以根据重分类表更改栅格中的值。

Reclassify(in_raster, reclass_field, remap, {missing_values})

remap是一个remap对象。根据重分类对象的性质,有两种不同的Remap类:
1.RemapValue–以单个输入值作为重分类项。
2.RemapRange–以输入值范围作为重分类项。

7.1.1RemapValue

语法:

remapValue(remapTable)

一个remapTable对象定义了一个Python列表。每个列表中包含了栅格数据的旧值和新值。在RemapValue对象中定义一个重分类的语法如下:
[[oldValue1, newValue1], [oldValue2, newValue2],…]
下面的代码以土地利用数据为例,说明了RemapValue对象的用法:

import arcpy
from arcpy import env
from arcpy.sa import *env.workspace = "C:/raster"
myremap = remapValue(["Barren", 1], ["Mixed Forest", 4], ["Coniferous Fores", 0], ["Cropland", 2], ["Grassland", 3], ["water", 0])
outreclass = Reclassify("landuse", "S-VALUE", myremap)
outreclass.save("C:/raster/lu_recl")

7.1.2 RemapRange

RemapRange对象使用方法类似于RemapValue的使用方法。但是RemapRange处理的对象是数值范围,在RemapRange对象中定义一个重分类表的语法如下:

[[startValue, endValue, newValue], ...]

下面的代码以高程数据为例,说明了RemapRange对象的用法:

import arcpy
from arcpy import env
from arcpy.sa import *env.workspace = ("C:/raster")
myremap = RemapRange([1, 1000, 0], [1000, 2000, 1], [2000, 3000,2], [3000, 4000, 4])
outreclass = reclassify("elevation", "TYPE", myremap)
outreclass.save("C:/raster/elev_recl")

除了Reclassify工具,在Weighted Overlay工具中也会用到重分类表。在arcpy.sa模块中还有许多其他的类,根据逻辑功能,可以将它们分布以下的几类:
在这里插入图片描述

2.Neighborhood类

除了Ramap类以外,Neighborhood类也被广泛使用。Neighborhood类定义了不同的形状和区域。比如Focal Statistics工具以及Neighborhood工具箱中其他的工具,都需要指定一个具体的领域。
由于存在不同类型的邻域,所以在邻域函数中需要定义一个邻域对象来设置邻域参数。例如Focal Statisticas工具的语法如下:

FocalStatisticas(in_raster, {neighbordhood}, {statistics_type}, {ignore_nodata})

有六种类型的邻域对象,每种类型对应一种参数。
在这里插入图片描述
例如NbrRectangle对象的语法如下:

NbrRectangle({width}, {height}, {units})

下面的代码定义了一个邻域对象,并将它作为FocalStatisticas函数的参数:

import arcpy
from arcpy import env
from arcpy.sa import *env.workspace = "C:/raster"
mynbr = NbrRectangle(5, 5, "CELL")
outraster = FocalStatistics("landuse", mynbr, "VARIETY")
outraster.save("C:/raster/lu_var")

运行代码,将使用5*5邻域对土地覆盖类型进行统计。

8.Numpy数组

NumPyArrayToRaster和RasterToNumPyArray是常规的ArcPy函数,并不是arcpy.sa模块里的函数。这两个函数可以在栅格数据和NumPy数组之间实现转换。
数据转化的代码如下:

import arcpy, scipy
from arcpy.sa import *inRaster = arcpy.Raster("C:/raster/myraster")
my_array = RasterToNumPyArray(inRaster)
outarray = scipy..(inRaster)
outRaster = NumPyArrayToRaster(outarray)
outraster.save("C:/raster/result")

相关内容

热门资讯

王凤英入职小鹏3年终获股权,此... 5月7日消息,小鹏汽车披露的监管及年报信息显示,公司总裁王凤英已正式进入股东名册,入职小鹏3年后股权...
五块钱红酒卖断货,便宜红酒为何... 最近一段时间,中国的酒类消费市场可以说是显得格外奇怪,一方面,各种高端酒特别是白酒的消费量出现了明显...
财联社C50风向指数调查:4月... 财联社5月8日讯(记者 夏淑媛)新一期财联社“C50风向指数”结果显示,市场机构对4月新增人民币贷款...
央视硬刚国际足联拒掏20亿,背... 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 央视这次太刚了,离世界杯开幕还有1个月,死活...
新CEO上任直接放大招!Air... 快科技5月8日消息,苹果即将上任的CEO John Ternus对未来一系列新产品充满信心,称这些设...
“特朗普拟邀英伟达、波音等CE... 据路透社当地时间5月7日报道,特朗普政府正邀请英伟达、苹果、埃克森美孚、波音等大公司首席执行官,于下...
世界杯,还能看到直播吗? 2026年美加墨世界杯距离开幕,仅剩一个多月时间。多方信息显示,中央广播电视总台(以下简称“央视”)...
机构警告AI芯片热潮风险,超威... 5月7日,据央视财经,隔夜超威半导体公司(AMD)股价飙升近19%,带动AI芯片热潮持续升温。AMD...
银行员工转走储户1800万最新... 银行员工转走储户1800万最新进展:2名储户已收到银行全部款项
原创 中... 1994年,安徽省的经济格局曾发生过一次戏剧性的转折。在那一年,一座名为安庆的城市,其国内生产总值(...
昆都仑区:政策“蓄力”消费焕新 “一台5000多元的空调,叠加‘国补’和商场的以旧换新活动,能优惠1000元左右,旧机还能免费上门拆...
乐悦置业竞得佛山顺德乐从镇一商... 观点网讯:5月6日,佛山市顺德区乐从镇一商业地块成功出让,由广东省乐悦置业有限公司竞得,乐从南区·邻...
原创 亦... 《爱情没有神话》这部剧,一开始的命运颇为多舛,经历了几次撤档的波折后,终于在观众面前亮相,但其首播的...
美联储34年最大分歧叠加油价飙... 美联储按预期维持利率不变,但内部出现34年来最严重分歧,叠加布油创2022年6月以来新高,美债遭抛售...
支付宝消费券回收后,资金是否支... 摘要: 支付宝消费券回收变现后,资金能否直接转入信用卡?本文解答到账方式的相关规则,帮助用户了解资金...
中医介绍5个化痰穴位!收藏这篇... 很多人忽略了“痰”的危害,觉得咳几下就没事,殊不知,肺里的痰长期堆积,只会一步步加重身体负担。 中医...
黄金平台“杰我睿”涉嫌经济犯罪... 红星资本局5月7日消息,深圳水贝知名金店“杰我睿”兑付困难事件有了新进展。日前,深圳市公安局罗湖分局...
多地出台购房新政促楼市升温 记... 今年的“五一”假期,伴随着多个城市楼市新政密集落地,在叠加市场信心持续修复的作用下,房地产市场热度持...
谁是五一“吸金王”?这5座城市... 来源:市场资讯 (来源:21城市观) 哪座城市成为“五一”假期的大赢家? 图源:摄图网 作者|赵晓...
“低招低裁”格局稳固劳动力市场... 智通财经APP获悉,美国上周初请失业金人数在经历前一周回落至近几十年来最低水平后出现小幅反弹,表明尽...