Saya terinspirasi oleh @FelixIP, tetapi saya ingin menulis solusi tanpa bergabung atau membuat file tambahan, karena jaringan saya cukup besar dengan 400K + pipa dan 500K + node.
Membangun jaringan geometrik memaksa X, Y dari node dan ujung pipa menjadi bertepatan. Anda dapat mengakses lokasi ini dengan token bentuk dalam kursor busur dan mencocokkannya. Token bentuk untuk garis mengembalikan array simpul sesuai urutan penggambarannya. Di jaringan saya, urutan undian pipa sangat QA'd karena kami menggunakan ini untuk mengatur arah aliran. Jadi, simpul pertama adalah awal pipa, dan simpul terakhir adalah ujung pipa.
Referensi: ASSETID = id pipa, UNITID = simpul id di awal pipa, UNITID2 = simpul id di ujung pipa.
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)