воскресенье, 30 октября 2016 г.

Как автоматически генерировать значения полей атрибутивной таблицы? Есть решение - AutoFields

preview - Autofields plugin QGIS on the blog GIS-naturalist
Работая с геоданными, я частенько сталкивался с проблемой, что при создании какого то векторного объекта хочется автоматически заполнять некие поля атрибутивной таблицы, чтоб не тратить время на их ручное заполнение. Особенно раздражали случаи, когда значения этих полей нужно заполнить одним значением, порядковым номером объекта или каким то значением, которое можно автоматически сгенерировать при помощи калькулятора полей. Недавно некий Germán Carrillo написал модуль QGIS, решающий именно эту задачу.

В базах геоданных таких как PostgreSQL/PostGIS или SQLite/SpatiaLite эту задачу можно решить созданием специальных триггеров, заполняющих поля по правилам, но фишка рассматриваемого модуля, что мы можем работать с привычными векторными данными в формате Shapefile, а не с базой данных. Но если вы решите в свой проект подключить векторный слой из PostGIS, SpatiaLite или WFS-T, то AutoFields работает и с этими форматами.

Модуль AutoFields можно установить из официального репозитория модулей QGIS 2.*.

autofields qgis install

После установки, окно работы с модулем добавляется в окно QGIS и содержит 3 вкладки: «Configuration», «List of AutoFields» и «About».

autofields qgis interface

Модуль позволяет одновременно работать с несколькими векторными слоями в одном проекте и с несколькими полями в каждом слое. Автоматическое заполнение полей настраивается при помощи калькулятора полей. Кроме имеющихся функций калькулятора, можно так же использовать свои функции написанные на Python и PyQGIS (пример смотрите ниже).

При добавлении новых объектов в слой, значения полей записываются при сохранении изменений слоя. При изменении ранее созданных объектов, значения полей пересчитываются сразу, непосредственно в процессе изменения.

Для примера рассмотрим автоматическое заполнение поля с порядковым номером создаваемого объекта и площади создаваемого объекта.

Слой с которым мы будем работать — полигональный слой имеющий метрическую систему координат WGS 84 / UTM zone 36N (EPSG:32636), в файловом формате Shapefile. В атрибутивной таблице слоя есть 4 поля: «num» - порядковый номер объекта, «gridcode» - код типа объекта, «shape_area» - площадь полигона в метрах, «area_ha» - площадь полигона в гектарах.

autofields qgis - attribute table

Для начала нужно во вкладке «Configuration» плагина выделить слой для которого будем автоматически рассчитывать атрибуты. В нашем примере выделим слой «Logging».

autofields qgis configuration - laer logging

Отметим флажком «Existing Field» и в выпадающем списке выберем поле «num». Перемещаемся вниз вкладки, и выбираем пункт «Custom Expression» и жмем кнопку <...> возле него.

autofields qgis configuration - Existing Field - Custom Expression - field num

В открывшемся окне калькулятора полей введем формулу $id + 1 и жмем <OK>.

autofield qgis configuration - field num - expression -  row_number

Жмем кнопку <Save AutoFields>. Соглашаемся со открывшимся окном предупреждения, про то что данное поле выбранного слоя будет  AutoFields. После успешного добавления  AutoFields в верхней части области карты всплывет сообщение, что: «The AutoField (logging.num: $id + 1) was created properly!».

autofield qgis configuration - Save AutoField - message

Далее, аналогичным образом добавляем  AutoFields к полям   shape_area и area_ha. Для поля  shape_area выберем не «Custom Expression», а «Area».

autofields qgis configuration - shape area

А для поля area_ha, выберем  «Custom Expression» и укажем формулу расчета  $area / 10000

autofield qgis configuration - Custom Expression -  area ha

На панели инструментов «AutoFields» откроем вкладку «List of AutoFields». В этой вкладке видим список слоев и полей, для которых мы настраивали автозаполнение полей. В этой табличке мы видим названия слоев, полей, формулу для каждого поля и статус. Выделив одно или несколько полей мы можем отменить автозаполнение, нажав кнопку <Remove AutoFields>.

autofield qgis - List of AutoFields

Настроим свойства слоя так, чтоб отображалась подпись — площадь полигона в гектарах и подпись «га». Для этого заходим в свойства слоя «Logging» на вкладку «Подписи» и из верхнего выпадающего меню выбираем пункт «Показать подписи для этого слоя».

autofield qgis - layer setting - lables

Нажав кнопку с символом <ε> открываем калькулятор полей и вписываем в него формулу  "area_ha"  || ' га' и жмем <ОК> .

autofield qgis - layer setting - lables - fieldcalculator

Устанавливаем светлый буфер вокруг подписи, для лучшей видимости. Сохраняем изменения  и видим подписи на карте.

autofields qgis - layer lables

Сохраняем наш проект и считаем что он готов к дальнейшей работе. Далее если мы будем изменять имеющиеся объекты или создавать новые то значения атрибутов будут пересчитываться автоматически.

Для примера изменим один из имеющихся полигонов. Включим режим редактирования и изменим один из полигонов потянув за узел. Мы сразу видим по подписи, как меняется рассчитанное значение площади полигона.

autofields qgis -  AutoFields - edit polygon

Теперь попробуем создать новый полигон.  Для этого на панели инструментов «инструменты оцифровки»  выбираем кнопку «Добавить объект».

autofield qgis -  AutoFields - button new object

Обводим новый полигон, обклацывая его по контуру левой кнопкой мышки. Когда полигон обведен, нажимаем правую кнопку мышки и откроется форма ввода атрибутов. В этой форме вручную заполняем поля обязательные для ручного заполнения, а поля рассчитываемые AutoFields оставляем не заполненными. Нажимаем <OK>.

autofield qgis -  AutoFields - attribute form of new polygon

Видим вновь созданные полигон без подписи, т. к. значение поля еще не рассчитано и ни чего не содержит.

autofield qgis -  AutoFields - new polygon no label

Нажимаем кнопку «Применить изменения», и при сохранении изменений автоматически рассчитываются AutoField — поля.

autofield qgis -  AutoFields - save new polygon

Выделим вновь созданный полигон и откроем таблицу атрибутов слоя «Logging». В ней мы видим созданный полигон в атрибутах которого все атрибутивные поля, которые мы настраивали, заполнены автоматически.
autofields qgis - attribute table - selected new object

Вы можете работать так же с линейными и точечными объектами. Например, для точек можно автоматически рассчитывать координаты точки, для линейных слоев (реки, дороги)  — длину объекта, координаты начала и конца линии и другие характеристики.

Так же вы можете использовать свои функции написанные на Python. В видео ниже приведен пример, когда в точечном слое автоматически заполняется поле высоты, значения которого  берется из другого растрового (DEM) слоя высот.



Посмотрев приведенное видео наверняка захочется провернуть такое же на своих данных. Автор модуля заботливо позаботился о будущих пользователя и выложил в открытый доступ Python-код использованный в примере.

Так же рекомендую прочитать документацию и посмотреть видео на справочной странице модуля:
http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis

Репозиторий AutoFields на GitHub:
 https://github.com/gacarrillor/AutoFields

Если вы хотите оперативно получать советы по решению задач в QGIS добавляйтесь в очень полезный Telegram-группу "QGIS взаимопомощь". В это чате уже более полутары тысяч участников, и постоянно идет активное общение и взаимопомощь!

QGIS взаимопомощь✊

Если статья для тебя полезна, подписывайся на мои каналы и группы в соцсетях:

      

1 комментарий:

  1. Thank you Anton for the post!

    By the way, if any of our Russian friends wants to translate the plugin, just create an AutoFields_ru.ts file with the translated strings and share it into https://github.com/gacarrillor/AutoFields/tree/master/i18n

    Enjoy AutoFields!

    Regards,

    Germán

    ОтветитьУдалить