Чи є швидкий спосіб очистити всі атрибути від шару, але залишити полігони на місці?


9

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


1
Будь ласка, відредагуйте питання, щоб включити версію програмного забезпечення GIS та формат даних (наприклад, shapefile, FGDB, PostGIS, ..)
Vince

Відповіді:


3

Чи не можете ви просто скопіювати та вставити свої дані в шар X (шар / форма файлу / клас функції / будь-який інший), який не має атрибутів (крім OID та геометрії), а потім скопіювати та вставити назад "порожню" геометрію назад у ваш початковий шар?


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 потрібен хоча б один атрибут? Якщо можете, використовуйте щось краще, просторовий або геопакет.


+1, ти маєш рацію, оскільки має бути принаймні один атрибут. Але це дуже приємний і простий метод, оскільки ви можете запустити Field Calculator і замінити всі значення FID на NULL.
Йосип

1
Поведінка QGIS здається дивним. FID стовпця можна редагувати, і це не фактичне відображення між геометрією та атрибутами. Якщо ви видалите стовпець, ви отримаєте один названий "ідентифікатор функції", який не можна редагувати. Це вже має бути перший результат. QGIS 2.10. Пізніше я подам помилку.
bugmenot123

2

Відкрийте .dbf файл з openoffice або іншими особами та видаліть дані.
Ви можете використовувати python для циклічного перегляду файлів та видалення всіх, крім заголовків. Див. Модуль python dbf


1
Використання форм-файлів-необізнаних компонентів файлу dBase, ймовірно, може призвести до пошкодження форм-файлу. Якщо мета - заповнити пробіли та нулі, "видалення" даних, ймовірно, створить лише файл dBase з меншою кількістю записів, ніж .shp / .shx.
Вінс

Дійсно, але ми просто видаляємо дані, ризику немає.
julsbreakdown

Ні, завдання - зберегти багатокутники та очистити відповідні атрибути, тому ризик дуже високий. Будь-яка відповідь, яка не попереджає про потенційну корупцію, не ризикує достатньо серйозно.
Вінс

Я усвідомлюю, що це важкий шлях, тобто не звичайний, але він працює. Очевидно, що бажано зберігати резервну копію вихідних даних.
Ліхан

У цьому спеціальному випадку ризик не настільки великий, оскільки всі атрибути у всіх полях ініціалізовані. Отже, якщо порядок записів у файлі dbf змінюється, він все одно не буде безладно, оскільки всі записи мають однакові дані в атрибутах. Користувач все ще повинен подбати про те, щоб кількість функцій у .dbf було таким же, як у .shp. Однак, як писав @Vince, користувачів слід попередити, що а) зміна порядку рядків b) кількість рядків у .dbf, як правило, призводить до пошкодженого та непридатного файлу форм.
користувач30184

2

QGIS може відкривати файли форми без .dbf.

Таким чином, ви можете просто видалити .dbf компонент і завантажити в .shp, що введе лише геометрію.


Це хороша порада, хоча я особисто утримуюся від того, щоб не видаляти пов'язані файли :)
Джозеф

1
Так, перейменування може бути більш безпечним варіантом.
HeikkiVesanto

2

Можливо, ви можете відредагувати файл * .dbf за допомогою Excel.

Потім ви видаляєте всі поля, окрім Geom.

Нарешті збережіть та киньте.

Було б корисно зберегти архів * .shp перед цим.


Здається, сенс полягає в тому, щоб зберегти схему недоторканою, тому лише значення атрибутів повинні бути встановлені на деяке значення за замовчуванням. І ви не можете зберегти у форматі dbf за допомогою Excel.
користувач30184

2
Поле геометрії не існує в компоненті dBase файлу форм.
Вінс

прямо тут немає поля wkt під час редагування dbf за допомогою excel.
Ліхан

Поле FID пов'язує рядки в .dbf з геометрією, яка зберігається в .shp. Дійсно, .dbf не має нічого спільного з геометрією. en.wikipedia.org/wiki/Shapefile
mr.adam

1

У QGIS 2.8.x ви також можете позбутися конкретних або всіх полів. Відкрийте таблицю атрибутів, Увімкніть режим редагування, натисніть кнопку "Видалити стовпець", Виберіть усі непотрібні атрибути та натисніть "ОК". Збережіть зміни.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.