폴리 라인의 각 시작 및 끝 속성에 점 ID를 할당 하시겠습니까?


9

Point와 Polyline이라는 두 개의 shapefile이 있습니다. 폴리 라인 레이어를 선이 끝나는 지점에서 시작하는 포인트 데이터 ID (systemID)로 채우려 고합니다. 예. 두 개의 열을 작성합니다 (시작 및 종료). 라인에는 이미 흐름 방향이 지정되어 있습니다. ArcHydro 도구를 사용하고 있지만 Arcpy도 좋습니다.

ArcHydro에서 속성 도구> From From / To Nodes를 선으로 사용하려고 시도했지만 내 포인트 데이터가 아닌 To 및 From 값을 만듭니다. 다른 대안은 Feature to Vertices를 사용하고 결과를 내 포인트 데이터 테이블에 조인하여 systemID를 얻는 것입니다. 그러나 폴리 라인 레이어도 업데이트해야합니다. 더 쉬운 방법이 있다고 확신합니다.

참고 : 모든 선에 꼭짓점에 점이있는 것은 아니며 빈 값이 적합합니다.


따라서 포인트에는 FNode로 이동해야하는 'systemID'필드가 있고, 폴리 라인의 TNode 필드는 ... 맞습니까?
Michael Stimson

여기 어딘가에 이런 질문이 있습니다. 기본적으로 선에서 점으로 시작하여 별도의 피처 클래스로 끝나고 포인트 데이터와 두 개를 교차하여 ID를 얻은 다음 선을 사용하여 선으로 다시 공간 결합합니다. 올바른 시작 또는 끝 필드에 ID를 할당하고 필드를 계산할 수 있습니다. 나는 지금 그것을 찾을 수없는 것 같습니다. 이것 에 대해 파고있는 동안 그것을 발견했다 .
Chris W

: 여기있다 gis.stackexchange.com/questions/85082는 그리고 포인트하지 라인 포인트 또는 기능에 대한 기능 정점이었다. 질문 끝에 언급 한 내용과 거의 같습니다.
Chris W

@ChrisW, FelixIP 의 답변이 정말 좋습니다. 두 개의 속성 조인입니다.
Michael Stimson

답변:


12

때로는 기본 솔루션을 사용하지 않는 것이 좋습니다. 이것이 내가 제안하는 이유

  1. 노드 계층에서 X 및 Y 필드를 채우고 cm와 같은 정수로 변환하십시오. 문자열 필드를 작성하고 정수의 문자열 표현을 연결하여 채 웁니다.
  2. 모양의 첫 번째 점에 대한 링크 테이블에서 비슷한 작업을 수행하십시오.
  3. 최신 작성된 필드를 사용하여 링크에 노드 테이블을 결합하고 nodeID를 FROM 필드로 전송하십시오.

2로 이동하지만 마지막 포인트를 사용하여 TO nodeID를 지정하십시오.


좋아요! 같은 필드 계산 뭔가 STR (라운드 (! 모양! .firstPoint.X, 3)) + ","+ STR (라운드 (! 모양! .firstPoint.Y, 3)) 노드에 대한 (파이썬 파서) STR (라운드 노드에 대한 (! Shape! .lastPoint.X, 3)) + ","+ str (round (! Shape! .lastPoint.Y, 3)) 다음 점 (텍스트)과 비슷하게 결합한 다음 연결합니다. 고통없이 탁월한 공간 결합 방법 펠릭스! 지리 데이터의 유효 자릿수 (예 : 7 또는 8)로 반올림합니다.
Michael Stimson

물론 스크립팅 환경에서도 매우 빠릅니다. 물론 사전은 느린 테이블 조인을 대체합니다.
FelixIP

미터 단위로 투사 될 경우 Int (X * 100). 대체로 Michael의 코드
FelixIP를

위에 링크 된 질문의 방법보다 훨씬 간단합니다. 더 적은 단계, 더 적은 도구 및 라이센스 수준 제한이 없습니다. 공간 조인을 일반 속성 조인으로 바꾸는 흥미로운 아이디어.
Chris W

1

몇 달 전에 똑같은 일을했습니다. 나는 arcpy를 사용했지만 스크립트가 너무 길어서 여기에 게시 할 수 없으므로 내가 한 일에 대한 개요를 제공 할 것입니다.

  1. 공간 조인을 사용하여 특정 선 피쳐 내에있는 포인트 / 노드를 감지했습니다.

  2. 공간 결합은 흐름 방향을 고려하지 않기 때문에 arcpy를 사용하여 시작 지점과 종료 지점을 확인했습니다. arcpy describe 함수를 사용하여 선 피처의 시작 / 끝 정점에 대한 좌표 정보를 추출하고 연결된 점의 좌표 값과 비교 하여이 작업을 수행 할 수있었습니다 .

  3. 마지막으로, 출발점 / 점 중 어느 지점이 원래 폴리 라인 데이터 세트의 도착 / 발신 필드를 채우기 위해 setValue 함수를 사용했는지 알아 냈습니다.

분명히 이것보다 조금 더 있지만, 요점을 간략히 설명했습니다.


내 기하학적 네트워크에서 흐름 방향은 기본 방향 중 하나 일 수 있습니다. 흐름 방향 래스터 또는 이와 동등한 것을 사용하지 않는 한 원시 좌표 비교에서 흐름 방향을 확인할 수 없었습니다. 때로는 파이프가 자연적인 윤곽선에 대해 경사 지거나 물이 오르막으로 펌핑되기 때문에 문제가 될 수 있습니다. 흐름 방향이 올바른지 어떻게 확신 할 수 있습니까?
Priscilla

1

@FelixIP에서 영감을 얻었지만 400K + 파이프와 500K + 노드로 네트워크가 상당히 커서 조인이나 추가 파일을 만들지 않고 솔루션을 작성하고 싶었습니다.

기하학적 네트워크 빌드는 노드와 파이프 끝의 X, Y가 일치하도록 강제합니다. arcpy 커서의 모양 토큰으로 이러한 위치에 액세스하여 일치시킬 수 있습니다. 선의 모양 토큰은 정점의 배열을 그려지는 순서대로 반환합니다. 내 네트워크에서 파이프의 그리기 순서는 흐름 방향을 설정하는 데 사용하기 때문에 QA가 많이 발생합니다. 따라서 첫 번째 정점은 파이프의 시작이고 마지막 정점은 파이프의 끝입니다.

참조 : ASSETID = 파이프 ID, UNITID = 파이프 시작시 노드 ID, UNITID2 = 파이프 끝에서 노드 ID

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["UNITID", "SHAPE@XY"]):
    nodeDict[(node[1][0], node[1][1])] = node[0]

#populate pipe dictionary with pipe ID as the key and list of X,Y as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

이것은 내가하는 일의 90 %이지만 노드 사전이 이미 사용 가능하기 때문에 파이프를 두 번 거치지 않습니다.
FelixIP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.