是否将任意代码添加到ArcGIS ModelBuilder?


11

有什么方法可以向ArcGIS模型添加任意代码段?

我设想类似于高级标签或字段计算器中的表达式构建器的“显示代码块” 。

例如,我目前的项目可以从获取运行该工具的用户的用户名中大大受益。我知道在python中这很简单import os; os.environ.get('USERNAME')。我想我可以将该代码段编写为get_username.py,将其添加到Arccatalog中的工具箱中,然后将该工具添加到模型中,并将其用作当前工具的必需模型参数。这么小的事情要做很多工作,下次我可能想要其他东西,例如内联变量替换复合变量

我认为,可以以通用的,广泛有用的方式来使用代码段工具或类似工具来满足所有这些需求。


疯狂的想法:代替表达式生成器,保存其历史记录以供模型重用的python命令行窗口又如何呢?
马特·威尔基

2
实际上,我真正想要的是像arcgis工具一样将整个Python库公开给模型构建器。但这只是疯狂的谈话(对吗?)
马特·威尔基

好想法!您想即时将代码段写入“工具”中,该代码段将处理该代码段并返回结果,对吗?因此,在您的示例中,“工具”将返回<当前用户名>,然后可以将其应用于下游的其他工具。
RyanKDalton

@RyanDalton,是的,完全正确。
马特·威尔基

Answers:


3

对旧帖子的新答案,只是为了阐明如何创建可重复使用的模型来执行此操作。

打开模型,插入->仅模型工具->计算值。

在表达式中,键入: getuser()

在代码块中,键入:

def getuser():
    import getpass
    return getpass.getuser()

(有关@ChadCooper的用户名代码段的来源,请参阅“ 以特定格式获取用户名 ”)

对于数据类型,选择String

在此处输入图片说明

将输出圆圈重命名为username。最终结果模型如下所示: 使用计算值工具

然后,您可以将此模型拖到任何将来的模型中,并在任何将来的模型或脚本中引用名为%username%的变量。只需尝试运行此模型,然后再尝试访问%username%变量。您可以使用前提条件来做到这一点。


Ryan也许您可以扩展为什么输出是[P]参数,并显示该模块包含在另一个模块中的示例。最初我很困惑,为什么P代表输出,因为参数通常都是关于输入的。
马特·威尔基,2015年

@mattwilkie,您不需要任何输入参数,因为python脚本将从系统中“读取”输入。但是,您需要将输出(用户名)作为参数,以便可以将结果使用到另一个模型或python脚本中。下一步是将用户名参数传递到类似“电子邮件脚本”的名称中,该名称将自动使用uesrname输出参数作为“收件人”电子邮件地址的输入。
RyanKDalton 2015年

10

实际上,您可以使用“ 计算值(数据管理)”工具执行此操作。

它不是特别优雅(该工具的整个源代码每次运行时都记录在日志中),并且编辑器(实际上只是一个文本框)非常糟糕。

我建议编写模块,然后可以从中导入和调用函数,然后只需要在对话框中编写非常简短的代码段即可。否则,它不是很干净。

“计算价值”适用于Arcgis v10的所有许可证级别。使用v9.x,仅当安装了Spatial或3D Analyst扩展(参考)时,它才可用于Arcview 。


谢谢!这对于我今天需要的(%USERNAME%向.sde数据库连接插入)非常有效。同意编辑器不符合该名称,可以很好地用作粘贴目标。
马特·威尔基

1
回复:9.x,CV帮助页面的措辞表示如果仅安装 SA / 3D扩展,则该工具可能可用。无需许可或激活该扩展程序,就可以使用它。
马特·威尔基

“我建议编写可以导入的模块” –这是一个非常不错的主意!
柯蒂斯·普赖斯

2

也许我误解了这个问题,但是您似乎正在寻找ArcToolBox中的python脚本工具功能:

http://help.arcgis.com/zh-CN/arcgisdesktop/10.0/help/index.html#/Integrating_scripts_within_a_model/002w0000006n000000/

http://help.arcgis.com/zh-CN/arcgisdesktop/10.0/help/index.html#//001500000006000000.htm

实际上,您也可以使用/组合其他几种脚本语言(在此示例中为R):

http://help.arcgis.com/zh-CN/arcgisdesktop/10.0/help/index.html#//002w0000007w000000



3
这行得通(而且我将如何做),但是马特在他的问题中特别称呼这种方法“为一件很小的事情做很多工作:)
nmpeterson 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.