标注 | 说明 | 数据类型 |
更新要素 | 将线要素与基础要素进行比较。 | Feature Layer |
基础要素 | 将线要素与更新要素进行比较以检测更改。 | Feature Layer |
输出要素类 | 包含更改信息的输出线要素类。 输出包含所有参与的更新要素(匹配的和不匹配的)以及任何不匹配的基础要素。 | Feature Class |
搜索距离 | 将用于搜索匹配候选项的距离。 必须指定一个距离,且此距离必须大于零。 可以选择首选单位。 默认为要素单位。 | Linear Unit |
匹配字段 (可选) | 来自更新要素和基础要素的匹配字段。 如果指定,将比较匹配候选项的每对字段,以帮助确定正确的匹配。 | Value Table |
输出匹配表 (可选) | 包含完整的要素匹配信息的输出表。 | Table |
更改容差 (可选) | 用于确定是否存在空间更改的距离。 将所有匹配的更新要素和基础要素与此容差进行比较。 如果更新要素或基础要素有任意部分落在匹配的要素区域之外,则将其视为空间更改。 要执行此过程,该值必须大于输入数据的 XY 容差,并且输出将包含 LEN_PCT 和 LEN_ABS 字段。 默认值为 0,表示不执行此过程。 0 到数据 XY 容差(包括 XY 容差)之间的任何值都将使过程无关紧要,并将被替换为 0。 可以选择单位;默认为要素单位。 | Linear Unit |
比较字段 (可选) |
将用于确定匹配更新要素与基础要素之间是否存在属性更改的字段。 | Value Table |
比较线方向 (可选) | 指定是否比较匹配要素的线方向。
| Boolean |
摘要
可以查找更新线要素在空间上与基线要素匹配的位置,检测空间更改、属性更改或同时检测这两种更改以及无更改的情况。 然后,它将创建一个输出要素类,其中包含匹配的更新要素以及有关其更改、不匹配的更新要素和不匹配的基本要素的信息。
插图
使用情况
此工具的典型应用是维护一组线要素(如道路),并定期接收来自合作伙伴的更新内容作为一组新道路要素。 您需要了解哪些更新的要素是对现有基础要素的更改或是待添加的新要素,以及哪些基础要素是应删除的旧要素。 此工具用于查找更新的线数据集与基础线数据集之间的匹配要素,检测空间更改、属性更改或同时检测空间和属性更改以及无更改的情况,同时创建含要素更改信息的输出要素类。
输出要素类包含所有参与的更新要素(匹配的和不匹配的)以及任何不匹配的基础要素。 检测到的更改的相关信息将写入以下字段:
- UPDATE_FID- 更新要素的要素 ID。 不匹配的基础要素的值为 -1。
- BASE_FID- 基础要素的要素 ID。 不匹配的更新要素的值为 -1。
- CHANGE_TYPE- 检测到的更改类型如下:
- S - 空间发生更改的匹配更新要素。
- A - 属性发生更改的匹配更新要素。
- SA - 空间和属性均发生更改的匹配更新要素。
- S_LD - 空间更改以及线的反方向。
- SA_LD - 空间和属性的更改以及线的反方向。
- NC - 无更改的匹配更新要素。
- N - 新加入基础数据的不匹配更新要素。
- D - 可能需要从基础数据中删除的不匹配基础要素。
要素匹配过程首先基于搜索距离和可选的匹配字段参数值。 可生成输出匹配表来存储匹配信息。
搜索距离参数用于查找匹配候选项。 使用足以获取相应要素间大多数偏移的距离,但是距离不可过大,以防止出现对过多候选项的不必要处理并避免得出错误匹配的潜在风险。
发现匹配候选项后,再通过一组几何测量手段对这些匹配候选项进行评估,以确定它们的相似程度是否足以被视为空间匹配。
如果在匹配字段参数中指定了一对或多对字段,则将空间匹配候选项与这些字段值来比较,以帮助确定正确的匹配。 例如,如果更新要素与基础要素均具有包含街道名称的 STREET_NAME 字段,并且更新要素与两个基础要素在空间上匹配,但只有其中一个基础候选要素的 STREET_NAME 值与更新要素的值相同,则此基础要素为更好的匹配项。 文本字符串的比较不区分大小写,这表示 First St 与 first st 被视为相同的文本。
输出匹配表参数为可选项。 此匹配表可提供完整的要素匹配信息,其中包括源 FID 与目标 FID、匹配组、匹配关系以及从空间和属性匹配条件中获取的匹配置信度级别。 此信息能够帮助您了解匹配情况,并有助于进行后检查、后编辑和进一步分析。 有关详细信息,请参阅关于要素匹配与匹配表。
在输出匹配表中,SRC_FID 字段和 TGT_FID 字段中的值分别表示更新要素 ID 和基础要素 ID。
识别更改过程发生在要素匹配过程之后。 所有匹配的更新要素的空间条件与属性条件,以及线的方向都需要与对应的基础要素进行比较,以便确定其 CHANGE_TYPE 值。
出现以下一种或两种情况时,将检测到空间更改(更改类型为 S):
- 匹配的更新要素与对应的基础要素存在拓扑差异。 例如,一个更新要素与两个基础要素匹配。
- 在每个匹配组中,更新要素或基础要素的任何部分均会落在更改容差参数值之外。
更改容差参数值用作更新要素或基础要素周围缓冲区的宽度。 对于每个匹配组,会在所有更新要素周围创建更新缓冲区,在所有基础要素周围创建基础缓冲区。 然后系统会将所有更新要素与基础缓冲区进行比较,并将基础要素与更新缓冲区进行比较。 如果更新要素有任何部分落在基础缓冲区之外,或如果基础要素有任何部分落在更新缓冲区之外,或者两种情况均存在,则将其视为空间更改。 当指定值大于输入数据的 XY 容差时,输出中将包括以下新字段:
- LEN_PCT- 此字段可根据匹配组存储长度百分比值。
- LEN_ABS- 此字段可根据匹配组存储以要素单位计量的绝对长度值。
上述字段的值将由输出要素所属的匹配组决定,具体取决于以下条件:
- 如果仅有更新要素落在基础缓冲区之外:
- Lu = 更新要素外部的总长度。
- Pu(长度百分比)= Lu / 所有更新要素的总长度 * 100。
- LEN_PCT = Pu
- LEN_ABS = Lu
- 如果仅有基础要素落在更新缓冲区之外:
- Lb = 基础要素外部的总长度。
- Pb(长度百分比)= Lb / 所有基础要素的总长度 * 100。
- LEN_PCT = Pb
- LEN_ABS = Lb
- 如果上述两种情况均存在:
- 系统将写入 Lu 和 Lb 中较大者及其相关的百分比值。 如果写入 Lb,系统会由于上述原因而添加负号。
百分比值的范围是 0 到 100,其中 0 表示匹配组中的更新要素和基础要素完全位于更改容差区内;100 表示所有更新要素或基础要素均位于更改容差区外。
LEN_PCT 和 LEN_ABS 值有助于确定更改是否明显。 值越大,更改越明显。 仅向具有空间更改的要素分配这些值;向其他要素分配的值为 -1。
属性更改(更改类型为 A)的检测基于比较字段参数值。 如果在比较字段参数中指定了一对或多对字段,则将比较匹配要素与这些字段,从而确定是否存在属性更改。 文本字符串的比较不区分大小写,这表示 First St 与 first st 被视为相同的文本。 如果匹配的更新要素同时检测到空间更改和属性更改,则分配的更改类型为 SA。 如果匹配的更新要素既未检测到空间更改又未检测到属性更改,则分配的更改类型为 NC。
线方向更改(S_LD 或 SA_LD 更改类型)被视为空间更改,且可作为选项进行检测。
- 如果匹配的更新要素的任意线方向与一个或多个匹配基础要素的方向相反,则无论是否存在上述空间更改,将向该匹配要素分配更改类型 S_LD。 换言之,如果不比较线方向,则上述要素更改类型为 S 或 NC。
- 如果匹配更新要素的任意线方向与一个或多个匹配基础要素的方向相反,则除了上述的属性更改或空间和属性更改外,将向该匹配更新要素分配更改类型 SA_LD。 换言之,如果不比较线方向,则上述要素更改类型为 A 或 SA。
输入范围的并集用作处理范围。 参与源要素与目标要素的计数会在处理消息中报告。
要素匹配精度取决于两个输入的数据质量、复杂程度和相似程度。
在预处理过程中,需要尽可能减少数据错误,并选择相关要素作为输入。 通常情况下,如果某个输入数据集中的要素具有正确的拓扑结构和有效的几何,且本身为单部分而无重复,这将非常有用;否则,可能会出现意外结果。
可在输出要素类中查看检测到的更改。 您可能会发现两个数据源的空间差异过大,并决定对其中一个数据源进行调整,以便两者更好的匹配。 此外,您还可以在更新要素与基础要素之间传递属性。 可以使用合并工具集中的橡皮拉伸和属性传递工具进行更改。
注:
所有输入必须处于同一坐标系。
参数
arcpy.management.DetectFeatureChanges(update_features, base_features, out_feature_class, search_distance, {match_fields}, {out_match_table}, {change_tolerance}, {compare_fields}, {compare_line_direction})
名称 | 说明 | 数据类型 |
update_features | 将线要素与基础要素进行比较。 | Feature Layer |
base_features | 将线要素与更新要素进行比较以检测更改。 | Feature Layer |
out_feature_class | 包含更改信息的输出线要素类。 输出包含所有参与的更新要素(匹配的和不匹配的)以及任何不匹配的基础要素。 | Feature Class |
search_distance | 将用于搜索匹配候选项的距离。 必须指定一个距离,且此距离必须大于零。 可以选择首选单位。 默认为要素单位。 | Linear Unit |
match_fields [[source_field, target_field],...] (可选) | 来自更新要素和基础要素的匹配字段。 如果指定,将比较匹配候选项的每对字段,以帮助确定正确的匹配。 | Value Table |
out_match_table (可选) | 包含完整的要素匹配信息的输出表。 | Table |
change_tolerance (可选) | 用于确定是否存在空间更改的距离。 将所有匹配的更新要素和基础要素与此容差进行比较。 如果更新要素或基础要素有任意部分落在匹配的要素区域之外,则将其视为空间更改。 要执行此过程,该值必须大于输入数据的 XY 容差,并且输出将包含 LEN_PCT 和 LEN_ABS 字段。 默认值为 0,表示不执行此过程。 0 到数据 XY 容差(包括 XY 容差)之间的任何值都将使过程无关紧要,并将被替换为 0。 可以选择单位;默认为要素单位。 | Linear Unit |
compare_fields [[source_field, target_field],...] (可选) |
将用于确定匹配更新要素与基础要素之间是否存在属性更改的字段。 | Value Table |
compare_line_direction (可选) | 指定是否比较匹配要素的线方向。
| Boolean |
代码示例
以下 Python 窗口脚本演示了如何在即时模式下使用 DetectFeatureChanges 函数。
import arcpy
arcpy.env.workspace = "C:/data"
arcpy.DetectFeatureChanges_edit("update_Roads.shp",
"base_Roads.shp", "output_changes.shp"
"25 Feet", #, #, "7.6 Meters",
["rdClass", "roadClass"])
以下独立脚本演示了如何在脚本环境中应用 DetectFeatureChanges 函数。
# Name: DetectFeatureChanges_example_script2.py
# Description: Perform change detection between newly received road data and
# existing road data and find the number of new roads and the
# total length of them.
# 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
updateFeatures = "updateRoads"
baseFeatures = "baseRoads"
dfcOutput = "dfc_out"
search_distance = "300 Feet"
match_fields = "RD_NAME FULLNAME"
statsTable = "new_roads_stats"
# Perform spatial change detection
arcpy.DetectFeatureChanges_management(updateFeatures, baseFeatures, dfcOutput, search_distance, match_fields)
# ====================================================================================
# Note 1: The result of DetectFeatureChanges may contain errors; see tool reference.
# Inspection and editing may be necessary to ensure correct CHANGE_TYPE N, which
# represents un-matched update feautres, before further calculations.
#
# One of the quick ways of checking whether the CHANGE_TYPE N features have
# matching base features is to find their mid-points and use them to search for
# features in base data, as processed below.
# ====================================================================================
# ======== Check update roads with CHANGE_TYPE N for potential match
# Make Feature Layer with selection of CHANGE_TYPE = 'N' (un-matched update features)
arcpy.MakeFeatureLayer_management(dfcOutput, "sel_N_layer", "CHANGE_TYPE = 'N'")
# Get mid-points of the selected features; the mid-points carry all the attributes.
arcpy.FeatureVerticesToPoints_management("sel_N_layer", "in_memory\midPts", "MID")
# Find nearest base features from the mid-points
arcpy.Near_analysis("in_memory\midPts", baseFeatures, "300 Feet")
# ====================================================================================
# Note 2: At this point you can manually inspect the midPts by the NEAR_DIST values;
# the lower the values, the higher chance (not always) a match was missed in the
# dfc process. Delete features from midPts that have found matching base features
# before further process.
# ====================================================================================
# Transfer CHANGE_TYPE values from features of midPts to update features
arcpy.JoinField_management(updateFeatures, "OBJECTID", "in_memory\midPts", "UPDATE_FID", "CHANGE_TYPE")
# Get the count of new roads and the total length; the remaining roads have
# Null values for CHANGE_TYPE.
arcpy.Frequency_analysis(updateFeatures, statsTable, "CHANGE_TYPE", "Shape_Length")