[ArcPy] 1 ArcPy与栅格(Raster)

原文链接:https://www.yuque.com/higis/gisinpython/zhqgbm
GIS In Python系列文章:https://www.yuque.com/higis/gisinpython

Raster栅格对象

常用方法

打开栅格数据

Raster(inRaster) #数据类型:Raster

# 例子
r = Raster("c:/data/dem") # 绝对路径
r = Raster("19960909.img") #相对路径,当不是ArcGIS的栅格数据时,要加上后缀

保存栅格数据

rasterObj.save(path) #使用:Raster对象.save(路径字符串)

# 例子
r.save("c:/data/dem_1") # 绝对路径保存

列出工作目录下的所有栅格

arcpy.ListRasters({wild_card},{raster_type})

# 例子:列出工作空间中的Grid栅格名称
import arcpy
arcpy.env.workspace = "c:/data/DEMS"
rasters = arcpy.ListRasters("*","GRID")
for raster in rasters:
	print raster
参数说明数据类型
wild_card通配符可限制返回的结果,例如匹配前面有A的文件名(“A*”)String
raster_type栅格格式String

栅格转换为NumPy数组

使用例子:https://blog.csdn.net/summer_dew/article/details/78867410

转换成NumPy便于我们对像元进行操作,详细请点我

RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value})

RasterToNumPyArray支持将多波段栅格直接转换成多维数组(ndarray)

  1. 如果输入Raster实例基于多波段栅格,则会返回 ndarry,其中第一维的长度表示波段数。ndarray 将具有维度(波段、行、列)
  2. 如果输入Raster实例基于单个栅格或多波段栅格中的特定波段,则会返回含维度(行、列)的二维数组。

转换时隐含规则:

  1. 如果数组的定义(左下角以及行数和列数)超出 in_raster 的范围,则数组值将分配为 NoData
  2. 如果 lower_left_corner 与像元角不重合,则会自动捕捉到最近像元角的左下角,该捕捉方法采用的规则与“捕捉栅格”环境设置中的规则相同。RasterToNumPy 函数内的捕捉操作不会与“捕捉栅格”环境设置相混淆;该函数只使用相同的交互

属性

属性说明数据类型属性说明数据类型
bandCount波段数量IntegerpixelType像素类型(U32:Unsigned 32 bit integers)String
name数据名称StringspatialReference空间参考SpatialReference
path完整路径和名称StringcatalogPath全路径和名称的字符串String
compressionType压缩类型Stringformat数据格式String
extent栅格数据的范围ExtenthasRAT存在关联的属性表Boolean
height行数Integerwidth列数Integer
isInteger数据具有整数类型BooleanisTemporary数据是临时的Boolean
maximum最大值Doubleminimum最小值Double
mean平均值DoublestandardDeviation标准差Double
uncompressedSize磁盘大小DoublenoDataValue在数据中NoData的值Double

操作

【官方文档】

out_raster=in_raster1*in_raster2 #直接运算
out_raster = Slope("dem") #指定函数:参数为字符串,全路径或相对路径
out_raster = Con(in_raster >= 2, 1, 0) #栅格计算器中的函数
outStats = CellStatistics(["inraster1", "inraster2", "inraster3"], "MEAN", "DATA") #平均值

案例

名称说明
多个栅格文件相加创建一个相同范围,像元值都为0的栅格文件aoi_value_0,递归相加,保存

镶嵌(求多幅影像的平均值)

def mosaic(in_dir, out_fp):
    # input
    in_datas = []
    fns = os.listdir(in_dir)
    for fn in fns:
        if fn.endswith("tif"):
            fp = os.path.join(in_dir, fn)
            in_datas.append(fp)
            print "\t[data] {}".format(fp)

    if len(in_datas) == 0:
        print "\t[No data] {}".format(in_dir)
        return None
    else:
        print "\t[find data] {}".format(len(fns) )

    # copy out_data
    print "\t[new] create the out file"
    first_data = in_datas[0]
    out_raster = Raster(first_data)
    out_raster.save(out_fp)

    # Mosaic
    print "\t[doing]"
    arcpy.Mosaic_management(in_datas[1:], out_fp, "MEAN")
    print "\t[done]"

    return out_fp

求多幅影像的平均值(去除最大值、最小值)

def mosaic_nomaxmin(in_dir, out_fp):
    # input
    env.workspace = in_dir
    env.extent = "MAXOF"

    in_datas = []
    fns = os.listdir(in_dir)
    for fn in fns:
        if fn.endswith("tif"):
            in_datas.append(fn)
            print "\t[data] {}".format(fn)

    if len(in_datas) == 0:
        print "\t[No data] {}".format(in_dir)
        return None
    else:
        print "\t[find data] {}".format(len(fns))

    # max and min raster
    sum_raster = CellStatistics(in_datas, "SUM", "DATA")
    max_raster = CellStatistics(in_datas, "MAXIMUM", "DATA")
    min_raster = CellStatistics(in_datas, "MINIMUM", "DATA")

    # the number of Data
    cnt_raster = Con(IsNull(sum_raster), 0, 0)
    for data in in_datas:
        cnt_raster = Con( IsNull(data), cnt_raster, cnt_raster+1 )
    # cnt_raster.save(r"F:\out\cnt.tif")

    # compute
    print "\t[doing]"
    raster = (sum_raster - max_raster - min_raster) / ( cnt_raster - 2)
    raster.save(out_fp)
    print "\t[done]"

    return out_fp

求多幅影像的中值

def mosaic_median(in_dir, out_fp):
    # input
    env.workspace = in_dir
    env.extent = "MAXOF"

    in_datas = []
    fns = os.listdir(in_dir)
    for fn in fns:
        if fn.endswith("tif"):
            in_datas.append(fn)
            print "\t[data] {}".format(fn)

    if len(in_datas) == 0:
        print "\t[No data] {}".format(in_dir)
        return None
    else:
        print "\t[find data] {}".format(len(fn))

    # compute
    print "\t[doing]"
    raster = CellStatistics(in_datas, "MEDIAN", "DATA")
    raster.save(out_fp)
    print "\t[done]"

    return out_fp

错误集合

运行py文件出错

运行py文件出错,没有为脚本提供授权

错误:

Traceback (most recent call last):
  File "G:/workspace/python/arcpy/arcgis_running/file_add.py", line 6, in <module>
    out = Raster('19990101.img') + Raster('19990111.img')
  File "D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Functions.py", line 4143, in Plus
    in_raster_or_constant2)
  File "D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Utils.py", line 47, in swapper
    result = wrapper(*args, **kwargs)
  File "D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\sa\Functions.py", line 4140, in Wrapper
    ["Plus", in_raster_or_constant1, in_raster_or_constant2])
RuntimeError

这里写图片描述
这里写图片描述

解决:
添加授权:arcpy.CheckOutExtension("spatial")

import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.CheckOutExtension("spatial")
env.workspace = "E:/user/Desktop/date"
out = Raster('19990101.img') + Raster('19990111.img')

统计多个栅格的平均值 报错

【代码】

def mosaic_median(in_dir, out_fp):
    # input
    env.workspace = in_dir
    # env.extent = "MAXOF"

    in_datas = []
    fns = os.listdir(in_dir)
    for fn in fns:
        if fn.endswith("tif"):
            in_datas.append(fn)
            print "\t[data] {}".format(fn)

    if len(in_datas) == 0:
        print "\t[No data] {}".format(in_dir)
        return None
    else:
        print "\t[find data] {}".format(len(fn))

    # compute
    print "\t[doing]"
    raster = CellStatistics(in_datas, "MEDIAN", "DATA")
    raster.save(out_fp)
    print "\t[done]"

    return out_fp

【报错】

Traceback (most recent call last):
  File "D:/mycode/GISandPython/2Arcpy/ArcGISTools/2MOD04-L2/process.py", line 223, in <module>
    mosaic_all(ret, case)
  File "D:/mycode/GISandPython/2Arcpy/ArcGISTools/2MOD04-L2/process.py", line 216, in mosaic_all
    mosaic_median(month_dir, out_fp)
  File "D:/mycode/GISandPython/2Arcpy/ArcGISTools/2MOD04-L2/process.py", line 189, in mosaic_median
    raster = CellStatistics(in_datas, "MEDIAN", "DATA")
  File "C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy\arcpy\sa\Functions.py", line 3149, in CellStatistics
    ignore_nodata)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy\arcpy\sa\Utils.py", line 53, in swapper
    result = wrapper(*args, **kwargs)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy\arcpy\sa\Functions.py", line 3145, in Wrapper
    [function] + Utils.flattenLists(in_rasters_or_constants))
RuntimeError: <exception str() failed>

【错误分析】多个栅格的范围不一致导致的错误
【解决】多加一句环境配置
env.extent = "MAXOF"

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geodoer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值