Как легко редактировать данные атрибутов с помощью регулярных выражений?

30

Я пишу учебник для студентов MSc, который использует QGIS. Одна из задач требует, чтобы данные атрибута были изменены (см. Черновой вариант учебника в формате PDF здесь, если вы заинтересованы).

Вопрос в том, как заставить их редактировать данные атрибута. Я знаю, что этот вопрос задавался ранее , и раньше ответ был простым: просто используйте LibreOffice calc, чтобы изменить его, а затем сохраните, следя за тем, чтобы порядок строк и заголовки столбцов оставались неизменными. Я использовал этот подход, прежде чем с большим эффектом.

К сожалению, решение больше не работает: сохранение файла .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, чтобы проиллюстрировать, как выглядит проблема для меня.

Короче, как мне лучше решить эту проблему?

RobinLovelace
источник
2
Добро пожаловать на сайт, я хотел бы сказать, что это действительно хорошо заданный вопрос, и, надеюсь, мы сможем найти хорошие решения. Я предполагаю, что немного языка Python не может быть рассмотрено этими студентами, поскольку именно так я бы подошел к этой проблеме в первую очередь ...
sgrieve
13
Непосредственное редактирование части .DBF шейп-файла слишком опасно, чтобы рекомендовать его для повседневного использования, и его вообще не следует использовать новичкам - по крайней мере, если кто-то заботится о данных. Тем не менее, доступно более надежное решение аналогичного характера: поддерживать поле уникального идентификатора в шейп-файле. Никогда не редактируйте это. Вместо этого сохраните атрибуты в связанной таблице (в любом формате, который может прочитать ваша ГИС), объединенной по одному и тому же идентификатору. Теперь, в значительной степени, вы можете свободно редактировать таблицу атрибутов, не теряя связи между формой и атрибутом - до тех пор, пока вы защищаете поле идентификатора.
whuber
1
Решения Python были бы хорошими, если их легко реализовать и понять ... Что касается сохранения идентификатора, это хороший вариант - (вариант 2 в моем вопросе) и, вероятно, мой ответ по умолчанию. Тем не менее, я надеялся на более простое «быстрое исправление», которое не требует дополнительных файлов (5 для каждого шейп-файла вполне достаточно для ИМО!)
RobinLovelace
3
Что вы имеете в виду, 5 за шейп-файл? Попробуйте 9! :-) (Индексные файлы могут накапливаться, в зависимости от того, какая ГИС используется.) Если вам нужно более одного связанного файла для поддержки набора данных - а шейп-файлы требуют минимум три - на самом деле никаких дополнительных проблем не возникает. добавьте дополнительные файлы. Также добавьте файл метаданных, пока вы на нем. :-) А после того, как вы настроили соединение, оно не произойдет автоматически? (Однако я не понимаю, как можно использовать
временную
3
Если у вас есть какое - либо желание ввести их в базы данных, SpatiaLite имеет графический интерфейс для редактирования поля и инструментов командной строки для данных OSM. Тогда вы можете задействовать немного SQL, и ваши ученики, возможно, будут намного впереди.
Scro

Ответы:

18

Простейший ответ, который я нашел, основан на совете Райана Гарнетта сделать это в QGIS:

Используйте regexp_replace

Эта возможность была добавлена ​​в полевой калькулятор 1 год назад Юргеном Фишером (как показано в этом отчете об ошибках ). Некоторое время я пытался выяснить, как это сделать, но не смог найти «qgis regex» и другие смутные термины.

Его функциональность, вероятно, лучше всего иллюстрируется необходимостью стандартизировать все значения в столбце «имя». Например, если нам нужно заменить все ячейки, содержащие шаблон «Tesc», на «Tesco», удалив лишнюю информацию, такую ​​как «Tesco, Infirmary Road» (которую часто добавляют участники OSM), можно использовать следующую функцию:

regexp_replace («имя», «Tesc. *», «Tesco»)

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

Я предполагаю, что это функциональность регулярных выражений Pythonic, поскольку она немного отличается от grep, который я использовал ранее.

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

Это решение имеет пару преимуществ:

  1. Просто: не нужно никаких дополнительных программ или дополнений
  2. Познакомить студентов со способностью регулярных выражений, используя (Pythonic?) Функции («'» представляет текст, представляющий интерес. Предупреждение: «или нет символов не удается») и функции командной строки.

Извиняюсь за ответ на мой собственный вопрос, и большое спасибо другим за то, что они направили меня к свету! Я надеюсь, что эта ветка вопросов будет полезна для других, сталкивающихся с подобными проблемами.

RobinLovelace
источник
3
Не волнуйтесь, отвечать на свои вопросы не проблема.
Подземье
Я рад, что вы нашли то, что поможет вам. Спасибо, что поделились, я знаю, что буду использовать это.
Райан Гарнетт
1
Я спросил разработчиков QGIS, это Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

Это может быть глупый ответ, так как это может быть целью обучения для аспирантов, но есть ли причина, по которой вы не редактируете атрибуты в QGIS с помощью Калькулятора поля? В предыдущих версиях QGIS (до 1.7) редактирование атрибутов непосредственно в QGIS было невозможно; отсюда необходимость редактирования файлов .DBF в OpenOffice и т. д.

Начиная с 1.7 и 1.8 вы можете редактировать данные атрибутов непосредственно в Калькуляторе полей с возможностью выполнения условных выражений. Также доступны подключаемые модули Python Attribute, которые могут предоставлять дополнительные параметры для редактирования атрибутов. Это может быть решением, или или, вариант для вашего учебника.

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

Райан Гарнетт
источник
1
Привет Райан, да, это было бы идеальным решением. Это способность искать и заменять текст в таблице атрибутов, стандартизировать грязные имена OSM, что подталкивает меня к попытке редактировать файл .dbf напрямую. Я бы предпочел отредактировать его в QGIS. Попробуем плагин Python Attribute - возможно, это решение проблемы. Должен был сделать факт, что я ищу возможность регулярного поиска / замены, более ясным в этом вопросе.
RobinLovelace
@ user1694378 Вы все еще можете уточнить свой вопрос.
Подземье
Спасибо, Подземелье, за то, что подтолкнули меня к этому - лучше отражает то, что я на самом деле хотел сделать.
RobinLovelace
3

Вы можете использовать базу LibreOffice для изменения ваших dbf файлов .

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

Теперь вы можете начать редактировать их. Надеюсь, этого должно быть достаточно для ваших целей.

Вы также можете попробовать DBF Explorer, хотя это только Windows. У него есть поиск и замена, хотя.

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

RK
источник
1
Привет RK Спасибо за быстрый ответ: кажется, надежный и безопасный способ редактировать файлы .dbf. Я только что попробовал то, что вы сказали, и я рад сказать, что это работает.
RobinLovelace
Хорошо знать. Хороший урок у вас там. :)
РК
Но ... Я только что попробовал то, что вы сказали, и я рад сказать, что это работает для отдельных клеток. К сожалению, это не 100% решение для этого конкретного приложения, потому что кажется, что OOBase не имеет функции поиска-замены, которая требуется для учебника из-за [bug] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 -Декабрь /… ). Определенно работал на отдельных клетках, хотя: проверено. Так что это 90% решение для редактирования по ячейкам, если только я не пропустил функцию поиска-замены. Любые идеи, как заменить все записи "Tesc. *" На "Tesco", например?
RobinLovelace
Лучшая ссылка для ошибки OO Base: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace
Обновил мой ответ.
РК