Exportation d'une classe d'entités dans plusieurs classes d'entités en fonction des valeurs de champ à l'aide d'ArcGIS Desktop?


Réponses:


44

Vous pouvez utiliser l'outil Fractionner par attributs:

Divise un jeu de données en entrée par attributs uniques

Il existe des versions disponibles pour:


dans ArcCatalog 10.6, Split By Attributesgénère en permanence des .dbftables individuelles et non des classes d'entités individuelles. Mais dans ArcGIS Desktop 10.6, le même outil génère correctement des fichiers de formes individuels . Je ne comprends pas pourquoi et j'ai obtenu les mêmes résultats en essayant de définir le répertoire de travail à la fois dans le dossier ou dans la géodatabase.
Maycca

22

Vous pouvez y parvenir avec un modèle très simple si vous utilisez ArcGIS 10.0 ou une version ultérieure.

Créez un modèle avec Feature Iterator dans lequel le champ group by est l'attribut que vous souhaitez sélectionner, puis envoyez la sortie à l'outil de copie des fonctionnalités en utilisant la substitution en ligne pour garantir un nom de fichier unique. Le modèle est présenté ci-dessous:

Modèle d'extraction par attribut


16

Je n'ai pas accès à ArcMap 10, seulement 9.3, mais je m'attends à ce que ce ne soit pas très différent de cela.

Vous pouvez créer un script simple en Python, qui vérifie les valeurs de votre champ d'attribut, puis exécute pour chacune d'elles une opération SELECT sur votre Shapefile d'origine.

Si vous n'êtes pas familier avec les scripts python, il vous suffit d'ouvrir IDLE (interface graphique python), de créer un nouveau fichier et de copier le code ci-dessous. Après avoir adapté le code pour votre fichier my_shapefile, outputdir et my_attribute, cela devrait fonctionner.

# 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

Avez-vous vu l'outil Split Layer By Attributes mis à jour pour ArcMap 10 ici ? Si cela ne fonctionne pas, vous pouvez utiliser Split (Analysis) pour vos besoins.

La scission des entités en entrée crée un sous-ensemble de plusieurs classes d'entités en sortie. Les valeurs uniques du champ fractionné forment les noms des classes d'entités en sortie. Ceux-ci sont enregistrés dans l'espace de travail cible.

Divisé

Exemple de code:

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

L'outil Séparer intégré fonctionne très bien pour vos besoins si vous créez un rectangle d'étendue de la même taille que vos polygones que vous souhaitez scinder.
ccn

À moins que je ne lise mal la question, je pense qu'il s'agit d'un "fractionnement par attribut" plutôt que d'un "fractionnement par emplacement". Split (Analysis) fournit la fonctionnalité "Split By Location". Le commentaire de @ccn ici offre une solution de contournement intéressante qui pourrait peut-être être modifiée comme une "clarification" de cette réponse.
PolyGeo

Je crains que la question décrit la Split By Attributefonctionnalité et votre réponse porte principalement sur Split [By Geometry].
PolyGeo

Le lien est cassé
PolyGeo

9

J'ai utilisé le script de @ AlexandreNeto et je l'ai mis à jour pour les utilisateurs d'ArcGIS 10.x. Principalement, vous devez maintenant importer "arcpy" au lieu 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

6

C’est un moyen encore plus facile de le faire ... et la sortie dans une GDB.

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

télécharger l'outil de USGS, m'a pris 3 minutes pour faire ce que j'avais essayé pendant 1 heure.


Merci pour le lien! Fonctionne comme un charme (et pour la version 10.2!)
WolverineTime

J'ai récemment essayé cet outil et rien ne s'est passé lorsque je l'ai exécuté. J'ai choisi ma fonctionnalité, sélectionné le champ pour sélectionner les fonctionnalités par, sélectionné un emplacement de sortie, appuyé sur OK et rien ne s'est passé. Il ne veut tout simplement pas "partir" ... est-ce que je manque quelque chose? Merci!
rachel.passer

6

Je sais que vous pouvez utiliser un itérateur dans le créateur de modèle, mais si vous préférez utiliser python, voici quelque chose que j'ai proposé. Ajoutez le script à une boîte à outils avec les paramètres dans l’ordre suivant: shpfile en entrée, champs (valeurs multiples, obtenus en entrée) et espace de travail. Ce script divise le fichier de formes en plusieurs fichiers de formes en fonction des champs que vous sélectionnez, puis les exporte dans un dossier de votre choix.

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

Je l'ai finalement obtenu avec SearchCursor et 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

Je ne connais pas bien les outils Iterate Feature Selection de ModelBuilder, mais exporter simplement cela en code Python indique qu'ils peuvent être appelés en utilisant 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")

3

Vous pouvez utiliser un curseur de recherche pour parcourir les entités individuelles d'une classe d'entités et écrire uniquement les géométries dans des classes d'entités uniques. Dans cet exemple, j'utilise une classe d'entités des États-Unis et exporte les États vers de nouveaux fichiers de formes:

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)

Je pense que l'inconvénient de cette réponse est que vous ne transposez pas les attributs. Je préfère une réponse plus semblable à gis.stackexchange.com/a/152165/115 qui le fera.
PolyGeo

Le point positif de @PolyGeo, cependant, c’est que cela peut être intégré à d’autres flux de travail qui nécessitent également des cursoropérations.
Aaron

... mais on pourrait aussi utiliser Select_analysis à la place de FeatureClassToFeatureClass - ce n'est qu'une ligne de code qui changerait.
PolyGeo

2

Vous pouvez utiliser un jeton de géométrie (SHAPE @) dans Fonctions de copie (Gestion des données) pour exporter chaque fonction.

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)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.