@FelixIP'den ilham aldım, ancak ağım 400K + borular ve 500K + düğümlerle oldukça büyük olduğundan, birleştirmeden veya fazladan dosya oluşturmadan bir çözüm yazmak istedim.
Geometrik ağ yapısı, düğümlerin X, Y ve boru uçlarını çakışmaya zorlar. Bu konumlara kavisli imleçlerdeki şekil belirteçleriyle erişebilir ve onları eşleştirebilirsiniz. Çizgiler için şekil belirteçleri, bir dizi köşeyi çizildikleri sırayla döndürür. Ağımda, boruların çekilme sırası büyük ölçüde KG oldu çünkü bunu akış yönlerini ayarlamak için kullanıyoruz. Böylece, ilk köşe borunun başlangıcıdır ve son köşe borunun sonu.
Referans: ASSETID = borunun kimliği, UNITID = borunun başlangıcındaki düğüm kimliği, UNITID2 = borunun ucundaki düğüm kimliği.
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)