Dalam ArcGIS 10 dan Python saya ingin mendapatkan info (xmax, ymax, xmin, ymin) dari masing-masing poligon dalam sebuah shapefile.
Saya bisa mendapatkan sejauh mana seluruh shapefile menggunakan
file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax
394551.52085039532
Tapi sepertinya saya tidak tahu cara mendapatkan info yang sama untuk setiap baris dalam dataset.
rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
print row
mencetak 31 baris dalam dataset tetapi
for row in rows:
desc=arcpy.Describe(row)
print desc.extent.Xmax
memberikan kesalahan.
Runtime error: Object: Menggambarkan nilai input bukan tipe yang valid
Saya sedang berpikir untuk menambahkan nilai-nilai luas ke tabel menggunakan "menghitung geometri" tetapi ini hanya memberikan centroid. Maka saya kira kita bisa menggunakan sesuatu seperti row.GetValue ("xmax").
Itu dikatakan saya tahu bahwa kita dapat membuat X / Y, maks / mnt menggunakan fungsi dari http://www.ian-ko.com/free/free_arcgis.htm tetapi akan lebih baik jika kita dapat menghindari keharusan menambahkan bidang, terutama jika ArcPy bisa mendapatkan nilai-nilai ini.
Pada dasarnya saya perlu mendapatkan luasan untuk dimasukkan ke alat klip untuk menghapus 30 bidang data (sesuai dengan 1: 100.000 lembar peta) untuk geoproses karena alat Split gagal karena ukuran besar dataset (lihat Mengapa Intersect memberikan GALAT 999999: Fungsi pengeksekusi kesalahan Topologi Tidak Valid [Terlalu banyak baris dan titik akhir]? ). Saya ingin mengotomatiskan ini karena diulang pada sejumlah dataset.
=== skrip yang berfungsi ===
# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.
#Licence: Creative Commons
#Created by: George Corea; [email protected], [email protected]
import arcpy, string
#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB
inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"
#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True
rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
feat = row.getValue(shapeName)
Name = row.Name_1
print "Executing clip on: "+str(Name)
extent = feat.extent
#print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
XMAX = extent.XMax
XMIN = extent.XMin
YMAX = extent.YMax
YMIN = extent.YMin
pnt1 = arcpy.Point(XMIN, YMIN)
pnt2 = arcpy.Point(XMIN, YMAX)
pnt3 = arcpy.Point(XMAX, YMAX)
pnt4 = arcpy.Point(XMAX, YMIN)
array = arcpy.Array()
array.add(pnt1)
array.add(pnt2)
array.add(pnt3)
array.add(pnt4)
array.add(pnt1)
polygon = arcpy.Polygon(array)
ShapeFile = outDir+"\\temp_poly"
arcpy.CopyFeatures_management(polygon, ShapeFile)
#print Name
### Set local variables
in_features = inFile
clip_features = ShapeFile
out_feature_class = outDir+"\\"+Name
xy_tolerance = "0.22"
# Execute Clip
try:
arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
print "Completed: "+str(Name)
except:
error = arcpy.GetMessages()
print "Failed on: "+str(Name)+" due to "+str(error)
sumber
Jawaban:
Dapatkan objek bentuk di kursor Anda dan akses properti luasnya. Lihat Bantuan ArcGIS Bekerja dengan geometri dengan Python :
sumber
The Batas Kontainer toolset tidak persis apa yang Anda inginkan. Jika Anda hanya ingin potongan kode, periksa fungsi-fungsi di dalam skrip, satu berurusan secara eksplisit dengan luasnya.
EDIT
Saya harus menambahkan bahwa skrip akan menambahkan nilai ke bidang Kiri, Kanan, Atas dan Bawah dalam file output yang dibuat yang dapat digunakan untuk pemrosesan selanjutnya
sumber
Saya baru saja mencoba Geometri Batas Minimum (Amplop) (dalam Manajemen Data) di ArcGIS 10 dan tampaknya melakukan hal yang persis sama, untuk semua bidang.
sumber
Cara lain adalah dengan melakukan SearchCursor () pada shapefile, maka Anda dapat menggunakan row.shape.extent:
sumber
Seperti yang tercakup dalam Ekstraksi koordinat titik poligon di ArcMap? Anda bisa mendapatkan simpul dari poligon dan kemudian menambahkan koordinat x dan y dari setiap simpul sebagai bidang dalam tabel atribut. Ini memiliki batasan tidak melampirkan koordinat max / min langsung ke setiap poligon tetapi ini dapat dicapai dalam beberapa cara.
Metode yang paling saya kenal adalah membaca bidang x dan y ke dalam daftar python menggunakan modul pyshp , yang kemudian dapat disortir untuk menemukan nilai maksimum dan minimum untuk setiap poligon. Pyshp kemudian dapat digunakan untuk membuka kelas penulis untuk menambahkan bidang baru ke poligon asli dan menulis nilai-nilai max dan min ini ke poligon yang benar.
Saya percaya ini bisa dilakukan menggunakan arcpy, tapi saya punya banyak masalah dengan menulis ke shapefile di 9.3 menggunakan geoprocessor, jadi saya lebih suka metode pyshp, namun saya tidak yakin apakah modul arcpy telah menyelesaikan masalah ini.
sumber
Apakah Anda mencoba menggunakan huruf kapital "M" di "XMax"? Saya pikir itu seharusnya:
dari pada
sesuai dengan dokumentasi . Tentu saja itu membuat saya bertanya-tanya bagaimana cuplikan kode pertama Anda bekerja. Apa pun itu, cobalah!
sumber