是否从ArcGIS ModelBuilder中的“收集值”输出中导出数据?


11

我目前在玩ModelBuilder。我添加了当前模型的图片。

该模型当前正在迭代6个shapefile,因此每个“输出值”在一个列表中都包含6个图形。我找不到将这些列表中的值提取到表/文本文件或类似文件中的方法。

有没有办法做到这一点?

模型

这是运行模型后打开“输出值”时显示的内容: 在此处输入图片说明

我只想以某种方式获取这6个数字...


这基本上是您在这里问的正确的事情吗?gis.stackexchange.com/questions/25922/…收集值就是这样。如果您阅读了该帮助,它将告诉您它收集了可以传递给另一个工具的值。那么您要如何处理这些值?只是将它们记录到文件中还是需要它们进行进一步处理?
theJones 2012年

我只想将它们记录到文件中。我找不到在模型构建器中将输出值输入到其中以便提取它们的工具。
JPD 2012年

Answers:


17

您可以使用“ 计算值(数据管理)”工具和一些Python魔术来做到这一点。另请参阅以下相关问题:向Arcgis模型构建器添加任意代码?

一个多值变量就是值的分号分隔的字符串,有啥multivaluesToCsv以下功能的确是多值变量分成列表,并将它们转成然后写入行CSV(逗号分隔值)文本文件。

模型迭代器每个迭代一次运行模型中的所有过程-这对于我们的Calculate Value工具来说是不希望的,我们只想在最后一次运行一次。完成此操作的方法是创建另一个外部模型以包装原始内部模型。在帮助主题“ 将模型集成到模型中”中对此进行了讨论。

因此,您需要执行以下操作才能使其正常工作:

内部模型 -迭代要素类,对其进行处理,并收集值:

  1. 在您的原始模型(将成为我们的“内部”模型)中,添加另一个“收集值”工具来收集Name变量的值,以便我们可以将距离统计值映射到其对应的要素类名称。
  2. 公开输入和输出变量作为模型参数(右键单击一个椭圆,然后检查“模型参数”)。对“收集价值”工具的每个输出以及所需的任何输入参数(例如输入工作区)执行此操作。
  3. 保存并关闭内部模型。

外部模型 -内部模型完成后,仅运行一次内部模型,仅运行一次Calculate Value工具:

  1. 创建一个新模型-这将是我们的“外部”模型。
  2. 添加类型变量,Folder以允许您指定在何处创建输出CSV文件。
  3. 添加类型变量,String以允许您指定输出CSV文件的名称
  4. 将内部模型添加到新模型中(从ArcToolbox拖放或右键单击并添加数据或工具,浏览到内部模型并单击添加)
  5. 为要从外部模型设置的内部模型的任何参数创建变量,例如输入工作区(右键单击内部模型,然后选择“从参数创建变量”)。
  6. 将计算值工具添加到新模型
  7. 将以下内容粘贴到“计算值”工具的相应框中:

    表达方式

    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将反斜杠和后续字符误解为特殊字符序列。
    • 请确保在行内变量周围加上引号,因为如果没有引号,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
  8. (可选)如果希望能够从模型的工具对话框中运行输入或输出变量,或者将其与其他模型/脚本链接在一起,则将输入和输出变量公开为模型参数。外部模型的唯一输出是CSV文件。

  9. (可选)将输入变量和内部模型输出连接到“计算值”工具作为前提条件。我认为这实际上没有任何作用,只是从视觉上更清楚地说明了正在发生的事情。

我已经使用ModelBuilder对此进行了测试,并使其正常工作(请参见屏幕截图)。

内部型号内部型号

外型: 外型

内部模型对每个要素类运行一次其所有过程,然后最后计算一次“计算值”工具以一次仅输出一次CSV文件。


您好,感谢您为您的回复付出了极大的努力,对于我的迟到表示歉意。我正在尝试按照您的描述运行模型,但是CSV出现了问题。我在Excel中制作了一个空白CSV文件并将其保存,然后将其加载到模型中。错误000539:运行表达式时出错:multivaluesToCsv(r“%CSV File%”,“%FC名称值%”,“%最小值%”,“%平均值%”,“%最大值%”)<type'exceptions .IOError'>:[Errno 13]权限被拒绝:u'%CSV File%'无法执行(计算值)。我不断收到此错误。我的CSV名为CSVFile.csv。
JPD 2012年

1
只需修复-这是完美的解决方案。非常感谢你的帮助!
JPD 2012年

Python代码将为您创建CSV文件,而无需事先创建。如您所见,如果您在Excel中打开文件,则会锁定该文件,只有将其关闭,Python才能将其写入。
blah238

2
仅供参考,我已经更新了说明和屏幕截图,以使用嵌套模型来避免“计算值”多次运行,并解决了文本文件必须事先存在的问题(您现在将其输出位置和文件名指定为两个单独的参数)。
blah238

很好的答案!帮助我解决了将地统计图层交叉验证统计信息输出到csv文件的类似问题。谢谢@ blah238!
Cotton.Rockwood '16

1

您的模型描述的输出只是属性表中更新的值,不是吗?您不能简单地打开与更新的shapefile关联的.dbf文件吗?

如果不这样做,则表选择(分析工具>提取)应与SQL查询一起使用。


您好,感谢您的回覆。恐怕它不会更新每个shapefile的.dbf文件。将“表选择”添加到模型构建器也不起作用,因为我无法连接“最小/平均/最大距离”或“输出值”作为工具的输入。
JPD 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.