按匹配分割线 (编辑)

摘要

根据匹配关系来分割要素,以获得更好的相应线分割。

在处理两个不同数据集(例如城市道路和州内公路)中的线要素时,匹配关系为一对一 (1:1) 而非多对多 (m:n) 的要素将有助于合并任务,例如从一个源到另一个源的属性传递。 此工具有帮于将 m:n 匹配转换为更多的 1:1 匹配。

输入要素和匹配要素必须通过基于要素匹配的合并工具(如检测要素更改)进行预匹配,并生成一份匹配表。 匹配表中所记录的匹配关系位于源要素和目标要素之间。

该工具将针对每个匹配组,根据匹配要素中的节点条件分割输入要素。 节点可以是某条线的悬挂端、两条线之间的伪节点或多条线的交汇点。 例如,1:2 匹配组表示一个源要素匹配两个目标要素,且这两个目标要素在伪节点处进行连接。 该工具将在目标伪节点附近的位置分割输入线。 此举是为了改善源线和目标线之间的对应关系,使下一轮要素匹配能够生成更多的 1:1 匹配以满足合并需求。

插图

“按匹配分割线”工具图示

使用情况

  • 输出要素类包含所有已分割或未更改的输入要素及其所有属性。 添加了以下字段:

    • ORIG_FID- 输入的要素 ID。
    • SBM_LnFlag- 用于存储以下值:
      • Split - 已分割的线。
      • Not split - 未经更改的输入线。
      • Short match group - 因为不符合最小匹配组长度参数值而无法参与流程的线。

    可以生成一个可选的点要素类,以存储线已被分割或无法分割的位置。 可以使用这些点来检查结果。 该输出包括以下字段:

    • ORIG_FID- 分割位置处的输入要素 ID。
    • SBM_PtFlag- 用于存储以下值:
      • At vertex - 输入线已在现有折点处被分割的位置。
      • At nearest - 输入线已在距匹配要素上节点的最近位置处被分割的位置。
      • Short segment - 输入线不能按照指定的最小分割长度值进行分割的位置。
      • Out of range - 由于候选分割位置超出搜索距离而无法分割输入线的位置。 其中一些位置可仍然用于将分割线作为后期处理。

      经过检查,可能会使用通过在点处分割线工具标记为 Short segmentOut of range 的任何点来分割其他线。

  • 可以使用搜索距离参数来查找用于从匹配要素上的节点分割输入线的候选位置。 为了确保更好地找到靠近匹配要素上节点的分割位置,请根据节点与输入要素的接近程度来派生出内部距离值。 如果派生距离小于搜索距离的三分之一,则将派生距离设置为搜索距离的三分之一。 如果派生距离大于搜索距离,则将派生距离值设置为搜索距离。 其间的任何派生距离值均按原样使用。 指定搜索距离为要使用的最大值。 例如,如果您将 90 米指定为搜索距离,则这一过程中使用的派生距离值将为 30 米、90 米及两者间的任何值。

    设置合适的搜索距离非常重要。 您在预匹配过程中使用的值可能会是不错的选择。 搜索距离越大,使用较远折点分割输入线和找到较远输入节点的可能性越大;这可以防止分割的发生。

  • 内部派生的搜索距离可用于从匹配要素上的节点查找输入要素上的候选位置。 以下规则可用于确定是否应分割输入线,并在应该分割的情况下确定分割位置:

    • 如果伪匹配节点查找到伪输入节点,则不会发生分割。
    • 如果非伪匹配节点查找到任何输入节点,则不会发生分割。 例如,如果悬挂匹配节点在 T 形交汇点处查找到输入节点,则输入线不会被分割。
    • 否则,输入要素将在所查找到的唯一折点或最近折点处被分割;如果找不到折点,则会在输入线上的最近位置处被分割。 但是,如果伪匹配节点查找到非伪输入节点,则将对输入线进行分割。

  • 悬挂线可以使用分割悬挂要素参数进行分割。 如果输入悬挂线超出悬挂端处的匹配要素,则默认情况下该线将被分割。 可以分割悬挂线,以识别后续要素匹配中源要素和目标要素间的真实差异。

  • 可以使用最小匹配组长度参数来排除任何因过短而无法相对于指定值进行分割的匹配组。 在给定匹配组中,如果输入要素的总长度和匹配要素的总长度都小于指定值,则该组将被排除。 避免分割短匹配组中的要素,以防止过度分割或达不到满意的分割效果。 所涉及的一切短匹配组中的输入线都将被写入输出,并在 SBM_LnFlag 字段中采用 Short match group 进行标记。

  • 可以使用最小分割长度参数来防止生成短线。 如果分割输入线会导致某线比此值更短,则输入线将不会被分割。 SBM_PtFlag 字段中由 Short segment 标记的分割位置处的点将被写入点要素类(如指定),作为检查的参考。

  • 可以使用分割字段参数来指定一个或多个数值字段(例如测量长度的字段),以根据分割线的比例分割其值。

参数

标注说明数据类型
输入要素

将进行分割的输入线要素。 必须用匹配要素对其进行预匹配。

Feature Layer
匹配要素

已与输入要素进行预匹配的要素。 匹配要素可作为分割输入要素时的参考使用。

Feature Layer
输入匹配表

包含输入和匹配要素间匹配信息的表格。

Table View
输出要素类

包含分割线以及未分割的原始线的输出要素类。

Feature Class
搜索距离

将用于确定分割位置的距离值。 该值必须大于 0。 如果未指定单位,则将沿用输入的单位。

Linear Unit
在匹配中输入要素
(可选)

用于指定匹配表中的输入要素是源要素还是目标要素,以便分割正确的要素。

  • 作为源要素输入要素作为源要素存储在匹配表中。 这是默认设置。
  • 作为目标要素输入要素作为目标要素存储在匹配表中。
String
输出分割点
(可选)

包含表示分割位置的点的输出点要素类。

Feature Class
分割悬挂要素
(可选)

用于指定是否将分割悬挂线。

  • 选中 - 将按照工具的分割规则分割悬挂线。 这是默认设置。
  • 未选中 - 将不会分割悬挂线。
Boolean
最小匹配组长度
(可选)

匹配组的最小长度。 如果输入要素的总长度或匹配要素的总长度大于提供的值,则给定匹配组将只参与分割过程。

Linear Unit
最小分割长度
(可选)

分割片的最小长度。 如果分割会导致一个或两个分割段短于提供的值,则分割不会发生。

Linear Unit
分割字段
(可选)

来自输入要素的数值字段的列表。 其字段值将基于分割线的比例。

Field

arcpy.management.SplitLineByMatch(in_features, matched_features, in_match_table, out_feature_class, search_distance, {in_features_as}, {out_point_feature_class}, {split_dangle}, {min_match_group_length}, {min_split_length}, {split_fields})
名称说明数据类型
in_features

将进行分割的输入线要素。 必须用匹配要素对其进行预匹配。

Feature Layer
matched_features

已与输入要素进行预匹配的要素。 匹配要素可作为分割输入要素时的参考使用。

Feature Layer
in_match_table

包含输入和匹配要素间匹配信息的表格。

Table View
out_feature_class

包含分割线以及未分割的原始线的输出要素类。

Feature Class
search_distance

将用于确定分割位置的距离值。 该值必须大于 0。 如果未指定单位,则将沿用输入的单位。

Linear Unit
in_features_as
(可选)

用于指定匹配表中的输入要素是源要素还是目标要素,以便分割正确的要素。

  • AS_SOURCE输入要素作为源要素存储在匹配表中。 这是默认设置。
  • AS_TARGET输入要素作为目标要素存储在匹配表中。
String
out_point_feature_class
(可选)

包含表示分割位置的点的输出点要素类。

Feature Class
split_dangle
(可选)

用于指定是否将分割悬挂线。

  • SPLIT_DANGLE将按照工具的分割规则分割悬挂线。 这是默认设置。
  • NO_SPLIT_DANGLE将不会分割悬挂线。
Boolean
min_match_group_length
(可选)

匹配组的最小长度。 如果输入要素的总长度或匹配要素的总长度大于提供的值,则给定匹配组将只参与分割过程。

Linear Unit
min_split_length
(可选)

分割片的最小长度。 如果分割会导致一个或两个分割段短于提供的值,则分割不会发生。

Linear Unit
split_fields
[split_field,...]
(可选)

来自输入要素的数值字段的列表。 其字段值将基于分割线的比例。

Field

代码示例

SplitLineByMatch 示例 1(Python 窗口)

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

import arcpy
arcpy.env.workspace = "C:/data/roads.gdb"
arcpy.edit.SplitLineByMatch("city_Roads", "county_Roads", "match_table",
                            "city_roads_split", "50 Meters")
SplitLineByMatch 示例 2(独立脚本)

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

"""
Name:        SplitLineByMatch_example_script2.py
Description: Use DetectFeatureChanges to get initial matching and then use
             SplitLineByMatch to split the source and target to improve spatial
             correspondence. 
             Finally use TransferAttributes to transfer a field value from the
             split source to the split target features.
"""

# Import system modules
import arcpy

# Set environment settings
arcpy.env.overwriteOutput = True
arcpy.env.workspace = r"D:\conflation\Tools\splitlinebym\roads.gdb"

# Set local variables
sourceFeatures = "sourceRoads"
targetFeatures = "targetRoads"

dfcOutput = "DFC"
searchDistance = "100 Feet"
dfcMatchTable = "DFC_mtable"

slbmSourceOutput = "out_source"
slbmSourceOutputPts = "out_sourcePoints"
slbmTargetOutput = "out_target"
slbmTargetOutputPts = "out_targetPoints"
dangle = "SPLIT_DANGLE"
minSplitLength = "300 Feet"

transfer_fields = "Mile_Length"

# Use Detect Feature Changes tool to generate the needed match table
arcpy.management.DetectFeatureChanges(sourceFeatures, targetFeatures, dfcOutput, searchDistance, dfcMatchTable)

# Use Split Line By Match tool twice to split source and then target features to improve spatial correspondence
arcpy.edit.SplitLineByMatch(sourceFeatures, targetFeatures, dfcMatchTable, slbmSourceOutput, searchDistance,
                            "AS_SOURCE", slbmSourceOutputPts, dangle, "", minSplitLength)

arcpy.edit.SplitLineByMatch(targetFeatures, sourceFeatures, dfcMatchTable, slbmTargetOutput, searchDistance,
                            "AS_TARGET", slbmTargetOutputPts, dangle, "", minSplitLength)

# Perform attribute transfer using the split results
arcpy.edit.TransferAttributes(slbmSourceOutput, slbmTargetOutput, transfer_fields, searchDistance)