आर्कपी के साथ समान संख्या के समूहों की संख्या * n * में विभाजित बहुभुज?


10

काम के लिए मेरा एक कार्य पार्सल को समूहों में विभाजित करना है। इन समूहों का उपयोग एजेंटों द्वारा संपत्ति के मालिकों से बात करने के लिए किया जाएगा। लक्ष्य यह है कि पार्सल को एक-दूसरे के साथ जोड़कर एजेंट की नौकरी को आसान बनाया जाए, साथ ही पार्सल को समान संख्या में विभाजित किया जाए ताकि काम समान रूप से वितरित हो। एजेंटों की संख्या एक जोड़े से 10+ तक उतार-चढ़ाव कर सकती है।

वर्तमान में मैं यह कार्य मैन्युअल रूप से करता हूं, लेकिन यदि संभव हो तो प्रक्रिया को स्वचालित करना चाहते हैं। मैंने विभिन्न आर्कजीआईएस उपकरणों की खोज की है, लेकिन कोई भी मेरी जरूरत के अनुरूप नहीं है। मैंने एक स्क्रिप्ट (अजगर में) का उपयोग करने की कोशिश की near_analysis, जो बहुभुज का चयन और चयन करता है, लेकिन यह यादृच्छिक नहीं है और हमेशा के लिए एक अर्ध-सही परिणाम प्राप्त करने में लेता है जो तब मुझे ठीक करने में अधिक समय लगता है अगर मैंने अभी शुरुआत से मैन्युअल रूप से सब कुछ किया था।

क्या इस कार्य को स्वचालित करने के लिए एक विश्वसनीय तरीका है?

परिणाम उदाहरण (उम्मीद है कि विभाजन के बिना हम पीले रंग में देखते हैं):

विभक्त पार्सल


क्या आपने स्थान-आवंटन विश्लेषण पर ध्यान दिया है? help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/…
फ्लोएम

क्या आपने समूह विश्लेषण (स्थानिक सांख्यिकी) की कोशिश की है?
फेलिक्सिप

मैंने वास्तविक प्रक्रिया का एक छद्म कोड भी पोस्ट किया है, जिसका मैं उपयोग कर रहा हूं, देखें कि क्या यह gis.stackexchange.com/questions/123289/…
FelixIP

@ crmackey मैं अपने उत्तर के लिंक की सराहना करता हूं, लेकिन मुझे यकीन नहीं है कि आप इस समस्या (पॉलीगॉन को समूहीकृत) करने के लिए लिंक किए गए कोड (विभाजन पॉलीगॉन) को कैसे ट्विक कर सकते हैं।
फ्लोएम

जवाबों:


4

मूल सेट:

यहां छवि विवरण दर्ज करें

इसके छद्म प्रति (TOT में CNTRL- ड्रैग) बनाएँ और क्लोन के साथ एक से कई में स्थानिक जोड़ दें। इस मामले में मैंने 500 मीटर की दूरी तय की। आउटपुट तालिका:

यहां छवि विवरण दर्ज करें

  1. इस तालिका से रिकॉर्ड निकालें जहां PAR_ID = PAR_ID_1 - आसान है।

  2. तालिका के माध्यम से अलग करें और रिकॉर्ड (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 से काम करने के लिए स्क्रिप्ट अनुकूलन:

  1. आपको COMMON आयात की आवश्यकता नहीं है। यह मेरी अपनी बात है, कि मेरी अपनी एनवायरनमेंट टेबल पढ़ती है, जहाँ नोड्सलेयर, लिंकलेयर, लिंक्सफ्रोमी, लिंक्सटॉइ निर्दिष्ट हैं। प्रासंगिक लाइनों को अपने स्वयं के नामकरण और लिंक परतों के साथ बदलें।
  2. ध्यान दें कि फ़ील्ड P2013 कुछ भी स्टोर कर सकती है, उदाहरण के लिए किरायेदारों या पार्सल क्षेत्र की संख्या। यदि ऐसा है तो आप लगभग समान व्यक्ति आदि को रखने के लिए पॉलीगॉन क्लस्टर कर सकते हैं।

वास्तविकता में नोड्स और लिंक परतें केवल दृश्य चीजें हैं। स्थानिक जुड़ाव की साफ-सुथरी तालिका लिंक तालिका को आसानी से बदल सकती है, क्योंकि इससे और नोड्स को पहले से ही सौंपा गया है। बहुभुज तालिका, आसानी से नोड्स टेबल के रूप में काम कर सकती है, बस ReceivingNode फ़ील्ड जोड़ें और अनुक्रमिक संख्याओं को वापस इसे 'लिंक' [FromI] और [TOI] में स्थानांतरित करें।
फेलिक्सिप

यह अच्छा लग रहा है। उत्तर के लिए बहुत बहुत धन्यवाद। क्या आप इस बारे में अधिक जानकारी दे सकते हैं कि कैसे और कैसे नहीं? आपके कोड पर टिप्पणियाँ बहुत बड़ी होंगी।
एमिल ब्रुन्डेज

कृपया अपने प्रश्न के लिए मेरे पहले टिप्पणी में हाइपरलिंक का पालन करें। मैंने दृष्टिकोण को समझाने की कोशिश की है, अगर यह 'क्यों' का अर्थ है। मैं नोड शुरू करने के महत्व के बारे में अपनी टिप्पणी वापस लेता हूं, क्योंकि आपके प्रश्न का उत्तर पोस्ट करने के बाद, मैंने स्क्रिप्ट को मारने की कोशिश कर रहे रिकॉर्ड क्रम को बदल दिया। कुछ भी नहीं हुआ यह अभी भी उचित परिणाम का उत्पादन किया।
फेलिक्सिप

स्थानिक ज्वाइन टेबल को साफ करने के लिए PAR_ID = PAR_ID_1 को हटाना पर्याप्त है, क्योंकि NETWORKX के समान छोर [2,0] के अप्रत्यक्ष ग्राफ में बढ़त / लिंक [0,2]। मैं अद्यतन स्क्रिप्ट पोस्ट कर सकता हूं, निश्चित नहीं कि यह मेरी प्रतिष्ठा को प्रभावित करेगा या नहीं
फेलिक्सिप

@EmilBrundage की नज़र है, यह मदद कर सकता है क्यों सवाल gis.stackexchange.com/questions/165057/…
FelixIP

2

आपको अपने लक्ष्य को प्राप्त करने के लिए "समूह विश्लेषण" टूल का उपयोग करना चाहिए। जैसा कि @phloem ने बताया है कि यह उपकरण "स्थानिक सांख्यिकी" टूलबॉक्स से एक महान उपकरण है। हालाँकि आपको अपने डेटा और समस्या के अनुकूल उपकरण को ठीक से ट्यून करना चाहिए। मैंने आपके द्वारा पोस्ट किया गया एक समान परिदृश्य बनाया और आपके लक्ष्य के करीब प्रतिक्रिया मिली।

संकेत: आर्कजीआईएस 10.2 का उपयोग करते हुए, जब मैंने उपकरण चलाया, तो इसने लापता अजगर पैकेज, "छह" के बारे में शिकायत की। तो सुनिश्चित करें कि आपने इसे पहले लिंक स्थापित किया है

कदम:

  1. एक अद्वितीय मान रखने के लिए बहुभुज वर्ग में एक फ़ील्ड जोड़ें
  2. "समग्रुप" जैसे नाम के साथ लघु का दूसरा क्षेत्र जोड़ें
  3. आप सभी पंक्तियों के लिए इस क्षेत्र में 1 असाइन करने के लिए कैलकुलेटर फिल्ड करते हैं। बस एक पंक्ति को 2 में बदलें। जोड़ा गया फ़ील्ड

  4. "समूह विश्लेषण" टूल पैरामीटर इस तरह सेट करें: समूह विश्लेषण

अपनी ज़रूरत के हिसाब से "पड़ोसियों की संख्या" पैरामीटर को बदलने की कोशिश करें।

परिणाम स्नैपशॉट:

नमूना इनपुट बहुभुज

समूह विश्लेषण का परिणाम


2
मैंने पहले ग्रुप एनालिसिस पर ध्यान दिया। यह स्थानिक से संबंधित है, लेकिन जहाँ तक मैं बता सकता हूं, गिनती नहीं है। प्रलेखन पढ़ने से मेरा सारा अनुभव, आपके उदाहरण को देखना, और मेरे स्वयं के परीक्षण करना बहुभुज की समान संख्या के आधार पर समूह की अनुमति नहीं देता है।
एमिल ब्रुंडेज

आपको समान (एजेंटों के लिए ऑफ-कोर्स) बनाने की आवश्यकता क्यों है? लेकिन अगर हम उस बाधा को जोड़ते हैं तो स्थानिक संबंध के आधार पर डेटा को क्लस्टर (समूह) क्यों?!
फरीद चरागी

1
क्योंकि बॉस ऐसा कहता है। साथ ही, यात्रा का समय कम से कम करें।
एमिल ब्रुंडेज

1

मूल रूप से आप एक समान आकार की क्लस्टरिंग विधि चाहते हैं, ताकि आप वेब पर इस प्रमुख शब्दों के साथ खोज कर सकें। मेरे लिए, आँकड़ों में एक अच्छा उत्तर है। एक उत्तर में पायथन कार्यान्वयन के साथ। यदि आप आर्कपी से परिचित हैं तो आपको अपने डेटा के साथ इसका उपयोग करने में सक्षम होना चाहिए।

आपको पहले अपने बहुभुज के सेंट्रोइड्स के एक्स और वाई की गणना करने की आवश्यकता है, फिर आप स्क्रिप्ट में इन निर्देशांक दर्ज कर सकते हैं और एक .da कर्सर का उपयोग करके उनकी विशेषता तालिका को अपडेट कर सकते हैं।


आपके द्वारा प्रदान किया गया लिंक ऐसा लगता है कि यह सही रास्ते पर है, लेकिन यह मूल रूप से एक ऐसी भाषा है जिसे मैं नहीं समझता। स्क्रिप्ट के लिए मुझे नहीं पता कि इनपुट क्या हैं और किसी भी कोडिंग को समझने के लिए समझ में नहीं आ रहा है कि वास्तव में क्या हो रहा है। बहुत कम व्याख्या है।
एमिल ब्रुंडेज

0

नमस्ते वहाँ मैं इस तरह के एक मुद्दे के रूप में पहले था, इसलिए मैं यह कुछ दिया था, हालांकि, एक और के साथ शुरू नहीं मिला, यह सिर्फ थोथी तरफ मैं सोच रहा था

INPUT SHAPE

इनपुट आकार

मैं सोच रहा था कि आप इनपुट आकृति पर एक फिशनेट बना सकते हैं

फिशनेट आप इनपुट आकार के एक अंतर के साथ फिशनेट तब होगा

क्षेत्र में इनपुट

फिर आप नए संसाधित बहुभुज के अंदर इन पार्सल के क्षेत्र की गणना कर सकते हैं

आपकी स्क्रिप्ट के प्रारंभ में समान आकार के क्षेत्र इनपुट बहुभुज / nth राशि चाहते थे

फिर आपको पार्सल से संबंधित तरीके की आवश्यकता होगी ताकि वे उन लोगों के बारे में जान सकें जो कि सीमाबद्ध हैं।

तब आप पार्सल को समेटने के एक पंक्ति कर्सर के माध्यम से जा सकते थे

नियम होने

* यह पिछले एक गर्मियों में एक सीमा साझा करता है * इसे समन नहीं किया गया है * एक बार जब यह बराबर क्षेत्र के रूप में गणना की गई मूल्य से अधिक हो जाता है, तो यह वापस आ जाएगा और यह एक समूह होगा * प्रक्रिया फिर से शुरू होगी * अंतिम समूह हो सकता है बचे हुए पार्सल का योग

मुझे लगता है कि संबंध स्थापित करने के दौरान पार्सल मुश्किल काम हो सकता है लेकिन एक बार ऐसा हो जाने के बाद मुझे लगता है कि इसे स्वचालित करना संभव हो सकता है


मुझे डर है कि मुझे समझ नहीं आ रहा है कि इसका मेरे मुद्दे से क्या लेना-देना है। एक मछली के जाल के साथ एक बहुभुज को काटने का स्थानिक रूप से और समान संख्या में बहुभुज के समूह के साथ क्या करना है? आप क्षेत्र पर ध्यान केंद्रित करने लगते हैं, गिनती नहीं। पार्सल बहुभुज का क्षेत्र (आकार) कोई कारक नहीं है। भले ही कोई पार्सल कितना भी छोटा या छोटा क्यों न हो, बात करना अभी भी सिर्फ एक प्रॉपर्टी का मालिक है। मेरा उदाहरण देखें जहां लाल एक ग्रामीण क्षेत्र है और व्यापक फैला हुआ है, जबकि नारंगी शहरी है और इसलिए बहुत छोटे कुल क्षेत्र को कवर करता है।
एमिल ब्रुंडेज

हाय वहाँ, माफ करना, मैं कुल गलत अपने सवाल पढ़ा। मुझे लगता है कि radouxju पोस्ट जाने का रास्ता हो सकता है, लेकिन लिंक मेरे सिर पर थोड़ा सा जाता है। बहुभुजों को बिंदुओं में बदलना तर्कसंगत लगता है और फिर इन्हें समूहित किया जाता है। सड़क प्रणाली को सड़क से बिंदु से दूरी के रूप में प्रस्तुत करने का एक तरीका हो सकता है और अगला बिंदु स्थानिक तत्व को परिभाषित कर सकता है
जैक वॉकर

0

मेरा मानना ​​है कि आप जिस विस्तार की तलाश कर रहे हैं वह जिला है। यह आमतौर पर चुनाव के लिए और साथ ही समान आकार के मताधिकार क्षेत्रों के लिए उपयोग किया जाता है। (आकार क्षेत्र के लिए जरूरी नहीं है, यह किसी भी जनसांख्यिकी हो सकता है)

http://www.esri.com/software/arcgis/extensions/districting

http://help.arcgis.com/en/redistricting/pdf/Districting_for_ArcGIS_Help.pdf


0

बिंदु घटनाओं के लिए यह मेरा समाधान है। कोई गारंटी नहीं कि यह हमेशा काम करेगा ...

  1. अपने पॉइंट इवेंट लेयर पर (कॉल लेयर 1) x (डबल), y (डबल), और यूनिकिड (लॉन्ग पूर्णांक) के लिए कॉलम जोड़ें
  2. परत के लिए ओपन विशेषता तालिका 1. एक्स के लिए एक्स समन्वय बिंदु की गणना करें, वाई के लिए वाई समन्वय बिंदु और अद्वितीय आईडी के लिए एफआईडी
  3. निष्पादित स्थानिक सांख्यिकी उपकरण> मानचित्रण क्लस्टर> समूह विश्लेषण
    • लेयर 1 को इनपुट फीचर्स के रूप में सेट करें
    • विशिष्ट फ़ील्ड आईडी के रूप में अद्वितीय सेट करें
    • समूहों की संख्या निर्धारित करें (हम कहेंगे 10)
    • विश्लेषण क्षेत्रों के लिए x और y चुनें
    • स्थानिक बाधाओं के लिए "NO_SPATIAL_CONSTRAINT" चुनें
    • ओके पर क्लिक करें
  4. स्थानिक सांख्यिकी उपकरण निष्पादित करें> भौगोलिक वितरण का मापन> मीन सेंटर
    • इनपुट फीचर्स क्लास के रूप में # 3 से आउटपुट चुनें
    • SS_Group को केस फ़ील्ड के रूप में चुनें
    • ओके पर क्लिक करें
  5. नेटवर्क विश्लेषक> स्थान आवंटन उपकरण खोलें
    • सुविधाओं के रूप में # 4 का लोड आउटपुट
    • लेयर 1 को डिमांड पॉइंट के रूप में लोड करें
    • गुण खोलें और सेट करें
      • समस्या प्रकार के रूप में अधिकतम कैपेसिटेड कवरेज
      • 10 के रूप में चुनने के लिए सुविधाएं (# 3 से ऊपर)
      • लेयर 1 में सुविधाओं की कुल संख्या के रूप में डिफ़ॉल्ट क्षमता राउंडेड अप चुनने के लिए सुविधाओं से विभाजित है (इसलिए यदि 145 सुविधाएँ और 10 सुविधाएं / क्षेत्र, 15 के रूप में सेट)
      • ओके पर क्लिक करें
        • का समाधान
        • आपके मांग अंक कम से कम 10 भौगोलिक समूहों में समान रूप से वितरित किए जाने चाहिए

मैं आपकी विधि के चरण पाँच पर अटका हुआ हूँ। मैंने नेटवर्क विश्लेषक एक्सटेंशन की जाँच की है और नेटवर्क विश्लेषक टूलबार को जोड़ा है। लेकिन इसका अधिकांश हिस्सा धूसर हो गया है और मुझे "स्थान आवंटन उपकरण" दिखाई नहीं दे रहा है। मैं 10.1 का उपयोग कर रहा हूं।
एमिल ब्रुंडेज

0

आपको पहले अपनी सड़कों का उपयोग करके एक नेटवर्क डेटासेट बनाने की आवश्यकता होगी। मैंने इस प्रस्तावित विधि को आजमाया है और अब तक अपने आप को ग्रुपिंग (चरण 3) के साथ एक ही काम करने का सौभाग्य मिला है, इनपुट क्षेत्रों के लिए X, Y निर्देशांक और k- साधनों का उपयोग करते हुए (एकदम सही नहीं है, लेकिन मैं जो भी हूं उसके करीब और बेहतर हूं ज़रूरत)। मैं दूसरों की टिप्पणियों और प्रतिक्रिया के लिए खुला हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.