ArcGIS डेस्कटॉप का उपयोग करके फ़ील्ड मानों के आधार पर कई फ़ीचर वर्गों में फ़ीचर वर्ग निर्यात करना?


34

मेरे पास 2,000 से अधिक विशेषताओं के साथ एक फीचर क्लास है, और मुझे एक क्षेत्र के आधार पर उन्हें सभी व्यक्तिगत फीचर कक्षाएं बनाने की आवश्यकता है।

क्या इसे करने का कोई तरीका है?

जवाबों:


44

आप स्प्लिट बाइ अटैचमेंट टूल का उपयोग कर सकते हैं:

अद्वितीय विशेषताओं द्वारा एक इनपुट डेटासेट विभाजित करता है

इसके लिए उपलब्ध संस्करण हैं:


में ArcCatalog 10.6, Split By Attributesलगातार अलग-अलग उत्पन्न .dbfटेबल, न कि व्यक्तिगत सुविधा कक्षाएं। लेकिन, आर्कजीआईएस डेस्कटॉप 10.6 में, एक ही टूल सही ढंग से व्यक्तिगत शेपफाइल बनाता है । मुझे समझ में नहीं आता है, और एक ही आउटपुट दोनों फ़ोल्डर या जियोडेटाबेस के लिए काम करने वाले डायरेक्टरी को सेट करने की कोशिश कर रहा है।
माईका

22

यदि आप आर्कजीआईएस 10.0 या उच्चतर हैं, तो आप इसे बहुत सरल मॉडल के साथ प्राप्त कर सकते हैं।

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

विशेषता द्वारा निकालने के लिए मॉडल


16

मेरे पास ArcMap 10 तक पहुंच नहीं है, केवल 9.3, लेकिन मुझे उम्मीद है कि यह इससे बहुत अलग नहीं होगा।

आप पायथन में एक साधारण स्क्रिप्ट बना सकते हैं, जो विभिन्न मूल्यों के लिए आपके विशेषता क्षेत्र की जांच करता है, और फिर, उनमें से प्रत्येक के लिए अपने मूल शेपाइल के लिए एक सेलेक्ट ऑपरेशन चलाता है।

यदि आप अजगर स्क्रिप्टिंग से परिचित नहीं हैं, तो आपको बस इतना करना है कि आप IDLE (अजगर GUI) खोलें और एक नई फ़ाइल बनाएं, और नीचे दिए गए कोड को कॉपी करें। आपके my_shapefile, outputdir और my_attribute के लिए कोड को अपनाने के बाद यह काम करना चाहिए।

# Script created to separate one shapefile in multiple ones by one specific
# attribute

# Example for a Inputfile called "my_shapefile" and a field called "my_attribute"
import arcgisscripting

# Starts Geoprocessing
gp = arcgisscripting.create(9.3)
gp.OverWriteOutput = 1

#Set Input Output variables
inputFile = u"C:\\GISTemp\\My_Shapefile.shp" #<-- CHANGE
outDir = u"C:\\GISTemp\\" #<-- CHANGE

# Reads My_shapefile for different values in the attribute
rows = gp.searchcursor(inputFile)
row = rows.next()
attribute_types = set([])

while row:
    attribute_types.add(row.my_attribute) #<-- CHANGE my_attribute to the name of your attribute
    row = rows.next()

# Output a Shapefile for each different attribute
for each_attribute in attribute_types:
    outSHP = outDir + each_attribute + u".shp"
    print outSHP
    gp.Select_analysis (inputFile, outSHP, "\"my_attribute\" = '" + each_attribute + "'") #<-- CHANGE my_attribute to the name of your attribute

del rows, row, attribute_types, gp

#END

13

क्या आपने ArcMap 10 के लिए स्प्लिट लेयर बाय एट्रीब्यूट्स टूल को अपडेट किया है ? यदि यह काम नहीं करता है तो आप अपनी आवश्यकताओं के लिए स्प्लिट (विश्लेषण) का उपयोग कर सकते हैं।

इनपुट सुविधाओं को विभाजित करने से कई आउटपुट फीचर कक्षाओं का सबसेट बनता है। स्प्लिट फ़ील्ड के अनन्य मान आउटपुट सुविधा वर्गों के नाम बनाते हैं। ये लक्ष्य कार्यक्षेत्र में सहेजे गए हैं।

विभाजित करें

उदाहरण कोड:

import arcpy
arcpy.env.workspace = "c:/data"
arcpy.Split_analysis("Habitat_Analysis.gdb/vegtype", "climate.shp", "Zone",
                     "C:/output/Output.gdb", "1 Meters")

अंतर्निहित स्प्लिट टूल आपके उद्देश्यों के लिए बहुत अच्छा काम करता है यदि आप एक हद तक आयताकार बनाते हैं जैसा कि आपके पॉलीगॉन आप विभाजित करना चाहते हैं।
ccn

जब तक मैं उस प्रश्न का गलत अर्थ नहीं निकालता, मुझे लगता है कि यह "स्प्लिट बाय अटेंशन" के बजाय "स्प्लिट बाय लोकेशन" के लिए पूछ रहा है। स्प्लिट (विश्लेषण) "स्प्लिट बाय लोकेशन" कार्यक्षमता प्रदान करता है। @Ccn द्वारा यहाँ टिप्पणी एक दिलचस्प समाधान प्रदान करती है जिसे शायद इस उत्तर के लिए "स्पष्टीकरण" के रूप में संपादित किया जा सकता है।
PolyGeo

मुझे चिंता है कि सवाल Split By Attributeकार्यक्षमता का वर्णन करता है और आपका उत्तर ज्यादातर के बारे में है Split [By Geometry]
PolyGeo

लिंक टूट गया है
PolyGeo

9

मैंने @ अलेक्जेंड्रेनेटो की स्क्रिप्ट का उपयोग किया और आर्कजीआईएस 10.x उपयोगकर्ताओं के लिए इसे अपडेट किया । मुख्य रूप से अब आपको "आर्कगिसस्क्रिप्टिंग" के बजाय "आर्कपी" आयात करना होगा:

# Script created to separate one shapefile in multiple ones by one specific
# attribute

# Example for a Inputfile called "my_shapefile" and a field called "my_attribute"
import arcpy

#Set Input Output variables
inputFile = u"D:\DXF-Export\my_shapefile.shp" #<-- CHANGE
outDir = u"D:\DXF-Export\\" #<-- CHANGE

# Reads My_shapefile for different values in the attribute
rows = arcpy.SearchCursor(inputFile)
row = rows.next()
attribute_types = set([])

while row:
    attribute_types.add(row.my_attribute) #<-- CHANGE my_attribute to the name of your attribute
    row = rows.next()

# Output a Shapefile for each different attribute
for each_attribute in attribute_types:
    outSHP = outDir + each_attribute + u".shp"
    print outSHP
    arcpy.Select_analysis (inputFile, outSHP, "\"my_attribute\" = '" + each_attribute + "'")     #<-- CHANGE my_attribute to the name of your attribute

del rows, row, attribute_types

#END

6

यह ऐसा करने का एक और आसान तरीका है ... और यह एक GDB में आउटपुट करता है।

http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html

यूएसजीएस से टूल डाउनलोड करें, मुझे 1 मिनट के लिए जो करना था, उसे करने में मुझे 3 मिनट लगे।


लिंक के लिए आपको धन्यवाद! एक आकर्षण की तरह काम करता है (और संस्करण 10.2 के लिए!)
वूल्वरिनटाइम

मैंने हाल ही में इस उपकरण की कोशिश की, और जब मैंने इसे निष्पादित किया तो कुछ भी नहीं हुआ। मैंने अपनी सुविधा को चुना, सुविधाओं का चयन करने के लिए क्षेत्र का चयन किया, एक आउटपुट स्थान का चयन किया, ओके मारा और कुछ नहीं हुआ। यह सिर्फ "जाना" नहीं होगा ... क्या मुझे कुछ याद आ रहा है? धन्यवाद!
राशेल.पास

6

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

import arcpy, re

arcpy.env.overwriteOutput = True

Input = arcpy.GetParameterAsText(0)  
Flds = "%s" % (arcpy.GetParameterAsText(1)) 
OutWorkspace = arcpy.GetParameterAsText(2) 


myre = re.compile(";")
FldsSplit = myre.split(Flds)

sort = "%s A" % (FldsSplit[0])
rows = arcpy.SearchCursor(Input, "", "", Flds, sort)

for row in rows:
    var = []
    for r in range(len(FldsSplit)):
        var.append(row.getValue(FldsSplit[r]))
    Query = ''
    Name = ''
    for x in range(len(var)):
        if x == 0:
            fildz = FldsSplit[x]
            Name = var[x] + "_"
            Query += (""" "%s" = '%s'""" % (fildz, var[x]))
        if x > 0:
            fildz = FldsSplit[x]
            Name += var[x] + "_"
            Query += (""" AND "%s" = '%s' """ % (fildz, var[x]))
    OutputShp = OutWorkspace + r"\%s.shp" % (Name)
    arcpy.Select_analysis(Input, OutputShp, Query)

4

मैंने अंततः इसे SearchCursor और Select_analysis के साथ काम कर लिया है

arcpy.env.workspace = strInPath
# create a set to hold the attributes
attributes=set([])
# ---- create a list of feature classes in the current workspace ----
listOfFeatures = arcpy.SearchCursor(strInPath,"","",strFieldName,"")
for row in listOfFeatures:
    attributes.add(row.getValue(strFieldName))
    count=1
try:
    for row in attributes:
        stroOutputClass = strBaseName + "_" +str(count)# (str(row.getValue(strFieldName))).replace('/','_')
        strOutputFeatureClass = os.path.join(strOutGDBPath, stroOutputClass)
        arcpy.Select_analysis(strInPath,strOutputFeatureClass,strQueryExp)#"["+strFieldName+"]"+"='"+row+"'")
        count=count+1
    del attributes
except:
    arcpy.AddMessage('Error found')

3

मैं ModelBuilder में Iterate फ़ीचर चयन उपकरण से परिचित नहीं हूं, लेकिन केवल Python कोड के रूप में यह दर्शाता है कि उन्हें आर्कपी का उपयोग करके बुलाया जा सकता है।

    # Created on: 2015-05-19 15:26:10.00000
#   (generated by ArcGIS/ModelBuilder)
# Description: 
# ---------------------------------------------------------------------------

# Import arcpy module
import arcpy

# Load required toolboxes
arcpy.ImportToolbox("Model Functions")


# Local variables:
Selected_Features = ""
Value = "1"

# Process: Iterate Feature Selection
arcpy.IterateFeatureSelection_mb("", "", "false")

3

आप एक फीचर वर्ग में व्यक्तिगत सुविधाओं के माध्यम से लूप के लिए एक खोज कर्सर का उपयोग कर सकते हैं और केवल ज्यामितीय को अद्वितीय फीचर कक्षाओं में लिख सकते हैं। इस उदाहरण में, मैं संयुक्त राज्य अमेरिका के एक फीचर वर्ग का उपयोग करता हूं और राज्यों को नए आकार के लिए निर्यात करता हूं:

import arcpy

# This is a path to an ESRI FC of the USA
states = r'C:\Program Files (x86)\ArcGIS\Desktop10.2\TemplateData\TemplateData.gdb\USA\states'
out_path = r'C:\temp'

with arcpy.da.SearchCursor(states, ["STATE_NAME", "SHAPE@"]) as cursor:
    for row in cursor:
        out_name = str(row[0]) # Define the output shapefile name (e.g. "Hawaii")
        arcpy.FeatureClassToFeatureClass_conversion(row[1], out_path, out_name)

मुझे लगता है कि इस उत्तर का नकारात्मक पक्ष यह है कि आप विशेषताओं के माध्यम से नहीं चलते हैं। मैं एक उत्तर को अधिक पसंद करता हूं जैसे कि gis.stackexchange.com/a/152165/115 जो होगा।
PolyGeo

अच्छा बिंदु @PolyGeo, हालांकि, उल्टा यह है कि इसे अन्य वर्कफ़्लोज़ में लपेटा जा सकता है जिन्हें cursorसंचालन की भी आवश्यकता होती है।
आरोन

... लेकिन इसलिए FeatureClassToFeatureClass के स्थान पर Select_analysis का उपयोग कर सकता है - यह कोड की केवल एक पंक्ति है जो बदल जाएगी।
PolyGeo

2

आप प्रत्येक फीचर को एक्सपोर्ट करने के लिए कॉपी फीचर्स (डेटा मैनेजमेंट) के भीतर ज्योमेट्री टोकन (SHAPE @) का उपयोग कर सकते हैं ।

import arcpy, os

shp = r'C:\temp\yourSHP.shp'
outws = r'C:\temp'

with arcpy.da.SearchCursor(shp, ["OBJECTID","SHAPE@"]) as cursor:
    for row in cursor:
        outfc = os.path.join(outws, "fc" + str(row[0]))
        arcpy.CopyFeatures_management(row[1], outfc)

2

आर्कपी में, कर्सर परत / टेबल व्यू चयन का सम्मान करते हैं। पायथन कोड का उपयोग करते हुए डेस्कटॉप के लिए आर्कजीआईएस में चयनित सुविधाओं की सूची प्राप्त करने के अनुसार ? , आप बस सुविधा चयन iterate कर सकते हैं।

हालाँकि यदि आप आर्कपी का उपयोग करके चयन करना चाहते हैं, तो SelectLayerByAttribute_management टूल का उपयोग करें ।

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