Saya telah menulis skrip python menggunakan arcpy yang menampilkan kelas fitur poligon menjadi File Geodatabase. Saya telah menambahkan fungsi untuk mengekspor atribut ke file CSV yang terpisah. Saya menggunakan kode yang saya temukan di posting ini yang berfungsi dengan baik. Namun, kode itu mengekspor setiap kolom di kelas fitur. Saya hanya ingin mengekspor bidang yang tidak memiliki nama berikut: OBJECTID
, Shape
, atau Shape_Length
.
File CSV saya berhasil dibuat, dan dengan benar tidak menyertakan bidang OBJECTID
atau Shape_Length
. Namun, Shape
bidang ini ditulis ke file. Nilai contoh yang ditulis untuk bidang itu adalah:
<geoprocessing describe geometry object object at 0x28CB90A0>
Saya telah menambahkan baris untuk mencetak nama-nama bidang karena berulang melalui mereka dan secara mengejutkan, Shape
tidak dicetak. Seolah-olah ArcGIS menyembunyikannya atau memberinya nama yang berbeda.
Kode untuk fungsi saya di bawah:
def exportToTable():
"""
Exports the final outputs to a CSV File.
"""
# Create path to CSV File (note the varialbe outputPath is declared elsewhere).
CSVFile = outputPath+'\\FinalOutput.csv'
arcpy.AddMessage("Created CSV File: %s" %CSVFile)
# Get all fields in FinalOutput feature class and remove unwanted fields.
fields = arcpy.ListFields('FinalOutput')
for field in fields:
arcpy.AddMessage("Field.name is:"+field.name) #not printing 'Shape' field name
if field.name in (['OBJECTID', 'Shape', 'Shape_Length']):
fields.remove(field)
i = 1
f=open(CSVFile, 'w')
for field in fields:
#--write the wanted field names to the output file
if i < len(fields):
f.write('%s,' % field.name)
i += 1
else:
f.write('%s\n' % field.name)
# Use a search cursor to iterate through the rows of the table and write them to the CSV file.
rows = arcpy.SearchCursor('FinalOutput')
for row in rows:
i = 1
for field in fields:
if i < len(fields):
f.write('%s,' % row.getValue(field.name))
i += 1
else:
f.write('%s\n' % row.getValue(field.name))
del rows
f.close()
Adakah yang tahu apa yang terjadi di sini?
Saya memodifikasi kode saya untuk mengikuti saran dari @sgrieve dan masih menulis kolom Shape
. Jika saya menambahkan baris untuk mencetak nama field sebagai iterates melalui mereka, itu daftar semua bidang kecuali dalam Shape
lapangan, namun masih menulis ke CSV tersebut. Itu juga menambahkan koordinat X dan Y dari poligon sebagai dua kolom baru dan kolom tidak lagi selaras dengan nama kolom.
Saya telah memodifikasi baris tempat @sgrieve menyatakan bidang sebagai berikut:
fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']
Kode baru berfungsi dengan baik, tapi saya masih tidak yakin apa masalahnya. Adakah yang tahu apa yang sedang terjadi? Apa masalahnya dengan Shape
bidang itu?
Shape
bidang ini ditulis ke file? Sementara kode @ sgrieve mungkin memperbaiki kode saya, itu tidak menyelesaikan masalah.Jawaban:
Saya telah menyederhanakan kode Anda dan memperbaiki kesalahan dengan menggunakan modul da yang diperkenalkan pada 10.1. Ini sangat merampingkan pembacaan data menggunakan kursor, dan digunakan bersama dengan
with
perintah kode ini harus lebih stabil daripada jika menggunakan metode akses file yang lebih lama.Ini bekerja dengan membuat daftar semua bidang dan kemudian menghapus bidang yang tidak Anda inginkan dari daftar. Ini bisa dilakukan dalam pemahaman daftar, tetapi itu akan sangat berantakan dan tidak pythonic. Setelah daftar bidang yang diinginkan telah dibuat, ia digunakan dengan modul da untuk membaca semua data dalam bidang ini ke dalam kursor. Ini kemudian dapat diulang dan ditulis ke file menggunakan pemahaman daftar lain untuk bergabung dengan semua bidang. Ini memiliki manfaat bekerja untuk sejumlah bidang yang lebih besar dari 0.
sumber
Shape
bidang masih ditulis tetapi nilai Shape tidak. 2. Sekarang ada dua kolom baru yang telah ditambahkan ke awal tabel secara efektif menggeser kolom ke kanan. Kolomnya tampak sebagai koordinat X dan Y dari poligon.Shape
bidang - mungkin karena ini adalah tipe geometri. Jadi, saya telah memodifikasi baris tempat Anda menyatakanfields
sebagai berikut:fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']
yang melakukan trik. Tidak yakin mengapa itu tidak berhasil tanpanya.Saya pikir saya mengalami masalah yang sama dan menemukan alasan mengapa bidang Anda "Bentuk" tidak dihapus. Saat menggunakan loop ini:
Saya telah menemukan bahwa sebenarnya hanya menghapus setiap bidang lainnya. Jadi pertama-tama akan melalui, menghapus 'OBJECTID', dan kemudian bidang 'Bentuk' pergi ke tempat yang sebelumnya dimiliki oleh 'OBJECTID' dalam daftar, sehingga bergerak ke yang berikutnya, yang kemudian akan menjadi 'Shape_Length'.
Jadi bukan geometri Shape yang mencegahnya dihapus, hanya fakta bahwa itu menghilangkan setiap bidang lain saat menggunakan skrip ini.
sumber
Kunci untuk satu aspek dari ini adalah menentukan nama yang tepat untuk bidang id objek dan geometri yang tidak ditentukan pengguna. Jenis bidang geometri adalah Ganda, yang tidak membantu dalam kasus ini. Dengan menggunakan fungsi uraikan, seseorang dapat menentukan nama yang tepat untuk bidang-bidang ini di seluruh tipe file (mis. Shapefile v file gdb, dll; mengurangi banyak kesedihan karena oid akan berubah bahkan dalam tipe file yang sama di waktu ...).
sumber