Ich war von @FelixIP inspiriert, wollte aber eine Lösung ohne Joins oder die Erstellung zusätzlicher Dateien schreiben, da mein Netzwerk mit 400K + Pipes und 500K + Knoten ziemlich groß ist.
Der geometrische Netzwerkaufbau erzwingt, dass X, Y der Knoten und der Rohrenden zusammenfallen. Sie können auf diese Positionen mit den Form-Token in bogenförmigen Cursorn zugreifen und sie abgleichen. Die Form-Token für Linien geben ein Array der Scheitelpunkte in der Reihenfolge zurück, in der sie gezeichnet wurden. In meinem Netzwerk ist die Ziehreihenfolge der Rohre stark von der Qualitätssicherung abhängig, da wir hiermit die Durchflussrichtungen festlegen. Der erste Scheitelpunkt ist also der Anfang der Pipe, und der letzte Scheitelpunkt ist das Ende der Pipe.
Referenz: ASSETID = ID der Pipe, UNITID = Knoten-ID am Anfang der Pipe, UNITID2 = Knoten-ID am Ende der Pipe.
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)