5.4. Занятие: Действия

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

Действие - это то, что происходит когда вы нажимаете на функцию. Оно может добавить много дополнительных функциональных возможностей на карту, позволяя получить дополнительную информацию об объекте, для примера. Назначение действий может добавить на карту совершенно новое измерение!

Цель этого занятия: Научиться добавлять пользовательские действия.

На этом занятии вы будете использовать слой school_property, который вы ранее создавали previously. Примеры данных включают фотографии каждого из трех оцифрованных свойств. Мы собираемся связать каждое свойство с его изображением. Затем создадим действие, которое откроет изображение для свойства при щелчке на свойстве.

5.4.1. basic Идем дальше: Добавление поля для изображений

В слое school_property пока не удается связать изображение со свойством. Сначала создадим поле для этой цели.

  1. Откройте диалоговое окно Layer Properties.

  2. Кликните Fields.

  3. Режим редактирования:

    ../../../_images/toggle_editing_mode.png
  4. Добавьте новую колонку:

    ../../../_images/add_new_column.png
  5. Ниже введите значения:

    ../../../_images/column_settings.png
  6. После того как вы создали поле перейдите к Attributes Form и выберите поле image`.

  7. Задать тип виджета Widget Type для вложения Attachment:

    ../../../_images/select_file_name.png
  8. Кликните OK в диалоговом окне Layer Properties.

  9. Используйте инструмент Identify для клика на одну из трех функций в слое school_property.

    Поскольку вы все еще находитесь в режиме редактирования, диалоговое окно должно быть активным и выглядеть следующим образом:

    ../../../_images/school_property_no_image.png
  10. Кликните на кнопку просмотра ( рядом с полем image).

  11. Выберите путь к вашему изображению. Изображения в exercise_data/school_property_photos/ и имеют то же имя, что и функции, с которыми они должны быть связаны.

  12. Кликните OK.

  13. Свяжите все изображения с правильными функциями с помощью этого метода.

  14. Сохраните изменения и выйдите из режима редактирования.

5.4.2. basic Идем дальше: Создание действия

  1. Откройте вкладку Actions для слоя school_property и кликните на кнопку symbologyAdd Add a new action.

    ../../../_images/layer_actions.png
  2. В диалоговом окне Add New Action введите слова Show Image в поле Description:

    ../../../_images/show_image_action.png

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

    • Windows

      Кликните Type и выберите Open.

    • Ubuntu Linux

      В поле Action, напишите eog для Средства просмотра изображений Gnome Gnome Image Viewer, или напишите display чтобы использовать ImageMagick. Помните, что нужно ставить пробел после команды!

    • MacOS

      1. Жмите на выпадающий Type и выберите Mac.

      2. В  Action, пишите open. Помните, что нужно ставить пробел после команды!

    Теперь можно продолжить запись команды.

    Вы хотите открыть изображение, и QGIS знает, где оно находится. Все, что ему нужно сделать, это сказать Action там, где изображение.

  3. Выберите image из списка:

    ../../../_images/select_image.png
  4. Кликните на кнопку Insert field. QGIS добавит фразу [% "image" %] в поле Action Text.

  5. Кликните на кнопку OK, чтобы закрыть диалоговое окно Add New Action.

  6. Кликните на кнопку OK чтобы закрыть диалоговое окно Layer Properties.

Теперь пришло время протестировать новое действие:

  1. Кликните на слой school_property на панели Layers чтобы оно выделилось.

  2. Найдите кнопку actionRun Run feature actionAttributes Toolbar).

  3. Кликните стрелку вниз справа от этой кнопки. Для этого слоя на данный момент определено только одно действие, которое только что создано.

    ../../../_images/run_feature_action_select.png
  4. Кликните кнопку, чтобы активировать инструмент.

  5. С помощью этого инструмент кликните любое из трех свойств школы.

    Должно открыться изображение для этого свойства.

5.4.3. moderate Идем дальше: Поиск в Интернете

Допустим, мы смотрим на карту и хотим узнать больше о районе, в котором находится ферма. Предположим, вы ничего не знаете о данной местности и хотите найти общую информацию о ней. Ваш первый импульс, учитывая, что вы используете компьютер прямо сейчас, вероятно, будет найти в Google название местности. Давайте попросим QGIS сделать это автоматически для нас!

  1. Откройте таблицу атрибутов в слое landuse.

    Мы будем использовать поле name для каждого района землепользования чтобы найти в Google.

  2. Закройте таблицу атрибутов.

  3. Вернитесь к Actions в Layer Properties.

  4. Кликните на кнопку Create Default Actions, чтобы добавить ряд предварительно определенных действий.

  5. Удалите все действия кроме Open URL с коротким именем Search Web с помощью кнопки symbologyRemove Remove the selected action, которая расположена ниже.

  6. Кликните два раза на оставшееся действие, чтобы редактировать его.

  7. Поменяйте Description на Google Search, и удалите содержимое поля Short Name.

  8. Убедитесь, что Полотно Canvas находится среди Action scopes с флажками.

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

    • Windows

      В Type выберите Open. Это позволит Windows открыть адрес Интернета в браузере по умолчанию, например Internet Explorer.

    • Ubuntu Linux

      В Action напишите xdg-open. Это позволит Ubuntu открыть интернет-адрес в браузере по умолчанию, например Chrome или Firefoxhis.

    • MacOS

      В Action напишите  open. Это позволит MacOS открыть интернет-адрес в браузере по умолчанию, например Safari.

    Теперь можно продолжить запись команды.

    Независимо от того, какую команду вы использовали выше, вы должны сообщить ей, какой адрес Интернета открыть следующим. Вы хотите, чтобы она посетила Google и искала фразу автоматически.

    Обычно при использовании Google вы вводите свою поисковую фразу в строку поиска Google. Но в этом случае вы хотите, чтобы ваш компьютер сделал это для вас. То, как вы зададите Google поиск чего-то (если вы не хотите использовать его строку поиска напрямую) является путем предоставления адреса вашему интернет-браузеру https://www.google.com/search?q=SEARCH_PHRASE, где SEARCH_PHRASE` это то что вы ищете. Поскольку мы пока не знаем, какую фразу искать, мы просто введем первую часть (без поисковой фразы).

  9. В поле Action впишите https://www.google.com/search?q=. Не забывайте добавить пробел после начальной команды перед тем как впишите это!

    Теперь вы хотите, чтобы QGIS сказал браузеру, чтобы Google искал значение имени name для любой функции, которую вы можете нажать.

  10. Выберите поле name.

  11. Кликните кнопку Insert:

    ../../../_images/google_search_action.png

    Это означает, что QGIS собирается открыть браузер и отправить его по адресу https://www.google.com/search?q=[% "name" %]. Команда [% "name" %] говорит QGIS использовать содержимое поля name как фразу поиска.

    Так, например, если местность землепользования, на которую вы нажимаете, называется Marloth Nature Reserve, QGIS собирается отправить браузер на https://www.google.com/search?q=Marloth%20Nature%20Reserve, что приведет к тому, что ваш браузер посетит Google, который в свою очередь будет искать «Marloth Nature Reserve».

  12. Если вы еще не сделали этого, настройте все, как описано выше.

  13. Кликните на кнопку OK, чтобы закрыть диалоговое окно Add New Action.

  14. Кликните на кнопку OK чтобы закрыть диалоговое окно Layer Properties.

Теперь, чтобы проверить новое действие.

  1. Слой landuse должен быть активен на панели Layers, теперь кликните на стрелку вниз справа от кнопки actionRun Run feature action, и выберите единственное действие (Google Search), определенное для этого слоя.

  2. Кликните на любом участке землепользования, который можно увидеть на карте. Ваш браузер откроется и начнет поиск в Google места, записанного как значение name на этой местности.

Примечание

Если действие не работает, убедитесь, что все введено правильно; опечатки часто встречаются при таких работах!

5.4.4. hard Идем дальше: Открытие веб-страницы непосредственно в QGIS

Выше, вы видели, как открыть веб-страницу во внешнем браузере. Есть некоторые недостатки в таком подходе, так как он добавляет неизвестную зависимость - будет ли у конечного пользователя программное обеспечение, необходимое для выполнения действия в своей системе? Как вы видели, они не обязательно даже имеют один и тот же вид базовой команды для одного и того же вида действий, если вы не знаете, какую OS они будут использовать. В некоторых версиях OS вышеуказанные команды для открытия браузера могут вообще не работать. Это может быть непреодолимой проблемой.

Однако QGIS находится в топе невероятно мощной и универсальной библиотеки Qt. Кроме того, действия QGIS могут быть произвольными, маркированными (т.е. с использованием информации переменной на основе содержимого атрибута поля) командами Python!

Теперь вы увидите, как использовать действие python для отображения веб-страницы. Здесь лежит та же самая общая идея, что и открытие сайта во внешнем браузере, но она не требует браузера в системе пользователя, поскольку он использует класс Qt QWebView (который является HTML-виджетом на основе webkit) для отображения содержимого во всплывающем окне.

Давайте используем Википедию на этот раз. Таким образом, запрашиваемый URL будет выглядеть следующим образом:

https://wikipedia.org/wiki/SEARCH_PHRASE

Чтобы создать действие слоя:

  1. Откройте диалоговое окно Layer Properties и перейдите к вкладке Actions.

  2. Настройте новое действие, используя для него следующие свойства действия:

    • Type: Python

    • Description: Wikipedia

    • Action Text (все в одну линию):

      from qgis.PyQt.QtCore import QUrl; from qgis.PyQt.QtWebKitWidgets import QWebView; myWV = QWebView(None); myWV.load(QUrl('https://wikipedia.org/wiki/[%name%]')); myWV.show()
      
    ../../../_images/python_action_example.png

    Здесь происходит несколько вещей:

    • Весь код Python находится в одной строке с разделяющими командами точка с запятой (вместо новых строк, это обычный способ разделения команд Python).

    • [%name%] будет заменено фактическим значением атрибута при вызове действия (как и ранее).

    • Код просто создает новый экземпляр QWebView, задает его URL, а затем вызывает show()· на нем, чтобы сделать его видимым в виде окна на рабочем столе пользователя.

    Заметьте, что это несколько надуманный пример. Python работает с семантически значимым отступом, поэтому разделять вещи точкой с запятой не лучший способ его написания. Таким образом, в реальном мире вы с большей вероятностью импортируете логику из модуля Python, а затем вызовете функцию с атрибутом поля в качестве параметра.

    Этот подход можно также использовать для того чтобы показать изображение без необходимости наличия у пользователей определенного средства просмотра изображений в их системе.

  3. Попробуйте использовать описанные выше методы для загрузки страницы Википедии с помощью только что созданного действия Википедии.

5.4.5. В заключении

Действия позволяют предоставить вашей карте дополнительные функциональные возможности, полезные для конечного пользователя, который просматривает ту же карту в QGIS. Благодаря тому, что можно использовать команды оболочки для любой операционной системы, а также для Python, ваши возможности безграничны с точки зрения функций, которые вы могли бы включить!

5.4.6. Что дальше?

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