@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)