আমি @ ফেলিক্সআইপি দ্বারা অনুপ্রাণিত হয়েছি, তবে আমি যোগদান বা অতিরিক্ত ফাইল তৈরি না করেই একটি সমাধান লিখতে চেয়েছিলাম, যেহেতু আমার নেটওয়ার্ক 400K + পাইপ এবং 500 কে + নোডের সাথে বেশ বড়।
জ্যামিতিক নেটওয়ার্ক বিল্ড নোডগুলির এক্স, ওয়াই এবং পাইপের সমাপ্তি ঘটায় forces আপনি আরকিপি কার্সারে আকৃতি টোকেন সহ এই অবস্থানগুলি অ্যাক্সেস করতে এবং সেগুলি মেলতে পারেন। রেখাগুলির জন্য আকৃতি টোকেনগুলি যেভাবে অঙ্কিত হয়েছিল সেভাবে অনুভূমিকগুলির একটি অ্যারে প্রদান করে। আমার নেটওয়ার্কে পাইপগুলির অঙ্কনের ক্রমটি খুব বেশি 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)