मूल सेट:
इसके छद्म प्रति (TOT में CNTRL- ड्रैग) बनाएँ और क्लोन के साथ एक से कई में स्थानिक जोड़ दें। इस मामले में मैंने 500 मीटर की दूरी तय की। आउटपुट तालिका:
इस तालिका से रिकॉर्ड निकालें जहां PAR_ID = PAR_ID_1 - आसान है।
तालिका के माध्यम से अलग करें और रिकॉर्ड (PAR_ID, PAR_ID_1) = (PAR_ID_1, PAR_ID) को इसके ऊपर के रिकॉर्ड को हटा दें। इतना आसान नहीं है, acrpy का उपयोग करें।
कैचमेंट सेंट्रोइड्स की गणना करें (UniqID = PAR_ID)। वे नोड या नेटवर्क हैं। स्थानिक जॉइन टेबल का उपयोग करके उन्हें लाइनों से कनेक्ट करें। यह अलग विषय है जो इस मंच पर कहीं न कहीं शामिल है।
नीचे दी गई स्क्रिप्ट मानती है कि नोड्स टेबल इस प्रकार है:
जहां MUID पार्सल से आया था, P2013 संक्षेप में प्रस्तुत करने का क्षेत्र है। इस मामले में = 1 केवल गिनती के लिए। [rcvnode] - समूह आईडी / समूह में पहले नोड के समूह आईडी के बराबर नोड स्टोर करने के लिए स्क्रिप्ट आउटपुट।
महत्वपूर्ण क्षेत्रों के साथ लिंक टेबल संरचना पर प्रकाश डाला गया
टाइम्स लिंक / एज वजन, यानी नोड से नोड की यात्रा की लागत। इस मामले में बराबर 1 है ताकि सभी पड़ोसियों की यात्रा की लागत समान हो। [Fi] और [ti] जुड़े हुए नोड्स की क्रमिक संख्या हैं। इस तालिका को पॉप्युलेट करने के लिए इस फ़ोरम को लिंक करने के लिए और नोड्स से कैसे असाइन करें।
स्क्रिप्ट मेरे अपने कार्यक्षेत्र mxd के लिए अनुकूलित। खेतों और स्रोतों के अपने नामकरण के साथ संशोधित, हार्डकोड किया गया है:
import arcpy, traceback, os, sys,time
import itertools as itt
scriptsPath=os.path.dirname(os.path.realpath(__file__))
os.chdir(scriptsPath)
import COMMON
sys.path.append(r'C:\Users\felix_pertziger\AppData\Roaming\Python\Python27\site-packages')
import networkx as nx
RATIO = int(arcpy.GetParameterAsText(0))
try:
def showPyMessage():
arcpy.AddMessage(str(time.ctime()) + " - " + message)
mxd = arcpy.mapping.MapDocument("CURRENT")
theT=COMMON.getTable(mxd)
खोज नोड्स लाइनर
theNodesLayer = COMMON.getInfoFromTable(theT,1)
theNodesLayer = COMMON.isLayerExist(mxd,theNodesLayer)
लिंक लिंक प्राप्त करें
theLinksLayer = COMMON.getInfoFromTable(theT,9)
theLinksLayer = COMMON.isLayerExist(mxd,theLinksLayer)
arcpy.SelectLayerByAttribute_management(theLinksLayer, "CLEAR_SELECTION")
linksFromI=COMMON.getInfoFromTable(theT,14)
linksToI=COMMON.getInfoFromTable(theT,13)
G=nx.Graph()
arcpy.AddMessage("Adding links to graph")
with arcpy.da.SearchCursor(theLinksLayer, (linksFromI,linksToI,"Times")) as cursor:
for row in cursor:
(f,t,c)=row
G.add_edge(f,t,weight=c)
del row, cursor
pops=[]
pops=arcpy.da.TableToNumPyArray(theNodesLayer,("P2013"))
length0=nx.all_pairs_shortest_path_length(G)
nNodes=len(pops)
aBmNodes=[]
aBig=xrange(nNodes)
host=[-1]*nNodes
while True:
RATIO+=-1
if RATIO==0:
break
aBig = filter(lambda x: x not in aBmNodes, aBig)
p=itt.combinations(aBig, 2)
pMin=1000000
small=[]
for a in p:
S0,S1=0,0
for i in aBig:
p=pops[i][0]
p0=length0[a[0]][i]
p1=length0[a[1]][i]
if p0<p1:
S0+=p
else:
S1+=p
if S0!=0 and S1!=0:
sMin=min(S0,S1)
sMax=max(S0,S1)
df=abs(float(sMax)/sMin-RATIO)
if df<pMin:
pMin=df
aBest=a[:]
arcpy.AddMessage('%s %i %i' %(aBest,sMax,sMin))
if df<0.005:
break
lSmall,lBig,S0,S1=[],[],0,0
arcpy.AddMessage ('Ratio %i' %RATIO)
for i in aBig:
p0=length0[aBest[0]][i]
p1=length0[aBest[1]][i]
if p0<p1:
lSmall.append(i)
S0+=p0
else:
lBig.append(i)
S1+=p1
if S0<S1:
aBmNodes=lSmall[:]
for i in aBmNodes:
host[i]=aBest[0]
for i in lBig:
host[i]=aBest[1]
else:
aBmNodes=lBig[:]
for i in aBmNodes:
host[i]=aBest[1]
for i in lSmall:
host[i]=aBest[0]
with arcpy.da.UpdateCursor(theNodesLayer, "rcvnode") as cursor:
i=0
for row in cursor:
row[0]=host[i]
cursor.updateRow(row)
i+=1
del row, cursor
except:
message = "\n*** PYTHON ERRORS *** "; showPyMessage()
message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
message = "Python Error Info: " + str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()
6 समूहों के लिए आउटपुट उदाहरण:
आपको साइट पैकेज NETWORKX
http://networkx.github.io/documentation/development/install.html चाहिए
स्क्रिप्ट पैरामीटर के रूप में क्लस्टर की आवश्यक संख्या लेता है (उपरोक्त उदाहरण में 6)। यह समान वजन / यात्रा किनारों की दूरी (टाइम्स = 1) के साथ एक ग्राफ बनाने के लिए नोड्स और लिंक तालिकाओं का उपयोग कर रहा है। यह 2 से सभी नोड्स के संयोजन पर विचार करता है और पड़ोसियों के दो समूहों में कुल [P2013] की गणना करता है। जब आवश्यक अनुपात हासिल किया जाता है, उदाहरण के लिए (6-1) / 1, पहले पुनरावृत्ति पर, घटे हुए अनुपात लक्ष्य के साथ जारी रहता है, अर्थात 4, आदि। 1. शुरुआती बिंदु बहुत महत्वपूर्ण हैं इसलिए सुनिश्चित करें कि आपके 'अंत' नोड शीर्ष पर बैठे हैं। अपने नोड्स टेबल (छँटाई?) को उदाहरण आउटपुट में पहले 3 समूह देखें। यह हर अगले पुनरावृत्ति पर 'शाखा काटने' से बचने में मदद करता है।
Mxd से काम करने के लिए स्क्रिप्ट अनुकूलन:
- आपको COMMON आयात की आवश्यकता नहीं है। यह मेरी अपनी बात है, कि मेरी अपनी एनवायरनमेंट टेबल पढ़ती है, जहाँ नोड्सलेयर, लिंकलेयर, लिंक्सफ्रोमी, लिंक्सटॉइ निर्दिष्ट हैं। प्रासंगिक लाइनों को अपने स्वयं के नामकरण और लिंक परतों के साथ बदलें।
- ध्यान दें कि फ़ील्ड P2013 कुछ भी स्टोर कर सकती है, उदाहरण के लिए किरायेदारों या पार्सल क्षेत्र की संख्या। यदि ऐसा है तो आप लगभग समान व्यक्ति आदि को रखने के लिए पॉलीगॉन क्लस्टर कर सकते हैं।