Есть ли быстрый способ очистить все атрибуты от слоя, но оставить полигоны на месте?

9

У меня есть слой Shapefile в QGIS 2.6 с несколькими полигонами, каждый из которых имеет данные более чем в 100 полях. Мне нужно создать новый слой со всеми теми же полигонами, но со всеми их полями данных пустыми (установить в 0, пустым или пустым в зависимости от типа поля). Есть ли более быстрый способ сделать это, чем нажимать «Удалить» на каждом поле каждого многоугольника по одному, мне пришлось бы делать это более 1000 раз таким образом.

alphabetasoup
источник
1
Пожалуйста, измените вопрос, включив в него версию программного обеспечения ГИС и формат данных (например, шейп-файл, FGDB, PostGIS, ..)
Винс

Ответы:

3

Разве вы не можете просто скопировать и вставить свои данные в слой X (слой / шейп -файл / класс пространственных объектов / любой другой), который не имеет атрибутов (кроме OID и Geometry), а затем скопировать и вставить теперь «пустую» геометрию обратно в ваш оригинальный слой?

user23715
источник
6

Вы можете ввести следующий код в консоли Python, чтобы очистить ВСЕ атрибуты NULLдля шейп-файла, загруженного в QGIS. Выберите слой на панели слоев (оглавление) и запустите код:

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()   
for field in layer.dataProvider().attributeIndexes():   
    for feature in layer.getFeatures(): 
        layer.changeAttributeValue(feature.id(), field, NULL)    

layer.commitChanges()        

Это было проверено на QGIS 2.8.2.


ОБНОВЛЕНИЕ :

В ответ на комментарий @Vince следующий код может быть непосредственно скопирован / вставлен в консоль Python и будет изменять значения атрибутов в зависимости от типа поля (то есть 0для целочисленных полей; NULLдля строковых полей; и эпоха 1900-01-01для Дата поле):

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()  
for field in layer.pendingFields():
        if field.typeName() == 'Integer':
                name_int = field.name()
                for feature in layer.getFeatures():
                        feature[name_int] = '0'
                        layer.updateFeature(feature)
        if field.typeName() == 'String':
                name_str = field.name()
                for feature in layer.getFeatures():
                        feature[name_str] = NULL
                        layer.updateFeature(feature)
        if field.typeName() == 'Date':
                name_dat = field.name()
                for feature in layer.getFeatures():
                        feature[name_dat] = '1900-01-01'
                        layer.updateFeature(feature)
layer.commitChanges()
Джозеф
источник
1
Можете ли вы настроить логику, чтобы назначить ноль для чисел, пустое / NULL для строк и эпоху для дат?
Винс
@ Vince - Спасибо, приятель, я, конечно, могу попробовать, поскольку я не эксперт в этом вопросе :)
Джозеф
@ Vince - Еще раз спасибо за упоминание о твике, я случайно узнал больше о python =)
Джозеф
1
Я думаю, мой возраст показывает, когда я думаю о эпохе 1 января 1970 или 1900 года, а не 2000;)
Винс
3

Вы можете просто сохранить его как новый файл и установить флажок «Пропустить создание атрибута» в диалоговом окне «Сохранить как ...». Он делает именно то, что говорит.

Будет один столбец числового счетчика с именем FID, по-видимому, для формата Shapefile требуется хотя бы один атрибут? Если можете, используйте что-то лучшее, пространственный или геопакетный.

bugmenot123
источник
+1, вы правы, так как должен быть хотя бы один атрибут. Но это очень хороший и простой метод, так как вы можете запустить Калькулятор поля и заменить все значения FID на NULL.
Джозеф
1
Поведение QGIS кажется странным. Столбец FID является редактируемым и не является фактическим отображением между геометрией и атрибутами. Если вы удалите столбец, вы получите один с именем «идентификатор функции», который нельзя редактировать. Это уже первый результат. QGIS 2.10. Я сообщу об ошибке позже.
bugmenot123
2

Откройте файл .dbf с помощью openoffice или других и удалите данные.
Вы можете использовать python для зацикливания файлов и удаления всех, кроме заголовков. См. Dbf python module

julsbreakdown
источник
1
Использование инструментов, игнорирующих шейп-файл, в компоненте файла dBase может привести к повреждению шейп-файла. Если целью является заполнение пробелов и нулей, «удаление» данных, скорее всего, приведет только к созданию файла dBase с меньшим количеством записей, чем .shp / .shx.
Винс
Действительно, но мы просто удаляем данные, риска нет.
julsbreakdown
Нет, задача состоит в том, чтобы сохранить полигоны и очистить соответствующие атрибуты, поэтому риск очень высок. Любой ответ, который не предупреждает о возможной коррупции, недостаточно серьезно относится к риску.
Винс
Я признаю, что это трудный путь, то есть не обычный, но он работает. Очевидно, что можно сохранить резервную копию исходных данных.
Leehan
В этом особом случае риск не так велик, потому что все атрибуты во всех полях инициализированы. Поэтому, если порядок записей в файле dbf изменяется, он все равно не создаст беспорядка, поскольку все записи имеют одинаковые данные в атрибутах. Пользователь все равно должен позаботиться о том, чтобы количество функций в .dbf было таким же, как и в .shp. Однако, как писал @Vince, пользователей следует предупредить, что a) изменение порядка строк, b) количество строк в .dbf, как правило, приводит к поврежденному и непригодному шейп-файлу.
user30184
2

QGIS может открывать файлы форм без .dbf.

Таким образом, вы можете просто удалить компонент .dbf и загрузить в .shp, который будет вводить только геометрию.

HeikkiVesanto
источник
Это хороший совет, хотя я лично воздерживаюсь от удаления каких-либо связанных файлов :)
Джозеф
1
Да, переименование может быть более безопасным вариантом.
ХейккиВесанто,
2

Возможно, вы можете отредактировать файл * .dbf в Excel.

Затем вы удаляете все поля, кроме одного.

Наконец сохраните и выйдите.

Было бы полезно сохранить архив * .shp перед этим.

Leehan
источник
Смысл в том, чтобы сохранить схему неповрежденной, поэтому только значения атрибутов должны быть установлены в значения по умолчанию. И вы не можете сохранить в формате DBF с Excel.
user30184
2
Поле геометрии не существует в компоненте dBase шейп-файла.
Винс
сразу нет поля wkt при редактировании dbf с excel.
Leehan
Поле FID связывает строки в .dbf с геометрией, которая хранится в .shp. На самом деле .dbf не имеет ничего общего с геометрией. ru.wikipedia.org/wiki/Shapefile
mr.adam,
1

В QGIS 2.8.x вы также можете избавиться от определенных или всех полей. Откройте таблицу атрибутов, переключите режим редактирования, нажмите кнопку «Удалить столбец», выберите все ненужные атрибуты и нажмите «ОК». Сохранить изменения.

Куитлахуак Эрнандес-Сантьяго
источник