文章目录
前言
使用的arcpy为arcgis10.2对应版本。(python27)
想遍历面要素的多条记录实现批量裁剪功能,所幸找到用shp批量裁剪栅格的代码。在此基础上进行改进,记录一下实现过程和问题的解决。
https://www.likecs.com/show-203727205.html
一、遇到的问题?
1.中文编码问题
遇到如下报错
UnicodeEncodeError: 'ascii' codec can't encode characters in position
解决方法:设置编码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
2.arcpy函数问题
起初使用Clip_management裁剪,报错参数无效。于是找了很久的对应函数,最终在官网文档找到完美解答。ps:对应的函数位置和arcgis中工具箱位置是一致的。(arcpy.Clip_analysis同样可以实现shp裁剪shp)
裁剪函数如下:
arcpy.analysis.Clip(inputshp,row[0],resultPath+"\\"+tempShpName)
二、实现步骤
1.代码思路
与参考案例类似,首先通过游标遍历面数据子要素,在每次遍历过程中实现clip,并添加目标字段,这里添加的是县域名称,最后实现合并。
字段添加并赋值代码如下:
arcpy.AddField_management(Clip, "qu", "TEXT", "", "", 20)
result=arcpy.CalculateField_management(Clip, "qu", '\"'+ str(row[1]) + '\"',"VB", "")
合并代码:
合并的函数一定要找对应版本的官方文档,arcgis pro使用的是arcpy.ia.Merge,在这里也踩了坑。
arcpy.Merge_management(inFeatures, resultPath+"\\"+'water_merge'+'.shp')
2.制作脚本工具
自定义脚本工具实现流程不再赘述,csdn也有很多很好的教程。推荐GIS荟
全部代码如下:
import arcpy
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
inputshp = arcpy.GetParameterAsText(0)
clipshp = arcpy.GetParameterAsText(1)
resultFolder = arcpy.GetParameterAsText(2)
inFeatures = []
# 实现批量clip
def clip(inputshp, clipshp, resultPath):
#遍历面要素,SHAPE@为几何对象
with arcpy.da.SearchCursor(clipshp, ["SHAPE@",'NAME']) as cursor:
for row in cursor:
tempShpName = str(row[1]) + '.shp'
Clip=arcpy.analysis.Clip(inputshp,row[0],resultPath+"\\"+tempShpName)
#添加字段
arcpy.AddField_management(Clip, "qu", "TEXT", "", "", 20)
#字段赋值
result=arcpy.CalculateField_management(Clip, "qu", '\"'+ str(row[1]) + '\"',"VB", "")
arcpy.AddMessage(row[1]+"success")
inFeatures.append(result)
#合并
arcpy.Merge_management(inFeatures, resultPath+"\\"+'water_merge'+'.shp')
if __name__ == '__main__':
clip(inputshp, clipshp, resultFolder)
实现效果如下: