太懒了,一直没做一些整理与记录。今天想到了就把之前做过的arcpy程式简单写一下。
一、批量影像裁剪
前段时间基本上都在选图裁图,一张张裁剪太费力了。arcgis里面自带有批量处理的功能Batch,但用起来比较麻烦,尤其是要裁剪的影像比较多的话,像我这种懒人当然是懒得去一张张影像去点击。用arcpy做一个简单的程序方便很多。
1.问题
用一个shp文件对多幅遥感影像进行裁剪,得到多幅影像的同一区域数据
2.分析
输入:待裁剪的影像、shp文件和文件格式
输出:裁剪完毕的影像
主要函数:ExtractByMask_sa
3.代码
import arcpy
arcpy.CheckOutExtension("spatial") #权限检查
arcpy.env.workspace="{待裁剪影像所在文件夹目录}" #,定义工作空间,需将待裁剪影像放在一个目录下
Inputfeature="{shp文件}"
rasters=arcpy.ListRasters("*",{type})#将文件格式为tpye的数据放入rasters中,type:要裁剪的影像格式类型
for raster in rasters:#遍历rasters中的数据
out={OutputFile}+"_clip_"+raster #这样输出的文件保留了全称和文件格式输出的时候文件名前面加了_clip_
arcpy.gp.ExtractByMask_sa(raster,Inputfeature,out)#裁剪
4.制作脚本
改造代码:设置四个参数
arcpy.env.workspace=arcpy.GetParameterAsText(0)#定义工作空间
Inputfeature=arcpy.GetParameterAsText(1)#shp文件
OutputFile=arcpy.GetParameterAsText(2)#输出
type1=arcpy.GetParameterAsText(3) #格式
构建格式的键值对,这样就不用每次都手动输入格式,也不至于在文件中写死导致别的格式不能裁剪。我这里只列出了两个。
typeall={"TIF":"TIF","img":"img"}
type1=typeall[type1]
也可以用arcpy.AddMessage提示处理进度。写完后保存为.py文件。
全部代码:
import arcpy
arcpy.CheckOutExtension("spatial")
typeall={"TIF":"TIF","img":"img"}
arcpy.env.workspace=arcpy.GetParameterAsText(0)
Inputfeature=arcpy.GetParameterAsText(1)
OutputFile=arcpy.GetParameterAsText(2)
type1=arcpy.GetParameterAsText(3)
type1=typeall[type1]
rasters=arcpy.ListRasters("*",type1)
for raster in rasters:
arcpy.AddMessage(raster)
out=OutputFile+"_clip_"+raster
arcpy.gp.ExtractByMask_sa(raster,Inputfeature,out)
arcpy.AddMessage(raster+"has done")
在catalog中新建一个脚本文件。导入上述py文件,再在参数设置中设置四个参数,三个输入,一个输出,需对应起来。
在格式的参数下过滤器中需添加之前键值对中的值。
搞定。
二、根据条件对字段编号
以前在做林业数据处理的时候,要对每一个图斑进行编号,这样在外业调查完回来修改时能够快速定位到哪一个图斑。林业上的区划级别是这样的:乡-林场-作业区-林班-小班(好像是这样,有错的话希望谁帮忙更正一下,谢谢),这样一来约束条件就有四个:乡,林场,作业区,林班(这里为了方便就只用作业区和林班作约束条件先)。
主要函数:UpdateCursor
要求对每个小班进行编号,每个林班内从1开始编号。通过束条件为作业区编号和林班编号来确定小班编号的唯一性。
2.代码
import arcpy
import string
strPre=""
fldNameXB="小班编号"
rows = arcpy.UpdateCursor("E:\LC81290392018092LGN00\New_Shapefile.shp","","","","作业区编号;林班编号")
try:
for row in rows:#遍历每一行
strNow=str(row.getValue("作业区编号"))+str(row.getValue("林班编号"))#通过字符串相加的方法确定图斑的唯一性
if(strNow!=strPre):
i=1
row.setValue(fldNameXB,i)
print(i)
rows.updateRow(row)
strPre=strNow
i+=1
else:
row.setValue(fldNameXB,i)
print(i)
rows.updateRow(row)
i+=1
strPre=strNow
finally:
print("done")
3.结果