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. 下节引言

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