传递属性 (编辑)

描述

查找源线要素与目标线要素空间上匹配的位置,并将指定属性从源要素传递到互相匹配的目标要素。

属性传递一般用于将属性从某数据集中的要素复制到另一数据集中的对应要素。例如,可以用于将道路要素的名称从之前数字化并维护的数据集传递到新收集的、具有更高精度的新数据集中的道路要素。这两个数据集通常称为源要素与目标要素。该工具在指定搜索距离内查找相应的源线要素与目标线要素,并将指定属性从源线传递到目标线。

插图

传递属性

使用方法

    警告:

    此工具会修改输入数据。有关详细信息以及避免数据被意外更改的策略,请参阅修改或更新输入数据的工具

    注:

    所有输入必须处于同一坐标系。

  • 输入范围的并集用作处理范围。参与源要素与目标要素的计数会在处理消息中报告。

  • 必须在传递字段参数中指定一个或多个字段。如果传递字段的名称与目标要素表中某字段的名称相同,为使名称唯一,传递字段的名称将追加 _1(或 _2_3 等)。

    当多个源要素与一个或多个目标要素匹配时,仅会将来自其中一个源要素的字段值传递至目标要素。如果源字段值丢失,则不会发生任何属性传递。

  • 搜索距离参数用于查找匹配候选项。使用足以获取相应要素间大多数偏移的距离,但是距离不可过大,以防止出现对过多候选项的不必要处理并避免得出错误匹配的潜在风险。

  • 输出匹配表为可选项。此匹配表可提供完整的要素匹配信息,其中包括源 FID 与目标 FID、匹配组、匹配关系以及从空间和属性匹配条件中获取的匹配置信度级别。此信息能够帮助您了解匹配情况,并有助于进行后检查、后编辑和进一步分析。有关详细信息,请参阅关于要素匹配与匹配表

  • 传递规则字段参数可以设置规则来控制 m:n 匹配的属性传递,其中多个源要素与一个或多个目标要素相匹配。如果未设定规则,则将从最长的匹配源要素传递属性。但是,为了更好地指导传递,可以使用基于属性的规则,并且每个规则由字段名称和值定义。

    支持以下字段类型和规则值:

    字段类型规则值

    文本

    可能存在于源要素中的字符串值。

    整型

    可能存在于源要素中的整数值,或者最大或最小值的 MAXMIN

    日期型

    最近或最早日期的 MAXMIN

    可以根据需要指定多个字段/规则值对。将以规则的列出顺序来应用规则。

    找到 m:n 匹配后,该工具将检查指定字段和规则值,并确定通过以下方式传递属性的源要素:

    • 如果 m 个源要素中只有一个在规则列表的第一个字段中具有规则值,则将使用该源要素进行传递。
    • 如果 m 个源要素中有多个源要素具有规则值,或者没有源要素具有规则值,则其为连接。如果未指定更多规则,则将使用最长的源要素进行传递。否则,将检查列表中的下一个规则以断开连接。
    • 该过程将持续进行,直至完成对所有规则的评估。如果无法确定用于传递的源要素,则将使用最长的源要素进行传递。

    以下示例将介绍此过程的工作原理。需要将 ROAD_NAME 字段从源传递到 3:1 匹配的目标。默认情况下,将使用三个源要素中最长的源要素 3 进行传递,并且目标要素会收到 West AveROAD_NAME 值,如下表所示。

    现在,假定已设置以下规则:字段 TRAVEL_DIRECTION 使用单向规则,SPEED_LIMIT 字段使用 MAX 规则。要确定用于传递的正确源要素,工具会首先评估所有三个源要素的 TRAVEL_DIRECTION 值,并找到与单向匹配的两个源要素。然后,工具会检查这两个要素之间的 SPEED_LIMIT 值,并选择最大值为 40 的 OBJECTID 1。由此,可将 East AveROAD_NAME 从此要素传递到目标要素,如下表所示。

    传递规则字段示例
  • 要素匹配精度取决于两个输入的数据质量、复杂程度和相似程度。

    在预处理过程中,您需要尽可能减少数据错误,并选择相关要素作为输入。通常情况下,如果某个输入数据集内的要素具有正确的拓扑结构和有效的几何,且本身为单部件而无重复,这将非常有用;否则可能会出现意外结果。

语法

arcpy.edit.TransferAttributes(source_features, target_features, transfer_fields, search_distance, {match_fields}, {out_match_table}, {transfer_rule_fields})
参数说明数据类型
source_features

传递属性的源线要素。

Feature Layer
target_features

传递属性的目标线要素。指定的传递字段会添加到目标要素。

Feature Layer
transfer_fields
[field,...]

要传递至目标要素的源字段列表。必须至少指定一个字段。

Field
search_distance

用于搜索匹配候选项的距离。必须指定一个距离,且此距离必须大于零。可以选择首选单位;默认为要素单位。

Linear Unit
match_fields
[[source_field, target_field],...]
(可选)

来自源要素与目标要素的字段的列表。如果指定,将检查每对字段中的匹配候选项,以帮助确定正确的匹配。

Value Table
out_match_table
(可选)

包含完整的要素匹配信息的输出表。

Table
transfer_rule_fields
[[field, rule],...]
(可选)

当多个源要素与目标要素匹配时,设置规则以控制用于将属性传递到目标要素的源要素。用于传递的源要素由指定的规则字段和规则值确定,按其在指定列表中的显示顺序为其分配从高至低优先级。如果未指定规则,则将使用多个匹配的源要素中最长的源要素进行传递。

可用规则类型如下:

  • MIN - 整型或日期型字段的最小值。对于日期字段,则为最近日期。
  • MAX - 整型或日期型字段的最大值。对于日期字段,则为最早日期。
  • 可能存在于源要素中的文本或整数值。
Value Table

派生输出

名称说明数据类型
out_feature_class

更新后的目标要素。

要素类

代码示例

TransferAttributes 示例 1(Python 窗口)

以下 Python 窗口脚本演示了如何在即时模式下使用 TransferAttributes 函数。

import arcpy
arcpy.env.workspace = "C:/data"
arcpy.TransferAttributes_edit("source_Roads.shp",
                              "target_Roads.shp", ["RoadName", "PaveType"],
                              "25 Feet")
TransferAttributes 示例 2(独立脚本)

以下独立脚本演示了如何在脚本环境中应用 TransferAttributes 函数。

# Name:        TransferAttributes_example_script2.py
# Description: Performs attribute transfer from newly updated roads (source) to existing
#              base roads (target). Where the source and target features are matched in
#              many-to-one or many-to-many (m:n) relationships, attributes are transferred 
#              from only one of the m source features to the n target features. This script
#              includes a post-process that flags resulting target features with the m:n
#              match relationships. You can inspect the flagged features and retrieve the
#              attributes from the desired source features if necessary.
# Author:      Esri
# -----------------------------------------------------------------------

# Import system modules
import arcpy
from arcpy import env

# Set environment settings
env.overwriteOutput = True
env.workspace = r"D:\conflationTools\ScriptExamples\data.gdb"

# Set local variables
sourceFeatures = "updateRoads"
targetFeatures = "baseRoads"
transfer_fields = "RD_NAME; RD_ID"

search_distance = "300 Feet"
match_fields = "RD_NAME FULLNAME"

outMatchTable = "ta_mtbl"

# Make a copy of the targetFeatures for attribute transfer
targetCopy = targetFeatures + "_Copy"
arcpy.CopyFeatures_management(targetFeatures, targetCopy)

# Performs attribute transfer
arcpy.TransferAttributes_edit(sourceFeatures, targetCopy, transfer_fields, search_distance, match_fields, outMatchTable)

# ====================================================================================
# Note 1:  The result of TransferAttributes may contain errors; see tool reference.
#          Additional analysis steps may be necessary to check the results; these steps
#          are not included in this script.
#
#          The following process identifies m:n matches between source and target features 
#          and flag features in targetCopy for inspection.
# ====================================================================================

# Add a field srcM_inMN to the match table to store the m count of source features in m:n relationship
field_srcM_inMN = "srcM_inMN"
arcpy.AddField_management(outMatchTable, field_srcM_inMN)

codeblock = """
def getM(fld):
    x = fld.split(\":\")[0]
    if x.isnumeric():
        if int(x) > 0:
            return int(x)
    return -1
"""

# Calculate values for srcM_inMN
arcpy.CalculateField_management(outMatchTable, field_srcM_inMN, "getM(!FM_MN!)", "PYTHON_9.3", codeblock)

# Make a table view of the match table, selecting srcM_inMN values greater than 1 
# (excluding 1:n relationships which don't need to be inspected)
arcpy.MakeTableView_management(outMatchTable, "mtable_view", field_srcM_inMN + "> 1")

# For the selected records, transfer srcM_inMN and SRC_FID fields and values to the targetCopy
arcpy.JoinField_management(targetCopy, "OBJECTID", "mtable_view", "TGT_FID", field_srcM_inMN + "; SRC_FID")

# ====================================================================================
# Note 2:  Now the fields srcM_inMN and SRC_FID are in the copy of the target features.
#          The srcM_inMN values are the counts of matched source features; the SRC_FID
#          values indicate the source feature IDs from which the transferred attributes
#          come from.
#
#          At this point you can interactively review the transferred attributes for the
#          flagged features. If you want to replace any of them by those from a different
#          source feature, you would need to make the edits as needed.
# ====================================================================================
TransferAttributes 示例 3(独立脚本)

以下独立脚本演示了如何在脚本环境中使用传递规则来应用 TransferAttributes 函数。

# Name:        TransferAttributes_example_script3.py
# Description: Performs attribute transfer from newly updated roads (source) to
#              existing base roads (target). Where the source and target
#              features are matched in many-to-one or many-to-many (m:n)
#              relationships, attributes can be transferred based on transfer
#              rules. This script shows how transfer rules are set.
# ------------------------------------------------------------------------------

# Import system modules
import arcpy

# Set environment settings
arcpy.env.overwriteOutput = True
arcpy.env.workspace = r"D:\conflationTools\ScriptExamples\data.gdb"

try:
    # Set local variables
    sourceFeatures = "updateRoads"
    targetFeatures = "baseRoads"
    transfer_fields = "RD_NAME"

    search_distance = "300 Feet"
    match_fields = ""
    outMatchTable = ""
    transfer_rules = ["TRAVEL_DIRECTION One-Way", "SPEED_LIMIT MAX"]

    # Make a copy of the targetFeatures for attribute transfer
    targetCopy = targetFeatures + "_Copy"
    arcpy.CopyFeatures_management(targetFeatures, targetCopy)

    # Performs attribute transfer
    arcpy.TransferAttributes_edit(sourceFeatures, targetCopy, transfer_fields,
                                  search_distance, match_fields, outMatchTable,
                                  transfer_rules)

except arcpy.ExecuteError as aex:
    print(arcpy.GetMessages(2))
    
except Exception as ex:
    print(ex.args[0])

许可信息

  • Basic: 否
  • Standard: 否
  • Advanced: 是

相关主题