我目前在玩ModelBuilder。我添加了当前模型的图片。
该模型当前正在迭代6个shapefile,因此每个“输出值”在一个列表中都包含6个图形。我找不到将这些列表中的值提取到表/文本文件或类似文件中的方法。
有没有办法做到这一点?
这是运行模型后打开“输出值”时显示的内容:
我只想以某种方式获取这6个数字...
我目前在玩ModelBuilder。我添加了当前模型的图片。
该模型当前正在迭代6个shapefile,因此每个“输出值”在一个列表中都包含6个图形。我找不到将这些列表中的值提取到表/文本文件或类似文件中的方法。
有没有办法做到这一点?
这是运行模型后打开“输出值”时显示的内容:
我只想以某种方式获取这6个数字...
Answers:
您可以使用“ 计算值(数据管理)”工具和一些Python魔术来做到这一点。另请参阅以下相关问题:向Arcgis模型构建器添加任意代码?
一个多值变量就是值的分号分隔的字符串,有啥multivaluesToCsv
以下功能的确是多值变量分成列表,并将它们转成然后写入行CSV(逗号分隔值)文本文件。
模型迭代器每个迭代一次运行模型中的所有过程-这对于我们的Calculate Value工具来说是不希望的,我们只想在最后一次运行一次。完成此操作的方法是创建另一个外部模型以包装原始内部模型。在帮助主题“ 将模型集成到模型中”中对此进行了讨论。
因此,您需要执行以下操作才能使其正常工作:
内部模型 -迭代要素类,对其进行处理,并收集值:
Name
变量的值,以便我们可以将距离统计值映射到其对应的要素类名称。外部模型 -内部模型完成后,仅运行一次内部模型,仅运行一次Calculate Value工具:
Folder
以允许您指定在何处创建输出CSV文件。String
以允许您指定输出CSV文件的名称。将以下内容粘贴到“计算值”工具的相应框中:
表达方式:
multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
r
之前"%Output CSV File Location%"
是显著:这表明这是一个原始字符串 ; 因为Windows文件系统路径通常包含反斜杠(Python中的转义字符),所以我们必须使用它来防止Python将反斜杠和后续字符误解为特殊字符序列。代码块:
import os, csv
def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
ext = 'csv' # Define output file extension (e.g. csv or txt)
header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
# Join CSV file path and name, adding extension if necessary
csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
# Open text file for writing
with open(csvfile, 'wb') as f:
w = csv.writer(f)
w.writerow(header) # Write header row
rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
w.writerows(rows)
return csvfile
(可选)如果希望能够从模型的工具对话框中运行输入或输出变量,或者将其与其他模型/脚本链接在一起,则将输入和输出变量公开为模型参数。外部模型的唯一输出是CSV文件。
我已经使用ModelBuilder对此进行了测试,并使其正常工作(请参见屏幕截图)。
内部型号:
外型:
内部模型对每个要素类运行一次其所有过程,然后最后计算一次“计算值”工具以一次仅输出一次CSV文件。