Exportando classe de recurso para várias classes de recurso com base em valores de campo usando o ArcGIS Desktop?

34

Tenho uma classe de recursos com mais de 2.000 recursos e preciso transformá-los em todas as classes de recursos individuais com base em um campo.

Existe uma maneira de fazer isso?

Sophie
fonte

Respostas:

44

Você pode usar a ferramenta Dividir por atributos:

Divide um conjunto de dados de entrada por atributos exclusivos

Existem versões disponíveis para:

artwork21
fonte
no ArcCatalog 10.6, Split By Attributesgera constantemente .dbftabelas 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.
maycca 04/11
22

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:

Modelo para extração por atributo

Hornbydd
fonte
16

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
Alexandre Neto
fonte
13

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.

Dividido

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")
Aragão
fonte
A ferramenta Dividir interna funciona muito bem para seus propósitos, se você criar um retângulo de extensão do mesmo tamanho dos polígonos que deseja dividir.
CCN
A menos que eu esteja interpretando mal a pergunta, acho que ela está pedindo uma "Divisão por atributo" em vez de uma "Divisão por localização". Split (Analysis) fornece a funcionalidade "Split By Location". O comentário de @ccn aqui oferece uma solução alternativa interessante que talvez possa ser editada como um "esclarecimento" para esta resposta.
PolyGeo
Eu me preocupo que a pergunta descreva a Split By Attributefuncionalidade e sua resposta seja principalmente Split [By Geometry].
PolyGeo
O link está quebrado
PolyGeo
9

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
zehpunktbarron
fonte
6

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.

David Ainley
fonte
Obrigado pelo link! Funciona como um encanto (e para a versão 10.2!)
WolverineTime
Eu tentei essa ferramenta recentemente e nada aconteceu quando a executei. Eu escolhi meu recurso, selecionei o campo para selecionar recursos, selecionei um local de saída, pressione OK e nada aconteceu. Simplesmente não iria "... estou perdendo alguma coisa? Obrigado!
Rachel.passer 28/05
6

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)
Isaac
fonte
4

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')
Samuel_NET
fonte
3

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")
perturbador
fonte
3

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)
Aaron
fonte
Eu acho que a desvantagem desta resposta é que você não realiza os atributos. Prefiro uma resposta mais parecida com gis.stackexchange.com/a/152165/115 .
PolyGeo
Bom ponto @PolyGeo, no entanto, a vantagem é que isso pode ser envolvido em outros fluxos de trabalho que também exigem cursoroperações.
Aaron
... mas também poderia usar o Select_analysis no lugar de FeatureClassToFeatureClass - é apenas uma linha de código que mudaria.
PolyGeo
2

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)
Aaron
fonte