Як легко редагувати дані атрибутів за допомогою регулярних виразів?


30

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

Питання в тому, як змусити їх редагувати дані атрибутів. Я знаю, що це питання було задано і раніше , і відповідь раніше була простою: просто використовуйте Calc LibreOffice, щоб змінити його, а потім збережіть його, забезпечуючи збереження порядку і рядків заголовків. Я раніше використовував такий підхід з великим ефектом.

На жаль, рішення більше не працює: збереження файлу .dbf у LibreOffice (5.4.2) або OpenOffice (3.4.1) Calc перебирає дані з точки зору QGIS (у таблиці атрибутів відображаються лише випадкові цілі числа). натомість створює додатковий .dbt файл.

Отже, щоб перейти до питання: як я можу сказати класу студентів магістратури зробити це на наступному тижні? Я розглядав такі варіанти:

  1. Замість цього використовуйте R (чудово для мене, але страшно для студентів)
  2. Відредагуйте файл у форматі .csv, а потім приєднайтеся на основі часової позначки (прекрасно, але здається надмірно складним, і може ввести більше помилок за 2 години практичного використання)
  3. Скористайтесь альтернативною програмою: я спробував Gnumeric та Excel, жодна з яких не дала хороших результатів швидко.

Щоб допомогти відповісти на це запитання, я створив повторюваний приклад . Відкрийте файл "points.shp" в QGIS, спостерігайте за таблицею атрибутів, а потім закрийте. Відредагуйте пару комірок у таблиці атрибутів "points.dbf" у LibreOffice - збережіть. Повторно відкрийте "points.shp" в QGIS і спостерігайте за скремблированою таблицею атрибутів. Інші файли форм у папці .zip вже пошкоджені LibreOffice та OpenOffice, щоб проілюструвати, як виглядає проблема для мене.

Коротше кажучи, як мені найкраще вирішити цю проблему?


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

13
Безпосереднє редагування .DBF частини формфайлу занадто небезпечно, щоб рекомендувати його для звичайного використання, і його взагалі не слід використовувати новачкам - принаймні, якщо хтось не піклується про дані. Однак є більш надійне рішення подібного характеру: підтримуйте унікальне поле ідентифікатора у файлі форм. Ніколи не редагуйте його. Натомість зберігайте атрибути у відповідній таблиці (у будь-якому форматі, яку може читати ваш GIS), з'єднаній за одним ідентифікатором. Тепер значною мірою ви можете вільно редагувати таблицю атрибутів, не втрачаючи зв'язку між формою та атрибутом, доки ви захищаєте поле ідентифікатора.
whuber

1
Рішення Python були б чудовими, якщо їх легко реалізувати та зрозуміти ... Що стосується збереження ідентифікаційного номера, це хороший варіант - (варіант 2 у моєму запитанні) та, ймовірно, моя відповідь за замовчуванням. Однак сподівався на більш просте "швидке виправлення", яке не передбачає додаткових файлів (5 на shapefile цілком достатньо IMO!)
RobinLovelace

3
Що ви маєте на увазі, 5 на файл форми? Спробуйте 9! :-) (Індексні файли можуть накопичуватися, залежно від того, який GIS використовується.) Після того, як вам потрібно більше ніж один пов'язаний файл для підтримки набору даних - а для форм-файлів потрібно мінімум три - це справді не зайві проблеми вкинути додаткові файли. Додайте файл метаданих теж під час роботи. :-) І як тільки ви встановите з'єднання, це не відбувається автоматично? (Я не бачу, як мітка часу могла бути використана для з'єднання. Однак це використовувалося б замість системи контролю версій.)
whuber

3
Якщо у вас є якесь - або бажання ввести їх в бази даних, SpatiaLite має графічний інтерфейс для редагування поля і інструментів командного рядка для даних OSM. Тоді ви можете залучити трохи SQL, і ваші студенти, ймовірно, виявляться далеко перед кривою.
Scro

Відповіді:


18

Найпростіша відповідь, яку я знайшов, ґрунтуючись на рекомендації Райана Гарнета, щоб це зробити в рамках QGIS:

Використовуйте regexp_replace

Цю можливість було додано до польового калькулятора 1 рік тому Юргеном Фішером (як показано у цьому звіті про помилку ). Я деякий час намагався з'ясувати, як це зробити, але не вдалося шукати "qgis regex" та інші невиразні терміни.

Його функціональність, мабуть, найкраще проілюстрована необхідністю стандартизації всіх значень у стовпці "ім'я". Наприклад, якщо нам потрібно замінити всі комірки, що містять візерунок "Tesc", на "Tesco", видаливши зайву інформацію на зразок "Tesco, Швидка допомога" (яку часто додають вкладники ОСМ), можна використовувати таку функцію:

regexp_replace ("ім'я", "Tesc. *", "Tesco")

введіть тут опис зображення

Я думаю, що це функція регулярного вираження Pythonic, оскільки вона трохи відрізняється від grep, який я використовував раніше.

Я думаю, що потрібна додаткова документація (детальна інформація на веб-сайті QGIS обмежена кількома словами) про те, як це працює, тому я поставив закладки на наступні сторінки для подальшої довідки:

Це рішення має пару переваг:

  1. Просто: додаткові програми та додатки не потрібні
  2. Ознайомлює учнів із силою регулярних виразів, використовуючи (Pythonic?) Функції (цікавий текст, який представляє текст. Попередження: "або символ не виходить з ладу) та функції командного рядка.

Вибачте за відповідь на моє власне запитання, і велика подяка іншим за те, що вони направили мене до світла! Я сподіваюся, що ця тема запитів буде корисною для інших, хто стикається з подібними проблемами.


3
Не хвилюйтеся, відповідь на власні запитання не є проблемою.
underdark

Я радий, що ти знайшов щось, що тобі допоможе. Дякую вам за обмін, я знаю, що цим буду користуватися.
Райан Гарнетт

1
Я запитав розробників QGIS, це Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect

9

Це може бути дурною відповіддю, оскільки це може бути метою навчання для студентів класу, але чи є причина, чому ви не редагуєте атрибути в QGIS за допомогою Field Calculator? У попередніх версіях QGIS (до 1.7) редагування атрибутів безпосередньо в межах QGIS було неможливим; отже, необхідність редагування .DBF файлів у OpenOffice тощо.

Станом на 1.7 та 1.8 ви можете редагувати дані атрибутів безпосередньо в Field Calculator, маючи можливість виконувати умовні вирази. Також доступні додатки Python Attribute, які можуть надавати додаткові параметри редагування атрибутів. Це може бути рішення та, або, варіант для вашого підручника.

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


1
Привіт Раян, так, це було б ідеальним рішенням. Це можливість пошуку та заміни тексту в таблиці атрибутів, стандартизації брудних імен OSM, що підштовхує мене безпосередньо намагатися редагувати .dbf файл. Я б скоріше відредагував його в QGIS. Спробуємо плагін Python Attribute - може бути рішенням ідеї. Повинен був би зробити так, що я шукаю можливість пошуку / заміни регулярних виразів у питанні.
RobinLovelace

@ user1694378 Ви все одно можете уточнити своє питання.
underdark

Дякуємо підкреслим, що підштовхували мене до цього - краще відображає те, що я насправді хотів зробити.
RobinLovelace

3

Ви можете використовувати Babre LibreOffice для зміни файлів dbf .

  1. Відкрита база (отримати головне меню)
  2. Виберіть "Підключитися до існуючої бази даних" та виберіть "dBASE".
  3. Виберіть папку з файлами dbf.
  4. Виберіть кінцеві параметри за бажанням та "Готово".
  5. Назвіть файл підключення до вашої бази даних все, що завгодно (наприклад, "MyxBasefiles.odb) і збережіть його кудись. Відтепер отримайте доступ до файлів вашої бази даних, натиснувши цей файл. OoOoo, Nice.
  6. Виберіть "Таблиці" на панелі ліворуч, і там є ваші файли даних (звані "таблиці"). Возитися з ними.

Тепер ви можете розпочати їх редагування. Сподіваємось, це повинно бути достатньо добре для ваших цілей.

Ви також можете спробувати DBF Explorer, хоча це лише Windows. У нього є пошук і заміна, хоча.

введіть тут опис зображення


1
Привіт RK Дякую за швидку відповідь: здається, це надійний і безпечний спосіб редагувати .dbf файли. Я просто спробував те, що ви сказали, і я радий сказати, що це працює.
RobinLovelace

Добре знати. Гарний урок у вас там. :)
РК

Але ... Я просто спробував те, що ви сказали, і я радий сказати, що це працює для окремих клітин. На жаль, це не 100% рішення для цього конкретного додатка, оскільки, схоже, OOBase не має функції пошуку-заміни, необхідної для підручника через [помилку] ( list.freedesktop.org/archives/libreoffice-bugs/2010 -Грудень /… ). Безумовно, працював над окремими клітинками: протестував. Тож це 90% рішення для редагування по клітинках, якщо я не пропустив функцію пошуку-заміни. Будь-які ідеї, як замінити всі записи "Tesc. *" На "Tesco", наприклад?
RobinLovelace

Краще посилання для базової помилки OO: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace

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