접하는 선과 교차하는 선을 구별합니까?


9

ArcGIS 10에서 이러한 사례를 어떻게 구별합니까?

  • 사례 1 : 선의 두 끝 점이 다른 선에 닿음
  • 사례 2 : 두 끝 점이 교차하는 선에 매달려 있습니다.

내가보고 있어요 트림 라인 기능을하지만 내가 (파괴) 원하는 아니다.

실제 사용 사례는 고속도로의 두 도로를 연결하는 서비스 도로와 고속도로와 교차하는 다른 도로를 구별하는 것입니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

답변:


13

한 번에 하나의 기능에 대해 일반 온라인 위치 선택 대화 상자를 사용하여 다음과 같은 키를 사용하여 온라인 오버레이의 공간 관계 유형에 대한 지침으로 선택할 수 있습니다 (위치 별 선택 : 그래픽 예제 ).

영상
(출처 : arcgis.com )

선을 사용하여 선을 선택하십시오

INTERSECT 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

한 가지 의견 : 필드 이름 길이를 10 자 미만으로 줄여야했습니다 (아마도 레이어 소스가 shapefile이기 때문에).
mvexel

이 답변의 시작 부분에서 잃어버린 ArcGIS 문서 이미지에 대한 URL이있는 것 같습니다.
PolyGeo

@PolyGeo 어느 쪽? 나에게 잘 보인다.
blah238

그것은 이상하다, 첫번째 그림 (4 번째 줄에 관한 것)은 어제 작은 십자가로 보여지고 있었다. 오늘은 괜찮아 보입니다. 필자가 자주 사용하는 iOS 클라이언트가 아니라 브라우저 (지금 사용하고있는)에서 본 것 같습니다.
PolyGeo


-1

피처 레이어를 복사하고 선을 트리밍 한 다음 트리밍 된 피처 세트를 원본과 비교하여 변경된 피처를 찾으면 어떻습니까? 예쁘지 않지만 거의 확실하게 Python을 사용해야하지만 작동해야합니다.


-1

네트워크의 노드를 추출 할 수도 있습니다. 1의 경우 원자가가 4 인 각각 2 개의 노드를 얻게됩니다. 2의 경우 노드가 없습니다.


ArcGIS에서이 작업을 수행하는 방법을 제안 할 수 있습니까?
blah238

누군가의 스크립트 또는 도구를 사용하여 from 및 node 인 폴리 라인에 고유 한 ID를 추가 할 수 있습니다. 나는 archydro가 그것을 알고 있지만 그것을하는 arcscripts 웹 사이트에 스크립트가 있음을 확신합니다. 그런 다음 비 프로그래밍 방식으로 시작 필드와 끝 노드 필드에서 빈도 도구를 실행하여 합산하면 노드 원자가를 제공하여 노드를 나타내는 포인트 레이어에 다시 결합 할 수 있습니다.
Hornbydd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.