Skip to content

15_Performing Table Joins QGIS3

原文链接: https://www.qgistutorials.com/en/docs/3/performing_table_joins.html

执行表连接 (QGIS3)

并非所有你想使用的数据集都采用空间格式,数据常常以 CSV、TSV 或电子表格等表格数据的形式出现。你需要将其与现有的空间数据关联起来,以用于分析。此操作称为表连接,可通过处理算法工具箱中的 按字段值连接属性 工具完成。

任务概述

我们将使用加利福尼亚州的普查区边界 Shapefile 和美国人口普查局的人口数据表,来创建加利福尼亚州的人口密度图。

你将学到的其他技能

  • 在 QGIS 中加载不包含任何几何信息的 CSV 文件。
  • 消除 CSV 文件中的额外表头行。
  • 向图层添加新列。
  • 使用透明描边样式化图层。

获取数据

我们想为美国加利福尼亚州准备一份人口密度图。我们首先需要获取该州每个普查区的人口数量表。

下载人口普查表

  1. 访问 美国人口普查局,点击查看表格。

../../_images/data012.png

  1. 点击左上角的过滤器图标。

../../_images/data022.png

  1. 首先过滤出加利福尼亚州。点击 "Geography"。

../../_images/data031.png

  1. 点击 "Tract",它可以提供普查区信息。

../../_images/data041.png

  1. 选择 "California"。

../../_images/data05.png

  1. 勾选 "All Census Tracts within California"。这允许我们将所有信息作为一个文件下载,而不是为每个普查区单独下载。现在我们已经设置了地理范围,点击 "Topics"。

../../_images/data06.png

  1. 在 "Select Topics" 下,选择 "Population and People"。

../../_images/data07.png

  1. 勾选 "Population and People"。现在我们已经选择了所有必要的过滤器。关闭过滤器窗口。

../../_images/data08.png

  1. 在 "Download tables" 窗格中向下滚动,找到 "S0101 | AGE AND SEX"。

../../_images/data09.png

  1. 这将打开数据的详细视图。我们只关心人口,因此取消选择 "Margin of Error",以便只获取必要的信息并节省文件存储空间。

../../_images/data103.png

  1. 点击 "Download" 按钮。

../../_images/data118.png

  1. 所选数据提供多年版本,并使用不同的估算技术。建议使用 "ACS 5-Year Estimate Subject Tables",因为多年估算提高了数据的可靠性。它也没有数据缺口,包含所有普查区的信息。选择年份 2019,然后点击 "Download"。这将下载一个 zip 文件。下载完成后,在本地磁盘解压。

../../_images/data124.png

下载普查区边界

为了根据人口普查表创建地图,我们还需要代表加利福尼亚州每个普查区的边界。

  1. 访问 TIGER Line Shapefiles,点击 "Web Interface"。

../../_images/data133.png

  1. 在 "Select year" 下选择 2019,在 "Select a layer type" 下输入 Census Tracts,然后点击 "Submit"。

../../_images/data142.png

  1. 在 "Select a State" 下选择 California,然后点击 "Download"。这将下载一个包含矢量文件的 zip 文件。

../../_images/data151.png

为方便起见,您也可以直接从以下链接下载两个数据集的副本:

tl_2019_06_tract.zip

ACST5Y2019_S0101.zip

数据来源 [TIGER] [USCENSUS]

操作步骤

  1. 在 QGIS 浏览器中找到 tl_2019_06_tract.zip 文件并展开它。选择 tl_2019_06_tract.shp 文件并将其拖到画布上。

../../_images/018.png

  1. "选择转换" 对话框会提示从 EPSG:4269 转换到 EPSG:4326。此对话框提供了在这两个投影之间转换坐标的几种转换方法。保持默认选择并点击 "OK"。

../../_images/028.png

  1. 你会看到图层 tl_2019_06_tract 已加载到 "Layers" 面板中。此图层包含加利福尼亚州的普查区边界。右键点击 tl_2019_06_tract 图层并选择 "打开属性表"。

../../_images/038.png

  1. 检查图层的属性。要将一个表与此图层连接,我们需要每个要素的、唯一的且共有的属性。在本例中,有 8057 个单独的普查区记录,每个都有 GEOID 字段。此列可以将此图层与任何其他包含相同 ID 的图层或表连接起来。

../../_images/048.png

  1. 要加载表格数据,点击 "打开数据源管理器"。

../../_images/058.png

  1. 在 "数据源管理器" 对话框中,选择 "分隔文本文件"。然后,在右侧,点击 "文件名" 旁边的 ...,浏览到包含加利福尼亚州人口数据的解压缩 CSV 文件的文件夹。

../../_images/068.png

  1. 现在,在 "样本数据" 下,我们甚至可以在将其加载为图层之前检查数据。数据显示该数据表包含 2 个表头行。

../../_images/078.png

  1. 要消除额外的表头行,在 "记录和字段选项" 下,将 "要丢弃的表头行数" 设置为 1。现在该表将包含正确的列标题。由于此图层仅包含表格数据,在 "几何图形定义" 下选择 无几何图形(仅属性表)。点击 "添加" 将其添加为图层,然后点击 "关闭" 关闭此对话框。

../../_images/087.png

  1. CSV 文件现在将作为表格导入 QGIS,并在 "Layers" 面板中显示为 ACST5Y2019.S0101。现在右键点击该图层并选择 "打开属性表"。

../../_images/097.png

  1. ID 列包含每条记录的唯一 ID,可用于将此表与 tl_2019_06_tract 图层连接。如果将 ID 的值与 tl_2019_06_tractGEOID 列进行比较,你会注意到它带有前缀 1400000US。要成功合并这两个表,值必须完全匹配。让我们去掉这个前缀,并添加一个包含最后 11 个字符的新列,这 11 个字符包含了完全匹配的值。

../../_images/1033.png

  1. 要创建一个包含最后 11 位数字的新列,通过菜单 "Processing" → "Toolbox" 打开处理工具箱,搜索并找到 "矢量表" → "字段计算器" 算法。

../../_images/1139.png

  1. 在 "字段计算器" 对话框中,选择 ACST5Y2019.S0101 作为 "输入图层",在 "字段名称" 中输入 geoid,并在 "结果字段类型" 中选择 字符串。现在在表达式中搜索 substr。我们可以使用此函数从 id 字段中提取所需部分。

../../_images/1234.png

  1. 输入以下表达式。我们使用 substr 函数并从位置 -11 开始提取值(负值表示从末尾开始计数)。最终结果可以在 "预览" 部分查看。点击 "运行"。

bash substr("id", -11)

../../_images/1332.png

  1. 现在一个新的图层 Calculated 将加载到画布中,让我们检查其属性表。将会出现一个新列 geoid,其值可以与普查区数据匹配。

../../_images/1430.png

  1. 要创建表连接,通过菜单 "Processing" → "Toolbox" 打开处理工具箱,搜索并找到 "矢量通用" → "按字段值连接属性" 算法。

../../_images/1525.png

  1. 在 "按字段值连接属性" 对话框中,选择 tl_2019_06_tract 作为 "输入图层",选择 GEOID 作为 "表格字段"。选择 Calculated 作为 "输入图层 2",选择 geoid 作为 "表格字段 2"。在 "要复制的图层2字段" 下,点击 ...

../../_images/1623.png

  1. 勾选 Geographic Area NameEstimate!!Total!!Total populationgeoid。点击 "OK"。

../../_images/1725.png

  1. 勾选 "丢弃无法连接的记录"。这将消除人口表中任何多余的记录。点击 "已连接图层" 下的 ... 按钮来选择输出文件位置,并选择 保存到文件...

../../_images/1822.png

  1. 将输出 GeoPackage 命名为 california_total_population.gpkg。点击 "运行"。

../../_images/1918.png

  1. 处理完成后,验证算法是否成功(如果所有 8057 个要素都已连接)。点击 "关闭"。

../../_images/2017.png

  1. 你会看到一个新图层 california_total_population 加载到 "Layers" 面板中。此时,CSV 文件的字段已连接到普查区图层。现在我们的人口数据已加入普查区图层,我们可以对其进行样式化,以创建人口密度分布的可视化图。点击 "打开图层样式化面板" 按钮。

../../_images/2120.png

  1. 在 "图层样式化" 面板中,从下拉菜单中选择 分级渲染。由于我们想要创建人口密度图,我们希望根据人口密度为每个普查区要素分配不同的颜色。人口数据在 Estimate!!Total!!Total population 字段中,面积数据在 ALAND 字段中。点击 "表达式" 按钮,计算每个普查区人口占总人口的百分比。

注意

在创建此类专题(分区着色)地图时,对要映射的值进行归一化非常重要。直接映射每个多边形的总数是不正确的。必须通过除以面积来对值进行归一化。如果要显示总数(如犯罪数量),可以将其除以总人口进行归一化,从而映射犯罪率而不是犯罪数量。了解更多

../../_images/2218.png

  1. 输入以下表达式来计算人口密度。要素的面积以平方公里为单位。我们将其乘以 1000000 转换为平方米,然后使用公式人口/面积计算人口密度。预览结果并点击 "OK"。

bash 1000000 * ("Estimate!!Total!!Total population"/"ALAND")

../../_images/2316.png

  1. 在 "图层样式化" 面板中,点击 "分类" 并将分类数量设置为 10

../../_images/2415.png

  1. 点击色带选择器,选择色带 RdYlGn

../../_images/2514.png

  1. 更高的密度更值得关注,让我们将绿色分配给较低密度区域,红色分配给高密度区域。点击色带选择器,选择 "反转色带"。

../../_images/2613.png

  1. 现在我们有了一个关于加利福尼亚州人口密度的、看起来非常棒的信息可视化图。为了让它更好,让我们将每个普查区的边界设为透明。点击 "符号" 选项卡。

../../_images/2714.png

  1. 点击 "描边颜色",选择 透明描边

../../_images/2814.png

  1. 可以调整分级区间,点击 "数值" 会弹出一个对话框,用于输入上下边界值。

../../_images/2913.png

  1. 一旦您满意了,请关闭图层样式化面板。我们现在拥有了一幅美观的、关于加利福尼亚州人口密度的信息可视化地图。

../../_images/3011.png


如果你想提供反馈或分享学习本教程的体验,请在下方评论。(需要 GitHub 账户)