15_Performing Table Joins QGIS3
原文链接: https://www.qgistutorials.com/en/docs/3/performing_table_joins.html
执行表连接 (QGIS3)¶
并非所有你想使用的数据集都采用空间格式,数据常常以 CSV、TSV 或电子表格等表格数据的形式出现。你需要将其与现有的空间数据关联起来,以用于分析。此操作称为表连接,可通过处理算法工具箱中的 按字段值连接属性 工具完成。
任务概述¶
我们将使用加利福尼亚州的普查区边界 Shapefile 和美国人口普查局的人口数据表,来创建加利福尼亚州的人口密度图。
你将学到的其他技能¶
- 在 QGIS 中加载不包含任何几何信息的 CSV 文件。
- 消除 CSV 文件中的额外表头行。
- 向图层添加新列。
- 使用透明描边样式化图层。
获取数据¶
我们想为美国加利福尼亚州准备一份人口密度图。我们首先需要获取该州每个普查区的人口数量表。
下载人口普查表¶
- 访问 美国人口普查局,点击查看表格。
- 点击左上角的过滤器图标。
- 首先过滤出加利福尼亚州。点击 "Geography"。
- 点击 "Tract",它可以提供普查区信息。
- 选择 "California"。
- 勾选 "All Census Tracts within California"。这允许我们将所有信息作为一个文件下载,而不是为每个普查区单独下载。现在我们已经设置了地理范围,点击 "Topics"。
- 在 "Select Topics" 下,选择 "Population and People"。
- 勾选 "Population and People"。现在我们已经选择了所有必要的过滤器。关闭过滤器窗口。
- 在 "Download tables" 窗格中向下滚动,找到 "S0101 | AGE AND SEX"。
- 这将打开数据的详细视图。我们只关心人口,因此取消选择 "Margin of Error",以便只获取必要的信息并节省文件存储空间。
- 点击 "Download" 按钮。
- 所选数据提供多年版本,并使用不同的估算技术。建议使用 "ACS 5-Year Estimate Subject Tables",因为多年估算提高了数据的可靠性。它也没有数据缺口,包含所有普查区的信息。选择年份
2019,然后点击 "Download"。这将下载一个 zip 文件。下载完成后,在本地磁盘解压。
下载普查区边界¶
为了根据人口普查表创建地图,我们还需要代表加利福尼亚州每个普查区的边界。
- 访问 TIGER Line Shapefiles,点击 "Web Interface"。
- 在 "Select year" 下选择
2019,在 "Select a layer type" 下输入Census Tracts,然后点击 "Submit"。
- 在 "Select a State" 下选择
California,然后点击 "Download"。这将下载一个包含矢量文件的 zip 文件。
为方便起见,您也可以直接从以下链接下载两个数据集的副本:
数据来源 [TIGER] [USCENSUS]
操作步骤¶
- 在 QGIS 浏览器中找到
tl_2019_06_tract.zip文件并展开它。选择tl_2019_06_tract.shp文件并将其拖到画布上。
- "选择转换" 对话框会提示从 EPSG:4269 转换到 EPSG:4326。此对话框提供了在这两个投影之间转换坐标的几种转换方法。保持默认选择并点击 "OK"。
- 你会看到图层
tl_2019_06_tract已加载到 "Layers" 面板中。此图层包含加利福尼亚州的普查区边界。右键点击tl_2019_06_tract图层并选择 "打开属性表"。
- 检查图层的属性。要将一个表与此图层连接,我们需要每个要素的、唯一的且共有的属性。在本例中,有 8057 个单独的普查区记录,每个都有
GEOID字段。此列可以将此图层与任何其他包含相同 ID 的图层或表连接起来。
- 要加载表格数据,点击 "打开数据源管理器"。
- 在 "数据源管理器" 对话框中,选择 "分隔文本文件"。然后,在右侧,点击 "文件名" 旁边的
...,浏览到包含加利福尼亚州人口数据的解压缩 CSV 文件的文件夹。
- 现在,在 "样本数据" 下,我们甚至可以在将其加载为图层之前检查数据。数据显示该数据表包含 2 个表头行。
- 要消除额外的表头行,在 "记录和字段选项" 下,将 "要丢弃的表头行数" 设置为
1。现在该表将包含正确的列标题。由于此图层仅包含表格数据,在 "几何图形定义" 下选择无几何图形(仅属性表)。点击 "添加" 将其添加为图层,然后点击 "关闭" 关闭此对话框。
- CSV 文件现在将作为表格导入 QGIS,并在 "Layers" 面板中显示为
ACST5Y2019.S0101。现在右键点击该图层并选择 "打开属性表"。
ID列包含每条记录的唯一 ID,可用于将此表与tl_2019_06_tract图层连接。如果将ID的值与tl_2019_06_tract的GEOID列进行比较,你会注意到它带有前缀 1400000US。要成功合并这两个表,值必须完全匹配。让我们去掉这个前缀,并添加一个包含最后 11 个字符的新列,这 11 个字符包含了完全匹配的值。
- 要创建一个包含最后 11 位数字的新列,通过菜单 "Processing" → "Toolbox" 打开处理工具箱,搜索并找到 "矢量表" → "字段计算器" 算法。
- 在 "字段计算器" 对话框中,选择
ACST5Y2019.S0101作为 "输入图层",在 "字段名称" 中输入geoid,并在 "结果字段类型" 中选择字符串。现在在表达式中搜索substr。我们可以使用此函数从 id 字段中提取所需部分。
- 输入以下表达式。我们使用 substr 函数并从位置 -11 开始提取值(负值表示从末尾开始计数)。最终结果可以在 "预览" 部分查看。点击 "运行"。
bash substr("id", -11)
- 现在一个新的图层
Calculated将加载到画布中,让我们检查其属性表。将会出现一个新列geoid,其值可以与普查区数据匹配。
- 要创建表连接,通过菜单 "Processing" → "Toolbox" 打开处理工具箱,搜索并找到 "矢量通用" → "按字段值连接属性" 算法。
- 在 "按字段值连接属性" 对话框中,选择
tl_2019_06_tract作为 "输入图层",选择GEOID作为 "表格字段"。选择Calculated作为 "输入图层 2",选择geoid作为 "表格字段 2"。在 "要复制的图层2字段" 下,点击...。
- 勾选
Geographic Area Name、Estimate!!Total!!Total population和geoid。点击 "OK"。
- 勾选 "丢弃无法连接的记录"。这将消除人口表中任何多余的记录。点击 "已连接图层" 下的 ... 按钮来选择输出文件位置,并选择
保存到文件...。
- 将输出 GeoPackage 命名为
california_total_population.gpkg。点击 "运行"。
- 处理完成后,验证算法是否成功(如果所有 8057 个要素都已连接)。点击 "关闭"。
- 你会看到一个新图层
california_total_population加载到 "Layers" 面板中。此时,CSV 文件的字段已连接到普查区图层。现在我们的人口数据已加入普查区图层,我们可以对其进行样式化,以创建人口密度分布的可视化图。点击 "打开图层样式化面板" 按钮。
- 在 "图层样式化" 面板中,从下拉菜单中选择
分级渲染。由于我们想要创建人口密度图,我们希望根据人口密度为每个普查区要素分配不同的颜色。人口数据在 Estimate!!Total!!Total population 字段中,面积数据在 ALAND 字段中。点击 "表达式" 按钮,计算每个普查区人口占总人口的百分比。
注意
在创建此类专题(分区着色)地图时,对要映射的值进行归一化非常重要。直接映射每个多边形的总数是不正确的。必须通过除以面积来对值进行归一化。如果要显示总数(如犯罪数量),可以将其除以总人口进行归一化,从而映射犯罪率而不是犯罪数量。了解更多
- 输入以下表达式来计算人口密度。要素的面积以平方公里为单位。我们将其乘以
1000000转换为平方米,然后使用公式人口/面积计算人口密度。预览结果并点击 "OK"。
bash 1000000 * ("Estimate!!Total!!Total population"/"ALAND")
- 在 "图层样式化" 面板中,点击 "分类" 并将分类数量设置为
10。
- 点击色带选择器,选择色带
RdYlGn。
- 更高的密度更值得关注,让我们将绿色分配给较低密度区域,红色分配给高密度区域。点击色带选择器,选择 "反转色带"。
- 现在我们有了一个关于加利福尼亚州人口密度的、看起来非常棒的信息可视化图。为了让它更好,让我们将每个普查区的边界设为透明。点击 "符号" 选项卡。
- 点击 "描边颜色",选择
透明描边。
- 可以调整分级区间,点击 "数值" 会弹出一个对话框,用于输入上下边界值。
- 一旦您满意了,请关闭图层样式化面板。我们现在拥有了一幅美观的、关于加利福尼亚州人口密度的信息可视化地图。
如果你想提供反馈或分享学习本教程的体验,请在下方评论。(需要 GitHub 账户)












































