मैं @FelixIP से प्रेरित था, लेकिन मैं बिना किसी जोड़ या अतिरिक्त फ़ाइलों के निर्माण के लिए एक समाधान लिखना चाहता था, क्योंकि मेरा नेटवर्क 400K + पाइप और 500K + नोड्स के साथ काफी बड़ा है।
ज्यामितीय नेटवर्क का निर्माण नोड्स के एक्स, वाई को मजबूर करता है और पाइप संयोग से समाप्त होता है। आप इन स्थानों को चाप वाले कर्सर में आकार टोकन के साथ एक्सेस कर सकते हैं और उनका मिलान कर सकते हैं। रेखाओं के आकार का टोकन उस क्रम में शीर्ष रेखाओं की एक सरणी लौटाता है जिसे वे खींचे गए थे। मेरे नेटवर्क में, पाइप का ड्रॉ ऑर्डर भारी मात्रा में QA'd है क्योंकि हम इसका उपयोग फ्लो दिशाओं को सेट करने के लिए करते हैं। तो, पहला शीर्ष पाइप की शुरुआत है, और अंतिम शीर्ष पाइप का अंत है।
संदर्भ: पाइप के शुरू में ASSETID = आईडी की पाइप, 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)