按匹配分割线 (编辑)

描述

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

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

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

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

插图

按匹配分割线图示

使用方法

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

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

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

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

      经过检查,可能会使用通过在点处分割线工具标记为短线段或超出范围的任何点来分割其他线。

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

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

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

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

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

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

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

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

语法

arcpy.edit.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.SplitLineByMatch_edit("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.
# Author:      Esri
# -----------------------------------------------------------------------

# Import system modules
import arcpy
from arcpy import env

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

try:
    # 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"

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

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

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

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

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

许可信息

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

相关主题