ArcPy का उपयोग करके आकृति में प्रत्येक बहुभुज की सीमा प्राप्त करना?


20

आर्कगिस 10 और पायथन में मैं एक पॉलीफेन में प्रत्येक पॉलीगॉन की हद (xmax, ymax, xmin, ymin) प्राप्त करना चाहता हूं।

मैं का उपयोग कर पूरे आकार की सीमा प्राप्त कर सकते हैं

file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax

३९४५५१.५२०८५०३९५३२

लेकिन मैं यह पता नहीं लगा सकता कि डेटासेट में प्रत्येक पंक्ति के लिए समान जानकारी कैसे प्राप्त की जाए।

rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
 print row

डेटासेट में 31 पंक्तियों को प्रिंट करता है लेकिन

for row in rows:
 desc=arcpy.Describe(row)
 print desc.extent.Xmax

एक त्रुटि देता है।

रनटाइम त्रुटि: ऑब्जेक्ट: वर्णन इनपुट मान मान्य प्रकार नहीं है

मैं "गणना ज्यामिति" का उपयोग करके तालिका में सीमा मानों को जोड़ने के बारे में सोच रहा था, लेकिन यह केवल केन्द्रक देता है। फिर मुझे लगता है कि हम कुछ का उपयोग कर सकते हैं जैसे row.GetValue ("xmax")।

कहा जा रहा है कि मुझे पता है कि हम http://www.ian-ko.com/free/free_arcgis.htm से फ़ंक्शन का उपयोग करके एक्स / वाई, अधिकतम / मिनट बना सकते हैं लेकिन यह सबसे अच्छा होगा यदि हम जोड़ने से बच सकते हैं क्षेत्र, खासकर अगर आर्पी को ये मूल्य मिल सकते हैं।

मूल रूप से मुझे डेटा के 30 क्षेत्रों (1: 100,000 मैप शीट के अनुसार) को क्लिप करने के लिए क्लिप टूल में फीड करने के लिए एक्सटेंशन्स प्राप्त करने की आवश्यकता होती है क्योंकि स्प्लिट टूल बड़े आकार के डेटासेट के फेल होने के बाद से जियोप्रोसेसिंग के लिए होता है (देखें कि इन्टर्स क्यों देता है) त्रुटि 999999: फ़ंक्शन को निष्पादित करने में त्रुटि अमान्य टोपोलॉजी [बहुत सारे लेनिग एंडपॉइंट]? )। मैं इसे स्वचालित करना चाहता हूं क्योंकि यह कई डेटासेट पर दोहराया जाता है।

=== वर्किंग स्क्रिप्ट ===

# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.


#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com
import arcpy, string

#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB

inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"

#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True

rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    Name = row.Name_1
    print "Executing clip on: "+str(Name)
    extent = feat.extent
    #print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
    XMAX = extent.XMax
    XMIN = extent.XMin
    YMAX = extent.YMax
    YMIN = extent.YMin
    pnt1 = arcpy.Point(XMIN, YMIN)
    pnt2 = arcpy.Point(XMIN, YMAX)
    pnt3 = arcpy.Point(XMAX, YMAX)
    pnt4 = arcpy.Point(XMAX, YMIN)
    array = arcpy.Array()
    array.add(pnt1)
    array.add(pnt2)
    array.add(pnt3)
    array.add(pnt4)
    array.add(pnt1)
    polygon = arcpy.Polygon(array)
    ShapeFile = outDir+"\\temp_poly"
    arcpy.CopyFeatures_management(polygon, ShapeFile)

    #print Name
### Set local variables
    in_features = inFile
    clip_features = ShapeFile
    out_feature_class = outDir+"\\"+Name
    xy_tolerance = "0.22"

    # Execute Clip

    try:
        arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
        print "Completed: "+str(Name)
    except:
        error = arcpy.GetMessages()
        print "Failed on: "+str(Name)+" due to "+str(error)

2
आपको डिस्क पर क्लिप फीचर लिखने की ज़रूरत नहीं है, बस मेमोरी पॉलीगॉन में उपयोग करें, उदाहरण के लिए: बहुभुज = arcpy.Polygon (array) arcpy.Clip_analysis (in_features, polygon, out_feature -class, xy_tolerance)
user2856

टी.के.एस। कोई भी विचार कि मैं पंक्ति को एक नई आकृति फ़ाइल में कैसे निर्यात कर सकता हूं ताकि यह पंक्ति की सीमा के बजाय इसका उपयोग करे? यह इतना है कि यह गैर-आयताकार क्लिप को भी संभाल सकता है।
जॉर्ज सी सी

1
वैसे अगर आप केवल उसी फीचर से, उसी स्क्रिप्ट में क्लिप करना चाहते हैं, तो फीचर ऑब्जेक्ट का उपयोग करें। फिर, आकार फ़ाइल में निर्यात करने की आवश्यकता नहीं है, उदाहरण के लिए: arcpy.Clip_analysis (in_features, feat, out_feature_class, xy_tolerance)
user2856

एक आकृति के लिए या आकृति में प्रत्येक बहुभुज के लिए? लगता है कि आप यहां दो अलग चीजों के बारे में बात कर रहे हैं।
रेनर

क्या आपकी आकृति में केवल एक बहुभुज वस्तु है? यदि नहीं, तो अपनी वस्तुओं के लिए लूप का उपयोग करें।
आरागॉन

जवाबों:


26

अपने कर्सर में आकृति ऑब्जेक्ट प्राप्त करें और इसकी सीमा संपत्ति तक पहुंचें। पायथन में ज्यामिति के साथ काम करने में आर्कगिस सहायता देखें :

shapeName = arcpy.Describe(inFeatures).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    extent = feat.extent
    print extent.XMin,extent.YMin,extent.XMax,extent.YMax

1
धन्यवाद ल्यूक। यह बहुत अच्छा काम किया। अगर कोई टूल का उपयोग करना चाहता है तो मैं अपने प्रश्न को नए वर्किंग कोड में संपादित करूंगा - जो कि एक बड़े फीचर वर्ग के आयताकार क्षेत्रों को क्लिप करने के लिए क्लिप टूलसेट का उपयोग करता है। 10 जीबी FGDB और 100 मिलियन रिकॉर्ड के रूप में बड़े डेटासेट के साथ दुर्घटना के बिना चाप जानकारी स्प्लिट टूल की कार्यक्षमता का अनुकरण करता है।
जार्ज

एक बात - मुझे नाम विशेषता के समान नाम = row.Name_1 के समतुल्य प्राप्त करने के लिए कॉलम के नाम को कोड करना था; NameField = "Name_1"; नाम = पंक्ति.नाम.फिल्ड; या नाम = पंक्ति + "।" + NameField जहाँ NameField = arcpy.GetParameterAsText (2) और नाम Name_1 कॉलम में आयोजित किया जाता है। कोई विचार? नोट I; का उपयोग किया गया है; " एक नई लाइन को दर्शाने के लिए।
जॉर्जॉक

1
उपरोक्त पता लगा - पंक्ति.गेटवैल्यू (xxx) gis.stackexchange.com/questions/16586/… से
GeorgeC

7

Bounding कंटेनर टूलसेट बिल्कुल वही करती आप क्या चाहते हैं। क्या आपको बस कोड स्निपेट चाहिए, स्क्रिप्ट के भीतर फ़ंक्शन की जांच करनी चाहिए, एक स्पष्ट रूप से हद तक संबंधित होता है।

संपादित करें

मुझे यह जोड़ना चाहिए कि स्क्रिप्ट बनाई गई आउटपुट फ़ाइल में एक लेफ्ट, राइट, टॉप और बॉटम फील्ड के मानों को जोड़ेगी जिसे बाद की प्रोसेसिंग के लिए उपयोग किया जा सकता है


धन्यवाद। इसकी जांच कराएंगे। उम्मीद है कि मैं अपने पाइथन स्क्रिप्ट / मॉडल के भीतर कोड का उपयोग कर सकता हूं।
जॉर्जसी

2

मैंने अभी आर्कगिस 10 में मिनिमम बाउंडिंग ज्योमेट्री (लिफाफा) (डेटा मैनेजमेंट में) की कोशिश की थी और यह सभी क्षेत्रों के लिए बिल्कुल समान है।


1

एक और तरीका यह होगा कि एक आकृति खोजक () को आकार के आधार पर करें, फिर आप row.shape.extent का उपयोग कर सकते हैं:

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...

1

ArcMap में बहुभुज कोने के अर्क निर्देशांक में कवर के रूप में? आप एक बहुभुज के कोने प्राप्त कर सकते हैं और फिर विशेषता तालिका में फ़ील्ड के रूप में प्रत्येक शीर्ष के x और y निर्देशांक जोड़ सकते हैं। इसमें अधिकतम / मिनट के निर्देशांक को सीधे प्रत्येक बहुभुज के साथ संलग्न नहीं करने की सीमा है लेकिन इसे कुछ तरीकों से प्राप्त किया जा सकता है।

जिस विधि से मैं सबसे अधिक परिचित हूं , वह pyshp मॉड्यूल का उपयोग करके x और y फ़ील्ड को अजगर सूचियों में पढ़ने के लिए है , जिसे तब प्रत्येक बहुभुज के लिए अधिकतम और न्यूनतम मान ज्ञात करने के लिए क्रमबद्ध किया जा सकता है। Pyshp को तब मूल बहुभुज में नए फ़ील्ड जोड़ने और सही बहुभुज के लिए इन अधिकतम और न्यूनतम मान लिखने के लिए एक लेखक वर्ग खोलने के लिए उपयोग किया जा सकता है।

मेरा मानना ​​है कि यह आर्कपी का उपयोग करके किया जा सकता है, लेकिन मुझे 9.3 में आकार-प्रकार लिखने के साथ बहुत सारी समस्याएं थीं, जियोप्रोसेसर का उपयोग करते हुए, इसलिए मैं pyshp विधि को पसंद करता हूं, हालांकि मैं अनिश्चित हूं अगर आर्कपी मॉड्यूल ने इन मुद्दों को हल किया है।


0

क्या आपने "एम" को "एक्समैक्स" में कैपिटल करने की कोशिश की थी? मुझे लगता है कि यह माना जाता है:

print desc.extent.XMax

के बजाय

print desc.extent.Xmax

प्रलेखन के अनुसार । बेशक जो मुझे आश्चर्यचकित करता है कि आपका पहला कोड स्निपेट कैसे काम करता है। किसी भी तरह से, यह एक शॉट दे दो!

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