之前有个工作需要批量将面要素转栅格,字段命名栅格,字段值用以赋值。ArcGIS的要素转栅格工具可以批量实现,但是需要手动更改几十个甚至几百个字段及路径,并且还要反复多次干这个事,实在是太费事了。动不动要改百来个字段和路径名,很要命。
这个事情呢,感觉在模型构建器里实现应该很简单对吧,只要设定输出规则和输入字段通配符或者自选字段都可以解决,于是,打开模型构建器发现,没有迭代字段。
搜索发现ArcGIS pro的模型构建器新加了迭代字段功能,但咱也没有pro。只能自力更生。
迭代字段首先要获取字段列表。
Arcpy有一个函数
利用模型构建器中的计算值工具实现代码运行,很快写好了放入计算值的函数代码:
def get_Fname(featureclass,wtext):
field_names = [f.name for f in arcpy.ListFields(featureclass,wtext)]
for fname in field_names:
return fname
然后运行时发现,只会返回第一个值,其余都无了。。。然后查模型构建器说明时发现了这一条:
心塞。但是每次都要用arcpy来实现的话,太麻烦了,万一再有个代码错误,debug半天,活都干完了。并且考虑到与同事分享工具的便利性,执着于用模型构建器自带的工具解决。
虽然但是,还是把写好的完整的Arcpy代码记录一下:
#coding=utf-8
import arcpy
from arcpy import env
#Set environment settings
env.workspace = "C:/data"
#Set local variables
inFeature = "roads.shp" #输入要素
outRaster = "c:/output/roadsgrd" #输出
wText = "F*" #通配符
cellSize = 25 #栅格单元大小
field_names = [f.name for f in arcpy.ListField(inFeature,wText)]
for fname in field_names:
arcpy.FeatureToRaster_conversion(inFeature, fname, outRaster, cellSize)
思路:首先,既然是模型构建器,工具应该要具备多次使用的功能,所以先实现迭代字段这个功能,方便以后做别的事情要用到。
模型的主要思路就是:**--- 转置表格--- 插入行迭代--- 收集值**
既然模型构建器自带的工具没有现成的迭代字段工具,又不能用Arcpy获取列表,那就曲线救国,不能迭代列名,但是有迭代行。那把行跟列换一下不就好了嘛
参数有5个居多,其中除了输入表,后面几个看起来都一样,要怎么设置呢?
拖个要素进去看下工具界面和帮助:
先看下结果帮助理解下
转置前属性表(红框是我选择要转置的字段):
转置后的属性表:
好了,我们重新理解一下对话框。
根据对话框的理解,设置一下模型构建器:为了以后经常调用,
输入表
和要转置的字段
设置为参数(右键-✔模型参数),参数就是你打开工具每次都要你输入的东西,其他就是默认了。把那个不需要的属性字段椭圆删掉,省得下次搞不清楚。
双击迭代行选择,按字段分组这里选择字段名。
迭代的字段名是一个一个出来的,可是我们想要的是个列表,所以,把每次迭代输出的值收集起来,就获得了多值(类似于列表)
插入-仅模型工具-收集值
,为了方便下一步操作,把输出的多值设为参数。
保存工具并命名为获得字段多值。
到这里,革命已经成功了90%。这个结果是获得一个字段多值(列表)。由于模型构建器里一个工具只能有一个迭代,所以字段迭代我们另起一个工具。
好了,保存。迭代字段工具就完成了。如果要进行利用字段的工具,直接将后续操作拖进这个工具里并另存即可。