प्रत्येक बहुभुज में कोने की संख्या निकालना?


14

मेरे पास ArcGIS डेस्कटॉप 10.2 है और मेरी चुनौती यह है कि इस तरह की सभी विशेषताओं के लिए प्रत्येक बहुभुज में संख्या शीर्षों को कैसे निकाला जाए:

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

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

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

मेरे फीचर क्लास में कई पार्सल हैं और मैं सभी विशेषताओं के लिए अलग-अलग संख्याओं को अलग-अलग निकालना चाहता हूं, फिर मैं सभी कोने के लिए XY निर्देशांक प्रदर्शित करना चाहता हूं।

अधिक जानकारी के लिए, मैं सिर्फ प्रत्येक बहुभुज के लिए कोने को परिवर्तित करना चाहता हूं और 1 संख्या से घूरने वाले प्रत्येक कोने की संख्या प्रदर्शित करना चाहता हूं, इसलिए यदि मेरे पास बहुभुज है और इसमें 4 कोने हैं, तो बहुभुज को कोने में परिवर्तित कर सकते हैं I (1,2,3,4,5), तब प्रत्येक कोने के लिए xy प्रदर्शित करता हूं, मुझे लगता है कि वास्तविक चुनौती आईडी है, सभी बहुभुज को कोने में कैसे परिवर्तित करें और प्रत्येक संख्या को 1 नंबर से शुरू करें।


अपने संपादन के आधार पर, क्या आप चाहते हैं कि प्रत्येक सुविधा में एक अद्वितीय ID (1 .... n) प्रति सुविधा और XY निर्देशांक हों? क्या आप लेबलिंग उद्देश्यों के लिए इस जानकारी की सभी जानकारी के लिए एक कॉलम / फ़ील्ड पसंद करेंगे जैसे [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
हारून

हाँ, अगर गलती नहीं है, तो किसी के पास इस तरह के बहुभुज की संख्या के लिए एक आईडी है (1,2,3,4), (1,2,3,4,5), (1,2,3,4,) 5,6,), (1,2,3,4,5,6,7,8,9) आदि, तो मुझे लगता है कि xy के बारे में आसान हो सकता है अगर हम arctoolbox से xy टूल जोड़ते हैं
GIS Man

जवाबों:


5

नीचे दिया गया कोड अन्य उत्तरों को जोड़ता है और संख्याओं को जोड़ने के लिए थोड़ा जोड़ता है। परिणाम

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

अंक ड्राइंग ऑर्डर में लेबल किए गए हैं। अंतिम बिंदु (पहले के तहत) के पास कोई लेबल नहीं होगा और उन सभी बिंदुओं का चयन करके हटाया जा सकता है जिनमें पुनर्निर्माण के लिए आवश्यक नहीं है, नल, या अद्वितीय, "DRAW_ORDER" मान हैं। ओवरलैपिंग बिंदुओं को प्रदर्शन से हटाने के लिए एक परिभाषा क्वेरी का उपयोग किया जा सकता है।

XY डेटा मौजूद है, लेकिन मैं इसे आपकी लेबलिंग / इच्छाओं को प्रदर्शित करने के लिए छोड़ दूंगा। लेबलिंग के लिए XY फ़ील्ड जोड़ने के बारे में हारून का जवाब देखें।

मैं फीचरक्लास के साथ सुन्न सरणी के लिए भी कर रहा था, लेकिन मैंने इसे पहले पूरा किया।


धन्यवाद @ gm70560, मैंने आपके कोड चर का पालन किया है, और इसे .py के रूप में सहेजा है, लेकिन जब मैं इसे निष्पादित करना चाहता हूं, तो एक त्रुटि संदेश प्रकट होता है, "निर्दिष्ट फ़ील्ड नाम तालिका में मौजूद नहीं है", इसलिए मैं क्या कर सकता हूं ?
जीआईएस मैन

यहाँ एक प्रिंट स्क्रीन है मेरा पीसी, मैं बस लक्ष्य सुविधा वर्ग पथ सेट करता हूं, और आउटपुट नई सुविधा वर्ग के लिए पथ, आप कोड में, यदि आप अपने कोड का उपयोग करने के लिए एक दिशानिर्देश बना सकते हैं, imageshack.com/i/ fvsozep
GIS Man

यह फ़ील्ड (?) को नहीं जोड़ता था। नतीजों में आगे क्या हुआ? मेरे पास पूरा परिणाम डंप करने के लिए एक चैट रूम है। एक टिप्पणी छोड़ दो ताकि मैं कमरे की जांच कर सकूं।
gm70560

22

ऐसा करने का सबसे आसान तरीका पार्सल परत की विशेषता तालिका में एक नया पूर्णांक फ़ील्ड जोड़ना है। फिर, निम्न अभिव्यक्ति के साथ फ़ील्ड कैलकुलेटर चलाएं:

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCountसुविधा में कोने की कुल संख्या देता है। हालाँकि, सुविधा बंद करने के लिए, प्रत्येक भाग का पहला शीर्ष अंत में दोहराया जाता है। इसे संभालने के लिए, प्रत्येक भाग के उपयोग के लिए एक शीर्ष को घटाएं -!Shape!.partCount

ध्यान दें कि आपको इस अभिव्यक्ति के लिए पायथन पार्सर का उपयोग करना होगा।

क्षेत्र कैलकुलेटर


यह वास्तव में बहुत अच्छा है, लेकिन इनमें से प्रत्येक कोने के लिए XY प्रदान नहीं करेगा। लगता है कि उत्तर सभी अनुरोधों को प्राप्त करने के लिए दोनों प्रतिक्रियाओं (यानी, @ आरोन के) का उपयोग करना होगा।
रोलैंड

@ रोलैंड आप सही हैं ... मैं XY शीर्षकों के बारे में सवाल का हिस्सा याद किया। उस स्थिति में आपको SearchCursorहारून के जवाब में विधि का उपयोग करना होगा या फ़ीचर वर्टीक्यूज़ टू पॉइंट जैसे जियोप्रोसेसिंग टूल (हालाँकि इस उपकरण को डेस्कटॉप एडवांस लाइसेंस के लिए आर्कजीआईएस की आवश्यकता है)।
dmahr

बहुत बहुत धन्यवाद @ उदर, मुझे लगता है कि एक कदम याद आ रहा है, जब मैं मूल्य की गणना करता हूं, तो परिणाम संख्या की संख्या की गणना करता है, इसलिए अगर मेरे पास 5 कोने के साथ पार्सल सुविधा वर्ग है तो मैं इसे इस तरह प्रदर्शित करना चाहता हूं 1,2,3 , प्रत्येक कोने पर 4,5, सभी संख्याओं को एक संख्या में न गिनें, वास्तविक चुनौती यह है कि प्रत्येक पार्सल के लिए 1 संख्या से शुरू होने वाले प्रत्येक कोने के लिए संख्या कैसे प्रदर्शित करें।
जीआईएस मैन

12

dmahr ने कोने की गिनती के लिए एक अच्छा समाधान प्रदान किया। गैर-प्रोग्रामेटिक तरीके के लिए प्रत्येक बिंदु को XY कोर्डर्स के साथ लेबल करने के लिए, निम्न वर्कफ़्लो का प्रयास करें:

  1. अंक के लिए कार्यक्षेत्र
  2. नए बिंदु FC "X", "Y" में दो नए फ़ील्ड (टाइप: डबल) जोड़ें
  3. ज्यामिति की गणना करें। राइट क्लिक फ़ील्ड> ज्यामिति की गणना करें ...> बिंदु का X निर्देशांक (Y फ़ील्ड के लिए दोहराएं)
  4. एक और फील्ड "XY" जोड़ें (टाइप करें: टेक्स्ट)
  5. फ़ील्ड कैलकुलेटर में "XY" फ़ील्ड की गणना करें, जहां XY =

    str (x!) + "," + str ((! y!)

  6. लेबल सुविधाएँ। राइट क्लिक लेयर> लेबल> लेबल फील्ड: XY

यह निम्नलिखित परिणाम उत्पन्न करता है:

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

आप इन क्रियाओं को खोज कर्सर (एक शुरुआत के रूप में) के explode_to_pointsसाथ प्रोग्राम करके भी कर सकते हैं ।

किसी सुविधा को उसके अलग-अलग बिंदुओं या सिरों में विभाजित करें। यदि explode_to_points ट्रू पर सेट है, तो पांच बिंदुओं के साथ एक मल्टीपॉइंट सुविधा, उदाहरण के लिए, पांच पंक्तियों द्वारा दर्शाया गया है।

(मूल मूल्य गलत है)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

ऐसा लगता है कि किसी को कुछ पोस्ट प्रक्रिया की आवश्यकता होगी या # dmahr के उत्तर का उपयोग करने के लिए # लंबित का प्रति-सुविधा योग प्राप्त होगा।
रोलैंड

4

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

कस्टम स्क्रिप्ट टूल कोड:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

पायथन ऐड-इन कोड (कोने में परत गिनने के लिए एक परत का चयन करें):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.