Работая с геоданными, я частенько сталкивался с проблемой, что при создании какого то векторного объекта хочется автоматически заполнять некие поля атрибутивной таблицы, чтоб не тратить время на их ручное заполнение. Особенно раздражали случаи, когда значения этих полей нужно заполнить одним значением, порядковым номером объекта или каким то значением, которое можно автоматически сгенерировать при помощи калькулятора полей. Недавно некий Germán Carrillo написал модуль QGIS, решающий именно эту задачу.
В базах геоданных таких как PostgreSQL/PostGIS или SQLite/SpatiaLite эту задачу можно решить созданием специальных триггеров, заполняющих поля по правилам, но фишка рассматриваемого модуля, что мы можем работать с привычными векторными данными в формате Shapefile, а не с базой данных. Но если вы решите в свой проект подключить векторный слой из PostGIS, SpatiaLite или WFS-T, то AutoFields работает и с этими форматами.
Модуль AutoFields можно установить из официального репозитория модулей QGIS 2.*.
После установки, окно работы с модулем добавляется в окно QGIS и содержит 3 вкладки: «Configuration», «List of AutoFields» и «About».
Модуль позволяет одновременно работать с несколькими векторными слоями в одном проекте и с несколькими полями в каждом слое. Автоматическое заполнение полей настраивается при помощи калькулятора полей. Кроме имеющихся функций калькулятора, можно так же использовать свои функции написанные на Python и PyQGIS (пример смотрите ниже).
При добавлении новых объектов в слой, значения полей записываются при сохранении изменений слоя. При изменении ранее созданных объектов, значения полей пересчитываются сразу, непосредственно в процессе изменения.
Для примера рассмотрим автоматическое заполнение поля с порядковым номером создаваемого объекта и площади создаваемого объекта.
Слой с которым мы будем работать — полигональный слой имеющий метрическую систему координат WGS 84 / UTM zone 36N (EPSG:32636), в файловом формате Shapefile. В атрибутивной таблице слоя есть 4 поля: «num» - порядковый номер объекта, «gridcode» - код типа объекта, «shape_area» - площадь полигона в метрах, «area_ha» - площадь полигона в гектарах.
Для начала нужно во вкладке «Configuration» плагина выделить слой для которого будем автоматически рассчитывать атрибуты. В нашем примере выделим слой «Logging».
Отметим флажком «Existing Field» и в выпадающем списке выберем поле «num». Перемещаемся вниз вкладки, и выбираем пункт «Custom Expression» и жмем кнопку <...> возле него.
В открывшемся окне калькулятора полей введем формулу $id + 1 и жмем <OK>.
Жмем кнопку <Save AutoFields>. Соглашаемся со открывшимся окном предупреждения, про то что данное поле выбранного слоя будет AutoFields. После успешного добавления AutoFields в верхней части области карты всплывет сообщение, что: «The AutoField (logging.num: $id + 1) was created properly!».
Далее, аналогичным образом добавляем AutoFields к полям shape_area и area_ha. Для поля shape_area выберем не «Custom Expression», а «Area».
А для поля area_ha, выберем «Custom Expression» и укажем формулу расчета $area / 10000
На панели инструментов «AutoFields» откроем вкладку «List of AutoFields». В этой вкладке видим список слоев и полей, для которых мы настраивали автозаполнение полей. В этой табличке мы видим названия слоев, полей, формулу для каждого поля и статус. Выделив одно или несколько полей мы можем отменить автозаполнение, нажав кнопку <Remove AutoFields>.
Настроим свойства слоя так, чтоб отображалась подпись — площадь полигона в гектарах и подпись «га». Для этого заходим в свойства слоя «Logging» на вкладку «Подписи» и из верхнего выпадающего меню выбираем пункт «Показать подписи для этого слоя».
Нажав кнопку с символом <ε> открываем калькулятор полей и вписываем в него формулу "area_ha" || ' га' и жмем <ОК> .
Устанавливаем светлый буфер вокруг подписи, для лучшей видимости. Сохраняем изменения и видим подписи на карте.
Сохраняем наш проект и считаем что он готов к дальнейшей работе. Далее если мы будем изменять имеющиеся объекты или создавать новые то значения атрибутов будут пересчитываться автоматически.
Для примера изменим один из имеющихся полигонов. Включим режим редактирования и изменим один из полигонов потянув за узел. Мы сразу видим по подписи, как меняется рассчитанное значение площади полигона.
Теперь попробуем создать новый полигон. Для этого на панели инструментов «инструменты оцифровки» выбираем кнопку «Добавить объект».
Обводим новый полигон, обклацывая его по контуру левой кнопкой мышки. Когда полигон обведен, нажимаем правую кнопку мышки и откроется форма ввода атрибутов. В этой форме вручную заполняем поля обязательные для ручного заполнения, а поля рассчитываемые AutoFields оставляем не заполненными. Нажимаем <OK>.
Видим вновь созданные полигон без подписи, т. к. значение поля еще не рассчитано и ни чего не содержит.
Нажимаем кнопку «Применить изменения», и при сохранении изменений автоматически рассчитываются AutoField — поля.
Выделим вновь созданный полигон и откроем таблицу атрибутов слоя «Logging». В ней мы видим созданный полигон в атрибутах которого все атрибутивные поля, которые мы настраивали, заполнены автоматически.
Вы можете работать так же с линейными и точечными объектами. Например, для точек можно автоматически рассчитывать координаты точки, для линейных слоев (реки, дороги) — длину объекта, координаты начала и конца линии и другие характеристики.
Так же вы можете использовать свои функции написанные на 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
Если статья для тебя полезна, подписывайся на мои каналы и группы в соцсетях:
В базах геоданных таких как PostgreSQL/PostGIS или SQLite/SpatiaLite эту задачу можно решить созданием специальных триггеров, заполняющих поля по правилам, но фишка рассматриваемого модуля, что мы можем работать с привычными векторными данными в формате Shapefile, а не с базой данных. Но если вы решите в свой проект подключить векторный слой из PostGIS, SpatiaLite или WFS-T, то AutoFields работает и с этими форматами.
Модуль AutoFields можно установить из официального репозитория модулей QGIS 2.*.
После установки, окно работы с модулем добавляется в окно QGIS и содержит 3 вкладки: «Configuration», «List of AutoFields» и «About».
Модуль позволяет одновременно работать с несколькими векторными слоями в одном проекте и с несколькими полями в каждом слое. Автоматическое заполнение полей настраивается при помощи калькулятора полей. Кроме имеющихся функций калькулятора, можно так же использовать свои функции написанные на Python и PyQGIS (пример смотрите ниже).
При добавлении новых объектов в слой, значения полей записываются при сохранении изменений слоя. При изменении ранее созданных объектов, значения полей пересчитываются сразу, непосредственно в процессе изменения.
Для примера рассмотрим автоматическое заполнение поля с порядковым номером создаваемого объекта и площади создаваемого объекта.
Слой с которым мы будем работать — полигональный слой имеющий метрическую систему координат WGS 84 / UTM zone 36N (EPSG:32636), в файловом формате Shapefile. В атрибутивной таблице слоя есть 4 поля: «num» - порядковый номер объекта, «gridcode» - код типа объекта, «shape_area» - площадь полигона в метрах, «area_ha» - площадь полигона в гектарах.
Для начала нужно во вкладке «Configuration» плагина выделить слой для которого будем автоматически рассчитывать атрибуты. В нашем примере выделим слой «Logging».
Отметим флажком «Existing Field» и в выпадающем списке выберем поле «num». Перемещаемся вниз вкладки, и выбираем пункт «Custom Expression» и жмем кнопку <...> возле него.
В открывшемся окне калькулятора полей введем формулу $id + 1 и жмем <OK>.
Жмем кнопку <Save AutoFields>. Соглашаемся со открывшимся окном предупреждения, про то что данное поле выбранного слоя будет AutoFields. После успешного добавления AutoFields в верхней части области карты всплывет сообщение, что: «The AutoField (logging.num: $id + 1) was created properly!».
Далее, аналогичным образом добавляем AutoFields к полям shape_area и area_ha. Для поля shape_area выберем не «Custom Expression», а «Area».
А для поля area_ha, выберем «Custom Expression» и укажем формулу расчета $area / 10000
На панели инструментов «AutoFields» откроем вкладку «List of AutoFields». В этой вкладке видим список слоев и полей, для которых мы настраивали автозаполнение полей. В этой табличке мы видим названия слоев, полей, формулу для каждого поля и статус. Выделив одно или несколько полей мы можем отменить автозаполнение, нажав кнопку <Remove AutoFields>.
Настроим свойства слоя так, чтоб отображалась подпись — площадь полигона в гектарах и подпись «га». Для этого заходим в свойства слоя «Logging» на вкладку «Подписи» и из верхнего выпадающего меню выбираем пункт «Показать подписи для этого слоя».
Нажав кнопку с символом <ε> открываем калькулятор полей и вписываем в него формулу "area_ha" || ' га' и жмем <ОК> .
Устанавливаем светлый буфер вокруг подписи, для лучшей видимости. Сохраняем изменения и видим подписи на карте.
Сохраняем наш проект и считаем что он готов к дальнейшей работе. Далее если мы будем изменять имеющиеся объекты или создавать новые то значения атрибутов будут пересчитываться автоматически.
Для примера изменим один из имеющихся полигонов. Включим режим редактирования и изменим один из полигонов потянув за узел. Мы сразу видим по подписи, как меняется рассчитанное значение площади полигона.
Теперь попробуем создать новый полигон. Для этого на панели инструментов «инструменты оцифровки» выбираем кнопку «Добавить объект».
Обводим новый полигон, обклацывая его по контуру левой кнопкой мышки. Когда полигон обведен, нажимаем правую кнопку мышки и откроется форма ввода атрибутов. В этой форме вручную заполняем поля обязательные для ручного заполнения, а поля рассчитываемые AutoFields оставляем не заполненными. Нажимаем <OK>.
Видим вновь созданные полигон без подписи, т. к. значение поля еще не рассчитано и ни чего не содержит.
Нажимаем кнопку «Применить изменения», и при сохранении изменений автоматически рассчитываются AutoField — поля.
Выделим вновь созданный полигон и откроем таблицу атрибутов слоя «Logging». В ней мы видим созданный полигон в атрибутах которого все атрибутивные поля, которые мы настраивали, заполнены автоматически.
Вы можете работать так же с линейными и точечными объектами. Например, для точек можно автоматически рассчитывать координаты точки, для линейных слоев (реки, дороги) — длину объекта, координаты начала и конца линии и другие характеристики.
Так же вы можете использовать свои функции написанные на 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 взаимопомощь✊
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