摘要
查找更新线要素与基本线要素在空间上匹配的位置,并检测空间更改、属性更改或同时检测这两种更改以及无更改的情况,并创建一个包含匹配的更新要素及其更改信息、不匹配的更新要素和不匹配的基础要素的输出要素类。
插图
用法
此工具的典型应用是维护一组线要素(如道路),并定期接收来自合作伙伴的更新内容作为一组新道路要素。您需要了解哪些更新的要素是对现有基础要素的更改或是待添加的新要素,以及哪些基础要素是应删除的旧要素。此工具用于查找更新的线数据集与基础线数据集之间的匹配要素,检测空间更改、属性更改或同时检测这两种更改以及无更改的情况,同时创建含要素更改信息的输出要素类。
输出要素类包含所有参与的更新要素(匹配的和不匹配的)以及任何不匹配的基础要素。检测到的更改的相关信息将写入以下字段:
- UPDATE_FID - 更新要素的要素 ID。不匹配的基础要素的值为 -1。
- BASE_FID - 基础要素的要素 ID。不匹配的更新要素的值为 -1。
- CHANGE_TYPE - 检测到的更改类型如下:
- S 代表空间,表示空间发生更改的匹配更新要素。
- A 代表属性,表示属性发生更改的匹配更新要素。
- SA 代表空间和属性,表示空间和属性均发生更改的匹配更新要素。
- NC 代表无更改,表示未发生任何更改的匹配更新要素。
- N 代表新要素,表示新加入基础数据的不匹配更新要素。
- D 代表删除,表示可能需要从基础数据中删除的不匹配基础要素。
要素匹配过程首先基于搜索距离和可选的匹配字段。可生成输出匹配表来存储匹配信息。
搜索距离参数用于查找匹配候选项。使用足以获取相应要素间大多数偏移的距离,但是距离不可过大,以防止出现对过多候选项的不必要处理并避免得出错误匹配的潜在风险。
发现匹配候选项后,再通过一组几何测量手段对这些匹配候选项做进一步评估,以确定它们的相似程度是否足以被视为空间匹配。
如果在匹配字段参数中指定了一对或多对字段,则将根据这些字段值来检查空间匹配候选项,从而帮助确定正确的匹配。例如,假设更新要素与基础要素均具有包含街道名称的 STREET_NAME 字段。如果更新要素与两个基础要素在空间上匹配,但只有其中一个基础要素的 STREET_NAME 值与更新要素的相同,则此基础要素为更好的匹配项。文本字符串的比较不区分大小写,这表示 First St 与 first st 被视为相同的文本。
输出匹配表为可选项。此匹配表可提供完整的要素匹配信息,其中包括源 FID 与目标 FID、匹配组、匹配关系以及从空间和属性匹配条件中获取的匹配置信度级别。此信息能够帮助您了解匹配情况,并有助于进行后检查、后编辑和进一步分析。有关详细信息,请参阅关于要素匹配与匹配表。
在输出匹配表中,SRC_FID 字段和 TGT_FID 字段中的值分别表示更新要素 ID 和基础要素 ID。
识别更改过程发生在要素匹配过程之后。所有匹配的更新要素的空间条件与属性条件都需要与对应的基础要素进行比较,以便确定其 CHANGE_TYPE 值。
出现以下一种或两种情况时,将检测到空间更改(更改类型为 S):
- 匹配的更新要素与对应的基础要素存在拓扑差异,例如,一个更新要素与两个基础要素匹配。
- 更新要素或基础要素的一部分在“更改容差”之外。
更改容差用作更新要素和基础要素周围缓冲区的宽度。将根据此容差检查所有匹配的更新要素和基础要素。如果更新要素有任何部分落在匹配的基础要素周围区域以外,或者基础要素有任何部分落在匹配的更新要素周围区域以外,则将其视为空间更改。如果指定的值大于 0,则输出将包含其他两个字段:
- LEN_PCT - 此字段用于存储百分比值,该值是更新要素或基础要素超出更改容差区部分的长度与要素整个长度的比值。值为 0 时表示更新要素或基础要素完全位于更改容差区内;值为 100 时表示整个更新要素或基础要素均位于更改容差区外。
- LEN_ABS - 此字段用于存储以要素单位计量的长度值,该值表示更新要素或基础要素超出更改容差范围部分的绝对长度。
属性更改(更改类型为 A)的检测基于“比较字段”(如果已指定)。
如果在比较字段参数中指定了一对或多对字段,则将根据这些字段来检查匹配要素,从而确定是否存在属性更改。文本字符串的比较不区分大小写,这表示 First St 与 first st 被视为相同的文本。
如果匹配的更新要素同时检测到空间更改和属性更改,则获得的更改类型为 SA。如果匹配的更新要素既未检测到空间更改又未检测到属性更改,则获得的更改类型为 NC。
输入范围的并集用作处理范围。参与源要素与目标要素的计数会在处理消息中报告。
要素匹配精度主要取决于两项输入的数据质量、复杂度和相似度。
在预处理过程中,您需要尽可能减少数据错误,并选择相关要素作为输入。通常情况下,如果某个输入数据集内的要素具有正确的拓扑结构和有效的几何,且本身为单部件而无重复,这将非常有用;否则可能会出现意外结果。
可在输出要素类中查看检测到的更改。您可能会发现两个数据源的空间差异过大,并决定对其中一个数据源进行调整,以便两者更好的匹配。此外,您可能还希望在更新要素与基础要素之间传递属性。可以利用合并工具集中的橡皮拉伸和属性传递工具进行更改。
语法
DetectFeatureChanges_management (update_features, base_features, out_feature_class, search_distance, {match_fields}, {out_match_table}, {change_tolerance}, {compare_fields})
参数 | 说明 | 数据类型 |
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 (可选) | 用于确定是否存在空间更改的距离。将根据此容差检查所有匹配的更新要素和基础要素。如果更新要素或基础要素有任意部分落在匹配的要素区域之外,则考虑空间更改。距离可以等于或大于零。默认值为 0。当值大于零时,输出中将包括 LEN_PCT 和 LEN_ABS 字段。可以选择首选单位;默认为要素单位。 | Linear unit |
compare_fields [[source_field, target_field],...] (可选) |
用于确定匹配更新要素与基础要素之间是否存在属性更改的字段。 | Value Table |
代码实例
DetectFeatureChanges 示例 1(Python 窗口)
以下 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 Meterd",
["rdClass", "roadClass"])
DetectFeatureChanges 示例 2(独立 Python 脚本)
以下独立脚本用于说明如何在脚本环境中应用 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")