Câu trả lời:
Bạn có thể sử dụng công cụ Split By Attribution:
Chia một tập dữ liệu đầu vào theo các thuộc tính duy nhất
Có các phiên bản dành cho:
Bạn có thể đạt được điều này với một mô hình rất đơn giản nếu bạn có ArcGIS 10.0 trở lên.
Tạo một mô hình với Feature Iterator trong đó nhóm theo trường là thuộc tính bạn muốn chọn sau đó gửi đầu ra cho công cụ tính năng sao chép bằng cách sử dụng thay thế nội tuyến để đảm bảo tên tệp duy nhất. Mô hình được hiển thị dưới đây:
Tôi không có quyền truy cập vào ArcMap 10, chỉ 9.3, nhưng tôi hy vọng rằng nó sẽ không khác lắm so với điều này.
Bạn có thể tạo một tập lệnh đơn giản trong Python, để kiểm tra trường thuộc tính của bạn cho các giá trị khác nhau và sau đó, cho mỗi trong số chúng chạy một thao tác CHỌN cho Shapefile ban đầu của bạn.
Nếu bạn không quen thuộc với kịch bản python, tất cả những gì bạn cần làm là mở IDLE (GUI python) tạo một tệp mới và sao chép mã bên dưới. Sau khi điều chỉnh mã cho my_shapefile của bạn, outputdir và my_attribution nó sẽ hoạt động.
# 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
Bạn có thấy công cụ Split Layer By Attribution được cập nhật cho ArcMap 10 tại đây không? Nếu nó không hoạt động, bạn có thể sử dụng Split (Phân tích) cho nhu cầu của bạn.
Việc tách các tính năng đầu vào tạo ra một tập hợp con của nhiều lớp tính năng đầu ra. Các giá trị duy nhất của Trường phân chia tạo thành tên của các lớp đối tượng đầu ra. Chúng được lưu trong không gian làm việc đích.
Mã ví dụ:
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
chức năng và câu trả lời của bạn chủ yếu là về Split [By Geometry]
.
Tôi đã sử dụng tập lệnh của @ AlexandreNeto và cập nhật nó cho người dùng ArcGIS 10.x. Chủ yếu là bây giờ bạn phải nhập "arcpy" thay vì "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
Đây là một cách thậm chí dễ dàng hơn để làm điều này ... và nó xuất ra thành GDB.
http://www.umec.usgs.gov/manloyment/dss/split_by_attribution_tool.html
tải xuống công cụ từ USGS, tôi mất 3 phút để làm những gì tôi đã cố gắng trong 1 giờ.
Tôi biết bạn có thể sử dụng một trình vòng lặp trong trình xây dựng mô hình, nhưng nếu bạn thích sử dụng python thì đây là điều tôi nghĩ ra. Thêm tập lệnh vào hộp công cụ với các tham số theo thứ tự như Nhập shpfile, các trường (đa giá trị, thu được từ đầu vào) và không gian làm việc. Kịch bản lệnh này sẽ phân chia shapefile thành nhiều shapefile dựa trên các trường bạn chọn và xuất chúng vào một thư mục bạn chọn.
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)
Cuối cùng tôi đã có nó hoạt động với SearchC bổng và Chọn_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')
Tôi không quen thuộc với các công cụ chọn tính năng lặp trong ModelBuilder, nhưng xuất ra như mã Python chỉ ra rằng chúng có thể được gọi bằng cách sử dụng 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")
Bạn có thể sử dụng Con trỏ tìm kiếm để lặp qua các tính năng riêng lẻ trong một lớp đối tượng và chỉ viết các hình học cho các lớp đối tượng duy nhất. Trong ví dụ này, tôi sử dụng một lớp tính năng của Hoa Kỳ và xuất các tiểu bang sang các shapefile mới:
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
hoạt động.
Bạn có thể sử dụng mã thông báo hình học (SHAPE @) trong Tính năng sao chép (Quản lý dữ liệu) để xuất từng tính năng.
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)
Trong Arcpy, các lựa chọn lớp danh dự / Bảng xem danh dự. Theo danh sách Lấy các tính năng được chọn trong ArcGIS for Desktop bằng mã Python? , bạn chỉ có thể lặp lại các lựa chọn tính năng.
Tuy nhiên, nếu bạn muốn thực hiện lựa chọn bằng arcpy, hãy sử dụng công cụ SelectLayerByAttribution_man quản lý .
Split By Attributes
liên tục tạo các.dbf
bảng riêng lẻ , không phải các lớp tính năng riêng lẻ. Nhưng, trong ArcGIS Desktop 10.6, cùng một công cụ tạo ra các shapefile riêng lẻ . Tôi không hiểu tại sao và có cùng kết quả đầu ra khi cố gắng đặt thư mục làm việc cho cả thư mục hoặc cơ sở dữ liệu địa lý.