Yanıtlar:
Özniteliklere Göre Böl aracını kullanabilirsiniz:
Giriş veri kümesini benzersiz özelliklere göre böler
Şunun için versiyonlar var:
ArcGIS 10.0 veya daha yüksek sürümünüz varsa, bunu çok basit bir modelle başarabilirsiniz.
Feature Iterator ile bir model oluşturun, burada alana göre grup seçmek istediğiniz özelliktir ve daha sonra benzersiz bir dosya adı sağlamak için çıktıyı satır içi ikame kullanarak kopya özellikleri aracına gönderin. Model aşağıda gösterilmiştir:
ArcMap 10'a erişimim yok, sadece 9,3, ancak bundan çok farklı olmayacağını umuyorum.
Python'da öznitelik alanınızı farklı değerler için denetleyen basit bir komut dosyası oluşturabilir ve ardından her biri için orijinal Shapefile'E bir SELECT işlemi gerçekleştirir.
Python komut dizisine aşina değilseniz, yapmanız gereken tek şey IDLE'yi açmak (python GUI) yeni bir dosya oluşturmak ve aşağıdaki kodu kopyalamak. My_shapefile kodunuzu adapte ettikten sonra outputdir ve my_attribute çalışmalıdır.
# 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
Burada ArcMap 10 için Ayrılmış Katmanlara Göre Bölünmüş aracını gördünüz mü ? Eğer işe yaramazsa , ihtiyaçlarınız için Split (Analiz) kullanabilirsiniz .
Giriş Özelliklerini bölmek, çoklu çıkış özelliği sınıflarının bir alt kümesini oluşturur. Bölünmüş Alan'ın benzersiz değerleri, çıktı özelliği sınıflarının adlarını oluşturur. Bunlar hedef çalışma alanına kaydedilir.
Örnek kod:
import arcpy
arcpy.env.workspace = "c:/data"
arcpy.Split_analysis("Habitat_Analysis.gdb/vegtype", "climate.shp", "Zone",
"C:/output/Output.gdb", "1 Meters")
Split By Attribute
işlevselliği tanımlamasından ve cevabınızın çoğunlukla ilgili olmasından endişe ediyorum Split [By Geometry]
.
Ben kullanılan AlexandreNeto senaryosunu @ ve ArcGIS 10.x için güncellenmiş kullanıcılar. Temelde şimdi "arcgisscripting" yerine "arcpy" almak zorundasınız:
# 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
Bunu yapmanın daha kolay bir yolu ... ve bir GDB'ye çıktı.
http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html
aracı USGS'den indirin, 1 saattir uğraştığım şeyi yapmak 3 dakika sürdü.
Model oluşturucuda bir yineleyici kullanabileceğinizi biliyorum, ancak burada python kullanmayı tercih ediyorsanız, geldiğim bir şey var. Komut dosyasını, Giriş shpfile, alanlar (çoklu değer, girişten elde edilmiş) ve çalışma alanı olarak, parametreleri içeren bir araç kutusuna ekleyin. Bu betik, shapefile öğesini seçtiğiniz alanlara göre birden çok shapefile böler ve seçtiğiniz bir klasöre çıkarır.
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)
Sonunda SearchCursor ve Select_analysis ile çalışma var
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')
ModelBuilder'daki İterate Özellik Seçimi araçlarına aşina değilim, ancak Python kodu olarak arcpy kullanılarak çağrılabileceğini belirttikten sonra dışa aktarıyorum.
# 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")
Bir özellik sınıfındaki bireysel özellikler arasında dolaşmak ve yalnızca özelliklerin benzersiz özellik sınıflarına yazmak için bir Arama İmleci kullanabilirsiniz. Bu örnekte, ABD'nin bir özellik sınıfını kullanıyorum ve durumları yeni şekil dosyalarına aktarıyorum:
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)
cursor
işlem gerektiren diğer iş akışlarına sarılabileceğidir .
Her özelliği dışa aktarmak için Kopyalama Özellikleri'nde (Veri Yönetimi) bir geometri belirteci (SHAPE @) kullanabilirsiniz .
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)
Arcpy'de, Cursors katman / TableView seçimlerini onurlandırır. ArcGIS for Desktop’ın Python kodunu kullanarak seçtiği özelliklerin listesine göre ? , sadece özellik seçimlerini yineleyebilirsiniz.
Ancak arcpy kullanarak bir seçim yapmak istiyorsanız, SelectLayerByAttribute_management aracını kullanın .
Split By Attributes
sürekli bireysel üretir.dbf
tabloları değil, bireysel özellik sınıfları. Ancak, ArcGIS Desktop 10.6'da aynı araç doğru bireysel şekil dosyaları oluşturur . Nedenini anlamıyorum ve çalışma dizini hem klasöre hem de coğrafi veritabanına ayarlamaya çalışırken aynı çıktıları aldım.