ArcGIS Desktop kullanarak alan değerlerini temel alarak özellik sınıfını çoklu özellik sınıflarına aktarma?


Yanıtlar:


44

Özniteliklere Göre Böl aracını kullanabilirsiniz:

Giriş veri kümesini benzersiz özelliklere göre böler

Şunun için versiyonlar var:


içinde ArcCatalog'da 10.6, Split By Attributessürekli bireysel üretir .dbftabloları 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.
maycca

22

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:

Özniteliğe göre çıkarmak için model


16

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

13

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.

Bölünmüş

Ö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")

Yerleşik Bölme aracı, bölmek istediğiniz çokgenlerinizle aynı boyutta bir dikdörtgen oluşturursanız amaçlarınız için harika çalışır.
ccn

Soruyu yanlış anlamadığım sürece, "Konuma Göre Böl" yerine, "Özete Göre Böl" adını istediğini düşünüyorum. Bölünme (Analiz), "Konuma Göre Böl" işlevi sağlar. Buradaki @ccn tarafından yapılan yorum, belki de bu cevaba "açıklama" olarak düzenlenebilecek ilginç bir geçici çözüm sunar.
PolyGeo

Sorunun Split By Attributeişlevselliği tanımlamasından ve cevabınızın çoğunlukla ilgili olmasından endişe ediyorum Split [By Geometry].
PolyGeo

Bağlantı koptu
PolyGeo

9

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

6

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ü.


Bağlantı için teşekkür ederiz! Bir cazibe gibi çalışır (ve 10.2 sürümü için!)
WolverineTime

Bu aracı yakın zamanda denedim ve uygulattığımda hiçbir şey olmadı. Özelliğimi seçtim, özellikleri seçmek için alanı seçtim, çıkış yeri seçtim, Tamam'a bastım ve hiçbir şey olmadı. Sadece "gitmez" ... bir şey mi özlüyorum? Teşekkürler!
rachel.passer

6

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)

4

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')

3

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")

3

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)

Bence bu cevabın dezavantajı, nitelikleri taşımamanız. Daha çok gis.stackexchange.com/a/152165/115 gibi bir cevabı tercih ederim .
PolyGeo

Ancak, @PolyGeo için iyi olan nokta, bunun tersi, bunun da cursorişlem gerektiren diğer iş akışlarına sarılabileceğidir .
Aaron

... ancak FeatureClassToFeatureClass yerine Select_analysis kullanarak olabilir - değişecek tek bir kod satırı.
PolyGeo

2

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)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.