Respostas:
Você pode usar a ferramenta Dividir por atributos:
Divide um conjunto de dados de entrada por atributos exclusivos
Existem versões disponíveis para:
Você pode conseguir isso com um modelo muito simples se tiver o ArcGIS 10.0 ou superior.
Crie um modelo com o Feature Iterator em que o grupo por campo é o atributo que você deseja selecionar e envie a saída para a ferramenta de recursos de cópia usando a substituição em linha para garantir um nome de arquivo exclusivo. O modelo é mostrado abaixo:
Não tenho acesso ao ArcMap 10, apenas 9.3, mas espero que não seja muito diferente disso.
Você pode criar um script simples em Python, que verifica o seu campo de atributo em busca de valores diferentes e, em seguida, cada um deles executa uma operação SELECT no Shapefile original.
Se você não estiver familiarizado com scripts python, tudo o que você precisa fazer é abrir o IDLE (a GUI do python), criar um novo arquivo e copiar o código abaixo. Depois de adaptar o código para o meu my_shapefile, outputdir e my_attribute devem funcionar.
# 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
Você viu a ferramenta Dividir camada por atributos atualizada para o ArcMap 10 aqui ? Se não funcionar, você pode usar o Split (Analysis) para suas necessidades.
A divisão dos recursos de entrada cria um subconjunto de várias classes de recursos de saída. Os valores exclusivos do campo de divisão formam os nomes das classes de recursos de saída. Eles são salvos no espaço de trabalho de destino.
Código de exemplo:
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
funcionalidade e sua resposta seja principalmente Split [By Geometry]
.
Usei o script do @ AlexandreNeto e atualizei-o para usuários do ArcGIS 10.x. Agora você precisa importar "arcpy" em vez de "arcgisscripting":
# 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
Esta é uma maneira ainda mais fácil de fazer isso ... e gera em um GDB.
http://www.umesc.usgs.gov/management/dss/split_by_attribute_tool.html
baixar a ferramenta do USGS, levei 3 minutos para fazer o que eu estava tentando por 1 hora.
Eu sei que você pode usar um iterador no construtor de modelos, mas se você preferir usar python aqui, é algo que eu inventei. Inclua o script em uma caixa de ferramentas com os parâmetros em ordem como arquivo shp de entrada, campos (valores múltiplos, obtidos da entrada) e espaço de trabalho. Esse script dividirá o shapefile em vários shapefiles com base nos campos selecionados e os produzirá em uma pasta de sua escolha.
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)
Acabei conseguindo trabalhar com o SearchCursor e o 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')
Não estou familiarizado com as ferramentas Iterate Feature Selection no ModelBuilder, mas exportando apenas isso como código Python indica que elas podem ser chamadas usando o arcpy.
# 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")
Você pode usar um Cursor de Pesquisa para percorrer recursos individuais em uma classe de recurso e gravar apenas as geometrias em classes de recurso exclusivas. Neste exemplo, eu uso uma classe de recurso dos EUA e exporto os estados para novos shapefiles:
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
operações.
Você pode usar um token de geometria (SHAPE @) em Recursos de cópia (Gerenciamento de dados) para exportar cada recurso.
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)
No Arcpy, os Cursores respeitam as seleções de camada / TableView. De acordo com a Lista de recursos selecionados no ArcGIS for Desktop usando o código Python?, você pode simplesmente iterar as seleções de recursos.
No entanto, se você quiser fazer uma seleção usando o arcpy, use a ferramenta SelectLayerByAttribute_management .
Split By Attributes
gera constantemente.dbf
tabelas individuais , não classes de recursos individuais. Porém, no ArcGIS Desktop 10.6, a mesma ferramenta gera corretamente shapefiles individuais . Não entendo o porquê e obtive as mesmas saídas tentando definir o diretório de trabalho para a pasta ou o geodatabase.