ฉันได้รับแรงบันดาลใจจาก @FelixIP แต่ฉันต้องการเขียนวิธีแก้ปัญหาโดยไม่ต้องเข้าร่วมหรือสร้างไฟล์พิเศษเนื่องจากเครือข่ายของฉันมีขนาดใหญ่ที่มีท่อ 400K + และโหนด 500K +
การสร้างเครือข่ายทางเรขาคณิตบังคับให้ X, Y ของโหนดและไพพ์สิ้นสุดลงด้วยกัน คุณสามารถเข้าถึงตำแหน่งเหล่านี้ด้วยโทเค็นรูปร่างในเคอร์เซอร์ arcpy และจับคู่ โทเค็นรูปร่างของเส้นคืนอาร์เรย์ของจุดยอดตามลำดับที่ถูกวาด ในเครือข่ายของฉันลำดับการดึงของท่อนั้นมีคุณภาพมากเนื่องจากเราใช้สิ่งนี้เพื่อกำหนดทิศทางการไหล ดังนั้นจุดยอดแรกคือจุดเริ่มต้นของท่อและจุดสุดยอดสุดท้ายคือจุดสิ้นสุดของท่อ
การอ้างอิง: ASSETID = id ของไพพ์, UNITID = โหนดไอดีที่จุดเริ่มต้นของไพพ์, UNITID2 = โหนดไอดีที่จุดสิ้นสุดของไพพ์
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)