区分与接触线相交的线?


9

如何在ArcGIS 10中区分这些情况?

  • 情况1:一条线的两个端点都碰到另一条线
  • 情况2:两个端点都悬在其相交的线上

我正在看修剪线功能,但这不是我想要的(破坏性的)。

现实中的用例是区分连接高速公路的两条道路的服务道路和与高速公路相交的道路的其他情况。

在此处输入图片说明 在此处输入图片说明

Answers:


13

对于一次单个功能,您可以使用普通的“ 按位置选择”对话框轻松交互地进行此操作,并使用以下键作为线对线叠加的空间关系类型的指南(来自“ 按位置选择:图形示例”):

图片
(来源:arcgis.com

使用线选择线

交点A,C,D,E,F,G,H,I,J

包含G,H

COMPLETELY_CONTAINS G

CONTAINS_CLEMENTINI G,H

在F,H之内

COMPLETELY_WITHIN F

WITHIN_CLEMENTINI F,H

ARE_IDENTICAL_TO H

BOUNDARY_TOUCHES C,E

在这种情况下,相关的关系类型为INTERSECTBOUNDARY_TOUCHES。从上图可以看到,您可以用于BOUNDARY_TOUCHES选择接触线端点的要素。如果恰好选择了两个功能,则您的情况为1。如果某个功能没有被任何其他功能触及,只是被它们相交,BOUNDARY_TOUCHES则将什么也不会选择。INTERSECT将选择所有相交的要素,无论它们是否接触端点。因此,如果您知道没有任何特征与端点相关,但是发现有特征相交,则说明案例2。

要使过程自动化,您可以使用以下Python脚本(如果需要,可以实现为脚本工具)来计算要素类或图层中每个要素的接触和相交的数量:

import arcpy

################################ Configuration #################################
numTouchesField = "NUM_TOUCHES"
numIntersectionsField = "NUM_INTERSECTIONS"
################################################################################

def countTouches(layer, feature):
    """Returns the number of times the boundary of a feature touches other
    features in the same feature layer."""
    return countSpatialRelation(layer, feature, "BOUNDARY_TOUCHES")

def countIntersections(layer, feature):
    """Returns the number of times a feature intersects other features in the
    same feature layer."""
    return countSpatialRelation(layer, feature, "INTERSECT") - 1 # Subtract 1 because the feature will always intersect its clone in the feature layer

def countSpatialRelation(layer, feature, relation):
    """Returns the number of times a feature meets the specified spatial
    relationship with other features in the same feature layer."""
    arcpy.SelectLayerByLocation_management(layer, relation, feature)
    count = int(arcpy.GetCount_management(layer).getOutput(0))
    return count

def addField(table, fieldName, fieldType):
    """Adds a fields of the given name and type to a table, unless a field with
    the same name already exists."""
    desc = arcpy.Describe(table)
    fieldInfo = desc.fieldInfo
    fieldIndex = fieldInfo.findFieldByName(fieldName)
    if fieldIndex == -1:
        # Field does not exist, add it
        arcpy.AddField_management(table, fieldName, fieldType)

def countTouchesAndIntersections(layer):
    """Adds and populates fields describing the number of times each feature
    touches and intersects other features in the feature layer."""
    addField(layer, numTouchesField, "LONG")
    addField(layer, numIntersectionsField, "LONG")
    desc = arcpy.Describe(layer)
    shapeField = desc.shapeFieldName
    rows = arcpy.UpdateCursor(layer)
    for row in rows:
        feature = row.getValue(shapeField)
        row.setValue(numTouchesField, countTouches(layer, feature))
        row.setValue(numIntersectionsField, countIntersections(layer, feature))
        rows.updateRow(row)
    del row, rows

if __name__ == "__main__":
    layer = arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0))
    countTouchesAndIntersections(layer)

一旦运行,您就可以轻松查询两次精确接触且两次相交的要素(案例1),以及一次触摸0次并且恰好相交两次的要素(案例2)。

定义查询示例:

  • 情况1(触摸两次,相交两次):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • 情况2(无接触,相交两次):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

请参见下面的屏幕快照,以了解找到的两种情况的实例: ArcMap屏幕截图,显示了各种线相交/接触关系

请注意,使用现实世界的数据时,通常情况下,路段会在交叉路口处分解,并且只有当道路相互交叉时,如在立交桥或桥梁处,才会出现悬挂。因此,通常您具有与触摸相交的相同数量的要素。

对于更一般的情况,您可能希望通过检查是否悬垂来查找"NUM_INTERSECTIONS" > "NUM_TOUCHES"


感谢详尽的回答。我在将其转换为脚本工具时遇到了一些麻烦(尝试选择图层时会冻结),但是我相信这种方法是有效的。
mvexel 2012年

还有一个评论:我不得不将字段名称的长度减少到少于10个字符(可能是因为图层源是shapefile)。
mvexel 2012年

在此答案的开头,似乎有一个指向ArcGIS文档图像的URL误入歧途。
PolyGeo

@PolyGeo哪一个?对我来说似乎很好。
blah238 '16

太奇怪了,第一张图片(大约在第四行)昨天显示为一个小十字架。今天看起来不错。我想是在浏览器(我现在正在使用)中看到的,而不是我经常使用的iOS客户端。
PolyGeo


-1

如何复制要素图层,修剪线条,然后将修剪的要素集与原始特征进行比较以查找已更改的要素?不漂亮,几乎可以肯定需要使用Python,但看起来应该可以使用。


-1

您还可以提取网络的节点。在情况1中,您将获得2个节点,每个节点的化合价为4。在情况2中,没有节点。


您可以建议如何在ArcGIS中执行此操作吗?
blah238

您可以使用某人的脚本或工具将唯一的ID添加到折线中,作为起点和终点。我知道archydro可以这样做,但是我肯定arcscripts网站上有脚本可以做到这一点。然后,可以通过非编程方式在from字段上运行频率工具,然后在to node字段上运行频率工具并对它们求和,这将为您提供节点价,您可以将其重新连接到代表节点的点层。
Hornbydd 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.