У меня есть скрипт Python, который добавляет поле атрибута в Shapefile, если он не существует. Это легко сделать с ArcGIS (графически или через Python), но я ищу что-то, что не зависит от ArcGIS.
Я попытался это безуспешно с OGR, так как мой Shapefile содержит функции .
Я посмотрел на pyshp , но так же нет способа изменить схему после ее создания. Я не пробовал использовать шейп-файл (для Python) , но я не вижу эту функцию рекламируемой. Я также не могу понять, как это можно сделать, переделав файл DBF через dbfpy .
У кого-нибудь есть какие-либо идеи?
Ответы:
Вам следует взглянуть на эти вопросы, поскольку на них уже дан ответ: Как добавить собственные атрибуты объектов в Shapefile с помощью Python?
/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python
Если вы хотите в результате только один шейп-файл, просто удалите ваши входные файлы в конце вашего скрипта.
источник
Вот решение. Лучше поздно, чем никогда:
http://geospatialpython.com/2013/04/add-field-to-existing-shapefile.html?m=1
источник
Благодаря довольно мертвому формату, называемому DBF, добавление полей в шейп-файлы с существующими данными атрибутов невозможно без переписывания или добавления отступов в DBF. Я не знаю готового решения, но я бы написал сценарий для создания нового шейп-файла на основе существующего и добавления дополнительных полей в новый шейп-файл. Затем скопируйте данные геометрии / атрибута из старого в новый шейп-файл. И, как последний шаг, удалите старый шейп-файл и переименуйте новый. Все это довольно легко сделать, используя привязки OGR Python.
Кроме того, вы можете использовать dbfpy, чтобы сделать выше, только с файлом DBF. Порядок шагов остается прежним:
Вам не нужно вносить какие-либо изменения в сам шейп-файл (.shp) или любые другие файлы, поскольку они не ссылаются на информацию атрибутов, содержащуюся в DBF. Однако вам необходимо сохранить порядок записей в старом и новом DBF одинаковым.
источник
DBFpy должен работать для этого. Вы видели пример на этой странице:
http://dbfpy.sourceforge.net/
Убедитесь, что шейп-файл не редактировался никаким другим приложением, в том числе ArcGIS, так как это может вызвать проблемы при блокировке.
источник
from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
Я нашел решение с помощью OGR и благодаря помощи из предыдущего вопроса . Вот полный пример:
Моя проблема была в том, что я использовал,
layer_defn.AddFieldDefn(new_field)
а неlayer.CreateField(new_field)
. Большое спасибо за помощь, и я извиняюсь за то, что не проверил досконально аналогичный другой вопрос.источник