使用带有用户输入的ModelBuilder按属性提取?


11

我想使用ModelBuilder创建一个工具,让用户选择一个或多个将用于提取shapefile的值。

我有一个带有“ Parcel_Type”字段的宗地层。我希望用户能够选择要提取的包裹类型。因此,如果用户要提取类型为“ EL”的地块,则只需输入“ EL”作为变量。如果要输入“ EL”和“ CDD”,则需要将它们输入为多变量。那将是人类与模型的唯一交互。

那么如何在模型中使用这些变量?

Answers:


14

这种类型的操作几乎总是涉及编写WHERE子句,因此我认为至少要使用一点点Python。

同样,虽然这可以通过IMO的ModelBuilder实现,但创建具有自定义验证和对参数设置进行更多控制的Python 脚本工具可以提供更好的用户体验-例如,通过使FieldMultiValue *参数下拉菜单您可以从中选择值,而不必键入它们。

*实际上可能不确定MultiValue参数

但是,由于这是另一个主题的高级练习,因此我将继续使用ModelBuilder方法,仅使用Python创建WHERE子句:

  1. 创建一个新模型
  2. 为输入的Feature LayerFieldMultiValue参数创建变量(右键单击空白画布,然后单击Add Variable)。
  3. 右键单击每个,然后选择“ 模型参数”
  4. 计算值(数据管理)工具添加到画布。作为前提条件将3个变量连接到该变量(在这种情况下仅用于显示,但在其他情况下它可以改变执行顺序)。
  5. 双击“计算值”工具进行设置:

    5a。将以下内容复制/粘贴到“ 表达式”框中(进行调整以匹配您的变量名):

    buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")

    5b。将以下内容复制/粘贴到“ 代码块”框中:

    import arcpy
    
    def buildWhereClauseMultiValue(table, field, values):
        """Takes a semicolon-delimited list of values and constructs a SQL WHERE
        clause to select those values within a given field and table."""
    
        # Add DBMS-specific field delimiters
        fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(table).path, field)
    
        # Split multivalue at semicolons and strip quotes
        valueList = [value[1:-1] if (value.startswith("'") and value.endswith("'")) else value for value in values.split(';')]
    
        # Determine field type
        fieldType = arcpy.ListFields(table, field)[0].type
    
        # Add single-quotes for string field values
        if str(fieldType) == 'String':
            valueList = ["'%s'" % value for value in valueList]
    
        # Format WHERE clause in the form of an IN statement
        whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(valueList))
        return whereClause
    

    5c。将输出数据类型设置为SQL表达式

    5天 单击“确定”,然后右键单击“计算值”工具中的输出变量,并将其重命名为更具描述性的名称,例如“ WHERE子句”。

  6. 添加按属性选择图层(数据管理)工具在画布上。将要素图层和WHERE子句变量连接到“按属性选择图层”工具。
  7. 复制功能(数据管理)工具添加到画布。将“按属性选择图层”工具的输出连接到“复制要素”工具。右键单击输出要素类变量,然后检查模型参数和(可选)添加到显示选项。

    此时,它应如下所示: 模型画布

  8. 模型 -> 模型属性菜单下,给它一个好名字和标签,然后保存并关闭它。

  9. 在ArcToolbox中双击模型以打开模型对话框。输入参数,然后单击确定。它应该将所选要素导出到新要素类,并将其添加到地图(如果在输出要素类上选中了“添加到显示”)。

    模型对话框

笔记:

  • 您可以始终对值进行硬编码,而不希望对用户不希望更改的变量进行“参数化”,例如要素图层或字段参数。我只是喜欢具有通用/可重用的工具,所以我做了这些模型参数。实际上,我要做的就是简单地将通用模型拖放到一个新模型中,然后设置您的预定义参数-这样,您可以创建多个不同的预定义“包装器”模型,但是只有一个基础模型在起作用,所以如果您需要更改其功能,则只需在一个地方进行更改。

  • 如果像我一样幸运的话,您不必验证模型并仅提供一些虚拟数据即可在验证后将其删除(请注意,所有模型元素都是空白/白色,这意味着它们尚未“准备好运行”) -但在模型对话框中填写参数后,我仍然可以运行它。


3

如果您的GUI要求不适用于@ blah238所示的精确对话框,则也可以使用一个名为Select的简单地理处理工具来实现此工作流程。

使用“搜索”窗口找到它,或转到ArcToolbox>分析工具>提取>选择。

选择(分析)工具,您可以提取使用任何字段(属性)从要素类的功能。

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.