Я написал скрипт на python с использованием arcpy, который выводит класс пространственных объектов многоугольника в базу геоданных файлов. Я добавил функцию для экспорта атрибутов в отдельный файл CSV. Я использую код, который я нашел в этом посте, который отлично работает. Однако этот код экспортирует каждый столбец в классе объектов. Я только хочу , чтобы экспортировать поля , которые не имеют следующие названия: OBJECTID
, Shape
или Shape_Length
.
Мой файл CSV генерируется успешно, и он правильно не включает поля OBJECTID
или Shape_Length
. Тем не менее, Shape
поле будет записано в файл. Пример значения, которое записывается в это поле:
<geoprocessing describe geometry object object at 0x28CB90A0>
Я добавил строку для печати имен полей, так как они проходят через них и, Shape
как ни странно, не печатаются. Как будто ArcGIS скрывает его или дает другое имя.
Код для моей функции ниже:
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()
Кто-нибудь знает, что здесь происходит?
Я изменил свой код, следуя совету @sgrieve, и он все еще писал Shape
поле. Если добавить строку , чтобы напечатать имена полей , как он перебирает через них, в нем перечислены все поля , за исключением в Shape
поле, но он до сих пор пишет в CSV. Также добавлены координаты X и Y многоугольника в виде двух новых столбцов, и столбцы больше не выровнены с именами столбцов.
Я изменил строку, где @sgrieve объявляет следующие поля:
fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']
Новый код работает нормально, но я все еще не уверен, в чем проблема. Кто-нибудь знает, что происходит? Что за дело с Shape
полем?
Shape
поле было записано в файл? Хотя код @ sgrieve, возможно, улучшил мой код, он не решил проблему.Ответы:
Я упростил ваш код и исправил ошибку, используя модуль da, представленный в 10.1. Он значительно упрощает чтение данных с помощью курсоров и используется вместе с
with
командой, этот код должен быть более стабильным, чем если бы использовался более старый метод доступа к файлам.Он работает, составляя список всех полей, а затем удаляя ненужные поля из списка. Это можно сделать в рамках понимания списка, но это будет довольно грязно и непитонно. После создания списка требуемых полей он используется с модулем da для считывания всех данных в этих полях в курсор. Затем это можно перебрать и записать в файл, используя другое понимание списка, чтобы объединить все поля. Преимущество работы с любым числом полей больше 0.
источник
Shape
поля все еще записывается, а значения Shape - нет. 2. Теперь есть два новых столбца, которые были добавлены в начало таблицы, эффективно смещая столбцы вправо. Их столбцы являются координатами X и Y многоугольника.Shape
полем - возможно, потому что это тип геометрии. Итак, я изменил строку, где вы объявляетеfields
следующее:fields = [f.name for f in arcpy.ListFields('FinalCadastre') if f.type <> 'Geometry']
это сработало. Не уверен, почему без этого не получилось.Я думаю, что столкнулся с той же проблемой и обнаружил причину, по которой ваше поле "Форма" не было удалено. При использовании этого цикла:
Я обнаружил, что на самом деле это только удаление всех остальных полей. Таким образом, он сначала перебирает, удаляет «OBJECTID», а затем поле «Shape» переходит в место, которое ранее занимал «OBJECTID» в списке, поэтому оно переходит к следующему, которое затем будет «Shape_Length».
Так что не именно геометрия Shape препятствовала его удалению, а лишь тот факт, что она удаляет все остальные поля при использовании этого скрипта.
источник
Ключом к одному аспекту этого является определение правильного имени для не определенных пользователем полей идентификатора объекта и геометрии. Тип геометрического поля - Double, что в данном случае бесполезно. Используя функцию description, можно определить правильное имя для этих полей в разных типах файлов (например, shapefile v file gdb и т. Д .; устранение большого горя, поскольку oid будет меняться даже в пределах одного и того же типа файла ...).
источник