Réponses:
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:
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:
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
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.
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")
Split By Attribute
fonctionnalité et votre réponse porte principalement sur Split [By Geometry]
.
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
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.
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)
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')
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")
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)
cursor
opérations.
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)
Dans Arcpy, les curseurs honorent les sélections de calque / TableView. Selon Obtenir la liste des fonctionnalités sélectionnées dans ArcGIS for Desktop à l'aide de code Python?, vous pouvez simplement itérer les sélections de fonctionnalités.
Toutefois, si vous souhaitez effectuer une sélection à l'aide d'arcpy, utilisez l' outil SelectLayerByAttribute_management .
Split By Attributes
génère en permanence des.dbf
tables 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.