5.4. 课: 动作

现在,您已经在上一课中看到了默认动作,现在是定义自己动作的时候了。

动作是指单击要素时发生的事情。可以为地图添加许多额外的功能,例如,允许您检索有关对象的其他信息。设定动作可以为地图提升一个全新的维度!

本课目标: 学习如何添加自定义动作。

在本课程中,您将使用之前创建的 school_property 图层。示例数据包括您数字化的三个属性的每张照片。我们要做的是将每个属性与其图像进行关联。然后,创建动作,在单击某个属性时打开该属性的图像。

5.4.1. basic 跟我做: 为图像添加字段

school_property 图层还无法将图像与属性相关联。首先,我们将为此创建字段。

  1. 打开 图层属性 对话框。

  2. 单击 字段 选项卡。

  3. 切换编辑模式:

    ../../../_images/toggle_editing_mode.png
  4. 新增一列:

    ../../../_images/add_new_column.png
  5. 输入以下值:

    ../../../_images/column_settings.png
  6. 创建字段后,移动到 属性表单 选项卡并选择 image 字段。

  7. 将 控件类型 设置为 附件 :

    ../../../_images/select_file_name.png
  8. 在 图层属性 对话框中单击 确定 。

  9. 使用 识别 工具单击 school_property 图层中的三个要素中的一个。

    由于您仍处于编辑模式,该对话框应处于激活状态,如下所示:

    ../../../_images/school_property_no_image.png
  10. 单击浏览按钮 ( image 字段旁边的 ... )。

  11. 选择图像的路径。这些图像位于 exercise_data/school_property_photos/ ,并与它们应该关联的要素命名相同。

  12. 单击 确定 。

  13. 使用此方法将所有图像与正确的要素相关联。

  14. 保存编辑并退出编辑模式。

5.4.2. basic 跟我做: 创建动作

  1. 打开 school_property 图层属性的 动作 选项卡,然后单击 symbologyAdd 添加新动作 按钮。

    ../../../_images/layer_actions.png
  2. 在 添加新动作 对话框中的 描述 字段输入 Show Image 字符:

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

    下一步要执行的动作因操作系统而异,因此请选择适当的课程:

    • Windows

      单击 类型 下拉列表并选择 打开 。

    • Ubuntu Linux

      在 动作 中,为 Gnome Image Viewer 编写 eog ,或编写 display 以使用 ImageMagick 。请记住在命令后面加一个空格!

    • MacOS

      1. 单击 类型 下拉列表,并选择 Mac 。

      2. 在 动作 中,写入 open 。记住在命令后面加一个空格!

    现在可以继续编写命令了。

    您要打开图像,QGIS需要知道图像的位置。它所要做的就是告诉 动作 图像在哪儿。

  3. 从动作文本列表中选择 image :

    ../../../_images/select_image.png
  4. 单击 插入 按钮。QGIS将在 动作文本 字段中添加短语 [% "image" %] 。

  5. 单击 确定 按钮关闭 添加新动作 对话框

  6. 单击 确定 ,关闭 图层属性 对话框

现在是测试新动作的时候了:

  1. 单击 图层 面板中的 school_property 图层,使其高亮显示。

  2. 查找 actionRun 执行要素动作 按钮 (在 属性工具栏 中)。

  3. 单击此按钮右侧的向下箭头。到目前为止,只为该图层定义了一个动作,即您刚刚创建的动作。

    ../../../_images/run_feature_action_select.png
  4. 单击按钮本身以激活该工具。

  5. 使用此工具,单击三个学校属性中的任意一个。

    应该可以打开该属性的图像。

5.4.3. moderate 跟我做: 搜索互联网

假设我们正在查看地图,并希望了解更多有关农场所在区域的信息。假设您对所讨论的区域一无所知,并希望找到有关它的一般信息。考虑到您现在正在使用电脑,首先想到的可能是用谷歌搜索该地区的名称。所以,让我们告诉QGIS为我们自动执行此操作!

  1. 打开 landuse 图层的属性表。

    我们将使用每个土地利用区域的 name 字段进行谷歌搜索。

  2. 关闭属性表。

  3. 返回 图层属性 中的 动作 。

  4. 单击 创建默认动作 按钮添加一些预定义的动作。

  5. 使用 symbologyRemove 移除选中的动作 按钮,移除除 打开 URL 动作之外的所有动作,并使用短名称 搜索 Web 。

  6. 双击所剩动作进行编辑

  7. 将 描述 更改为 Google Search ,并移除 短名称 字段的内容。

  8. 确保 作用域 中的 画布 被勾选。

    下一步要执行的动作因操作系统而异,因此请选择适当的课程:

    • Windows

      在 类型 中,选择 打开 。这将告诉Windows使用默认浏览器打开互联网地址,如 Internet Explorer。

    • Ubuntu Linux

      在 动作 中,写入 xdg-open 。这将告诉Ubuntu在您的默认浏览器中打开互联网地址,如 Chrome 或 Firefox。

    • MacOS

      在 动作 中,写入 open 。这将告诉MacOS在您的默认浏览器中打开互联网地址,如 Safari。

    现在可以继续编写命令了

    无论您在上面使用哪个命令,都需要告诉它下一步要打开哪个互联网地址。您希望它访问谷歌,并自动搜索短语。

    通常,当您使用谷歌浏览器时,会在谷歌搜索栏输入待搜索的短语。但在这种情况下,您希望计算机为您执行此操作。您告诉谷歌搜索某个东西 (如果不想直接使用它的搜索栏) 的方式是给您的互联网浏览器提供地址 https://www.google.com/search?q=SEARCH_PHRASE ,其中 SEARCH_PHRASE` 是您要搜索的内容。因为我们还不知道要搜索哪个短语,所以只需输入第一部分 (不包括搜索短语)。

  9. 在 动作 字段里,写入 https://www.google.com/search?q= 。请记住在写入此命令之前,在初始命令后添加一个空格!

    现在,您希望QGIS告诉浏览器,让谷歌搜索您可以单击的任意要素 name 的值。

  10. 选择 name 字段。

  11. 单击 插入 按钮:

    ../../../_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 ,这将导致您的浏览器访问谷歌,而谷歌将反过来搜索 "Marloth Nature Reserve" 。

  12. 如果您还没有这样做,请按照上述说明进行设置。

  13. 单击 确定 按钮关闭 添加新动作 对话框

  14. 单击 确定 ,关闭 图层属性 对话框

现在来测试新动作。

  1. 在 图层 面板激活 landuse 图层后,单击 actionRun 执行要素动作 按钮右侧的向下箭头,然后选择为该图层定义的唯一动作 (Google Search) 。

  2. 单击地图上您能看到的任意土地利用区域。您的浏览器现在将打开,并将启动谷歌搜索记录为该区域 name 值的位置。

备注

如果您的动作没有反应,请检查输入的所有内容是否正确,打字错误在这类工作中很常见!

5.4.4. hard 跟我做: 直接在QGIS中打开网页

以上,您已经了解了如何在外部浏览器打开网页。这种方法存在一些缺点,因为它增加了一种不可知的依赖关系 - 最终用户是否拥有在其系统上执行动作所需的软件?正如您所见,如果您不知道将使用哪个操作系统,甚至不一定有相同类型的基本命令来执行相同的动作。对于某些操作系统版本,上述用于打开浏览器的命令可能根本不起作用。这可能是一个无法克服的问题。

然而,QGIS基于功能强大且用途广泛的Qt库。此外,QGIS动作可以是任意、标记化的 (即使用基于字段属性内容的变量信息) Python命令!

现在,您将看到如何使用python动作来显示网页。这与在外部浏览器打开网站的总体思路相同,但它不需要用户系统上的浏览器,因为是使用 Qt QWebView 类 (这是一个基于webkit的html控件) 在弹出窗口中显示内容。

这次让我们访问维基百科。因此,您请求的URL如下所示:

https://wikipedia.org/wiki/SEARCH_PHRASE

要创建图层动作,请执行以下操作:

  1. 打开 图层属性 对话框,转到 动作 选项卡。

  2. 使用动作的以下属性设置新动作:

    • 类型: Python

    • 描述: Wikipedia

    • 动作文本 (全部在一行):

      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使用shell命令,因此可以使用的功能是无限的!

5.4.6. 下节引言

现在,已经完成了各种矢量数据的创建,您将学习如何分析数据以解决问题。这是下一单元的主题。