1 空间属性关系
1.1 数据导入和图层组合
- 读取数据
除了使用关键项的连接之外,还有一种根据属性组合中的空间位置关系进行组合的方法。 在本节中,我们将介绍一种方法,用于将空间关系中的多边形数据属性与任意点数据属性相结合。 我们使用的是 “world earthquake”“wcountry” 数据,首先,启动QGIS并在主菜单 Project ‣ Open 中加载我们所需要的数据。 如 图 4.8 。
图 4.8 数据及属性显示 - 组合层
选择QGIS的主菜单 Vector ‣ Data Management Tools ‣ Mergr Vector Layer ,弹出 “Merge Vector Layers” 窗口。 选择此窗口的选项卡菜单 Parameters ,然后单击 “Input layers” 右侧的 … 按钮。如果显示多个窗口, 请选中“地震点避难场所缓冲区(EPSG:4326)”和“地震点避难场所缓冲区2(EPSG:4326)”并单击 0K 按钮。
在 “Merged” 中,单击右侧的 … 按钮,然后选择 “Save to file” 。出现 “Save file” 窗口时, 在“保存类型”中选择 “SHP文件(.shp)” 。接下来,指定“地震点_组合层.Shp”应保存在空间分析文件夹中,然后单击 Save 按钮。 然后,选中 “Open output file after running algorithm” ,然后单击 Run 按钮。 在 “Layers” 中创建图层 “Merged” ,并绘制地图。
此时在“空间分析”文件夹中创建Shp文件,并显示名称为 “Merged” 图层面板要更改此图层名称, 请右键单击 Layers 中的 “Merged” ,然后从出现的菜单中选择 Remove Layer 。 可以在 “Layers” 中更改图层的名称,因此将 “Merged” 更改为“地震点_层组合”。 确认新图层后,取消选中“地震点避难场所缓冲区(EPSG:4326)”和 “地震点避难场所缓冲区2(EPSG:4326)”并隐藏它们,如 图 4.9 。
图 4.9 组合层后的图层显示
1.2 属性组合
作为属性结合的工作,最初将层 “world earthquake” 的属性数据与层 “wcountry” 的属性数据进行结合。 选择主菜单 Vector ‣ Data Management Tools ‣ Join Attributes by Location , 以显示 “Join Attributes by Location” 窗口。在此窗口中,为 Input layer 选择 “world earthquake(EPSG:4326)” , 然后为 Join layer 选择 “wcountry(EPSG:4326)” 。 另外,在 Geometric predicate 中,勾选"intersects"。此外,在 Join type 中 选择 “Take attributes of the first located feature only (one-to-one)” ,如 图 4.10 。
图 4.10 属性组合设置
对于 “Joined layer” ,单击右侧的 … 按钮并选择 “Save to file” 。 显示 “Save file” 窗口时,在“保存类型”中选择 “SHP文件(.shp)” , 在“空间分析”文件夹中,指定“地震点_属性组合.shp”作为保存目的地, 然后单击 Save 按钮。选中 “Open output file after running algorithm” , 然后单击 Run 按钮。在 “Layers” 中创建一个名为 “Joined layer” 的图层。
此时,在“空间分析”文件夹中创建“地震点_属性组合.shp”, 并在 “Layers” 中将其命名为 "Joined layer "。要更改图层名称, 请在 Layers 中右键单击 “Joined layer” ,从显示的菜单中选择 Remove Layer , 可以在 “Layers” 中更改层名称,因此将 “Joined layer” 更改为“地震点_属性组合”。 右键单击图层“震点_属性组合”以显示菜单,然后选择 Open Attribute Table 。 查看显示的属性表,可以确认组合 “world earthquake” 和 “wcountry” 的属性已被组合,如 图 4.11 。
图 4.11 属性组合结果显示
此时,从主菜单中选择 Save ,然后在“空间分析”文件夹并保存“空间分析5.Qgs”。 选择 Project ‣ Exit QGIS退出QGIS。
2 属性搜索
2.1 按字符串搜索
- 字符串搜索
属性搜索是一种从属性元组中提取满足任意条件的记录的函数。在这里,我们使用在全球地理基本数据来解释属性搜索。
首先启动QGIS,我们首先加载数据,点击 Layer ‣ Add Layer ‣ Add Vector Layer 加载 “wcountry.shp” 数据, 使用层 “wcountry.shp” 的属性表进行字符串搜索。在搜索前我们打开属性表,先观察下数据的属性。 接下来,使用"wcountry.shp"的属性表中的 “FCNAME” 属性名称,搜索检索所在的“中国”的记录。 右键单击 Layers 的 “wcountry.shp” 以显示菜单,然后选择 “Open Attribute Table” 。 显示 “Attribute Table” 窗口时,单击工具栏上的 Select features using an expression 图标。 当出现 “Select by Expression” 窗口时,双击列表中 Fields and Values 中的 “FCNAME” 。 然后, “FCNAME” 显示在 “Expression” 输入字段中。单击 运算符= 按钮。此外,单击 Fields and Values 中的所有值, 当在 “FCNAME” 输入的数据显示在列表中时,双击“中国”。作为这些操作的结果,在窗口左侧的输入字段中输入“PROVINCENA=‘中国’”。 注意这里的“中国”要是在输入字段中双击获得,而不是自己手动输入,我们自己手动输入是无法进行字符串搜索的。 接下来单击 Select Features 按钮,地图上选择的统计区域颜色会发生变化,如 图 4.12 。
图 4.12 字符串搜索设置
确认已选择统计区域后,请检查属性表。如果查看"wcountry.shp"的属性表,可以看到在 “FCNAME” 项目中输入“中国”的记录被选中。 要取消此选择,请单击 “Attribute Table” 窗口工具栏中的 Deselect all 图标。完成上述操作后, 单击 “Select by Expression” 窗口中的 Close 按钮。
- 模糊搜索
我们引入模糊字符串搜索作为下一个例子。上述搜索条件是它与字符串“中国”完全匹配。 但是,接下来我们搜索的条件是包含在字符串中的某处名称。
首先还是单击 “Attribute Table” 窗口工具栏上的 Select features using an expression 图标以显示 “Select by Expression” 窗口。 双击此窗口列表中 Fields and Values 中的 “FENAME” ,然后在列表中的"Operators"中双击 LIKE 。 确认 “FENAME LIKE” 表示在窗口左侧的进口字段中,然后输入 “NAME” ,单击 Select Features 按键。 然后,在属性表的字段项 “FENAME” 中,选择含有字符串 “name” 的统计区域,并在相关区域的地图上进行变更, 如 图 4.13 。
图 4.13 模糊搜索
搜索完成后,单击 “Attribute Table” 窗口工具栏上的 Deselect all 图标,然后单击 “Select by Expression” 窗口中的 Close 按钮。
2.2 数字搜索
- 按一个条件搜索
到目前为止,已经执行了使用字符串的属性搜索,现在我们使用数值之间的条件来执行属性搜索。 为此,使用属于 “wcountry.shp” 的属性数据的来设置属性搜索的条件,可以统计出"面积、人口"。 接下来单击 “Attribute Table” 窗口滚动条中的 Select features using an expression 图标以显示 “Select by Expression” 窗口。 双击此窗口列表中 Fields and Values 中的"POP",然后双击 Expression 中 “Operators>=” 。当窗口左侧的输入字段中 显示 “POP” >= 时,输入 “10000” 。确认此输入字段中显示 “POP”> =10000,然后单击 Select Features 按钮, 选择人口密度为10000人或更高的统计区域,并在地图上受影响区域的颜色会发生变化,如 图 4.14 。
图 4.14 数字搜索
- 按多种条件搜索
此外,为了执行复杂的属性搜索,除了人口密度为10000或更大的条件之外,还可以添加面积或更多的条件。 因为根据数据的属性特点,我们选取的条件为人口密度大于10000,面积大于100的国家,我们来看下,根据这样的条件进行搜索会有什么样的结果。 在 “Select by Expression” 窗口的输入字段中输入"POP"> =10000,双击列表"Operators"中的"AND",然后在列表中选择 “Fields and Values” 。 双击 Fields and Values 中的"SHAPE_AREA"。然后,在列表的 Operators 中双击 “Operators> =” ,并在窗口左侧的输入字段中输入"1000"。 确认"POP">10000 AND “SHAPE_AREA”> =1000,然后单击 Select Features 按钮。则该区域的颜色会在地图上发生变化, 如 图 4.15 。
图 4.15 按多种条件上搜索
在这种情况下,我们提取了满足两个条件的统计区域,但应使用两个条件中的一个,如人口密度为10000 或更高或面积高于1000的统计区域。 如果要提取满足的区域,请输入 “OR” 而不是 “AND” 。完成搜索后,单击 “Attribute Table” 窗口工具栏中的 Deselect all 图标, 然后单击 “Select by Expression” 窗口中的 Close 按钮。
3 计算线段的长度和基本统计
QGIS 内建的功能可以计算图征的几何性质,像是长度、面积、周长等等。本节我们计算线段的长度与统计。 我们使用的数据是北美铁路网的线段式 shapefile 来计算铁道总长度。 可以在 http://www.qgistutorials.com/downloads/ne_10m_railroads_north_america.zip 下载
3.1 计算及统计
- 首先打开QGIS,加载所需要的数据,选择 Layer ‣ Add Vector Layer 进行加载,图层载入后, 会显示所有北美的铁道线段。我们的目标是只计算美国的铁路长度,所以必须要先选择那些位于美国境内的铁路才行。 所以右键点击图层打开 Open Attribute Table ,这个图层含有一个叫做"sov_a3"的属性,其值使用三个英文字母来代表 这段图层位在哪个城市。我们要利用这个属性来选择位于美国境内的铁路,如 图 4.16 。
图 4.16 查看属性
- 在 Attribute Table 视窗中按下 Select features using an expression 按钮,如 图 4.17
图 4.17 运算按钮
- 当 Select By Expression 的视窗出现后,在 Fields and Values 分类中找到"sov_a3"属性, 然后点击两下以加入到 Expression 区中,补完这个表达式 “sov_a3” = ‘USA’ ,填好后按下 Select , 然后按 Close ,如 图 4.18 。
图 4.18 运算界面
- 回到 QGIS 主视窗,现在在美国境内的线段都被选取,并标为黄色了,现在来把选取区域另存新档。 在"ne_10m_railroads_north_america"图层上单击右键然后选择 Export 中的 Save Selected Features As… , 如 图 4.19 。
图 4.19 另存新档
-
在 Format 中选择 ESRI Shapfile 然后把输出档命名为"usa_railroads.shp"。 这里我们顺便转换一下图层的"CRS",按下 CRS 后边的图标,如 图 4.20 。 QGIS 的内建函数是使用图层的座标参考系统 (CRS) 的预设单位来计算线段长度。单位是“degrees”, 计算线段或面积的结果也会是"degrees"或是"square degrees" ,以此作单位的数值其实并不实用所以这里必须要使用 以"meters"或是"feet"作为单位的座标参考系统来做计算。
图 4.20 另存新档 -
因为我们是要计算长度,这里来选一个等距离投影试试。在 Filter 栏位输入"north america equ" 后,下面结果就会 出现"North_America_Equidistant_Conic EPSG:102010"选择它作为新的 CRS 之后,按下 :guilabel:`OK , 如 图 4.21 。
图 4.21 设置CRS
- 回到刚才的 Save vector layer as… 视窗,勾选 “Add saved file to map” 和 “Save only selected feature”` , 最后按下 OK ,如 图 4.22 。
图 4.22 另存新档
- 操作完成后,QGIS 中会出现叫做"usa_railroads"的新图层。现在已经用不到旧图层, 可以取消"ne_10m_railroads_north_america"的勾选,把它隐藏起来了,在"usa_railroads" 图层上按右键, 选择 Open Attribute Table ,如 图 4.23 。
图 4.23 新档属性
-
接下来就来为所有图征新增一个长度的属性。按下 Toggle editing 钮以进入编辑模式, 在此模式中,按下 Open field calculator 钮,如 图 4.24 。
图 4.24 编辑模式 -
在 Field Calculator 中,先勾选"Create a new field",在"Output field name"中输入 “length_km”。 在 Output field type 中选择 “Decimal number (real)”,精确度 Precision 输入"2", 然后在底下找出 “Geometry” 分类中的" l e n g t h " 并且双击以加入 " E x p r e s s i o n " 区块。因为我们想要以 " m e t e r s " 为单位但图层的 C R S 使用 " k m " 为单位,所以这里公式要改成: " length"并且双击以加入 "Expression" 区块。 因为我们想要以"meters"为单位但图层的 CRS 使用"km"为单位,所以这里公式要改成:" length"并且双击以加入"Expression"区块。因为我们想要以"meters"为单位但图层的CRS使用"km"为单位,所以这里公式要改成:"length / 1000"。 最后按下 OK ,如 图 4.25 。
图 4.25 编辑设置 -
回到 Attribute Table ,新的"length_km"属性就会出现。再次按下 Toggle editing 以储存刚才所做的修改。 如 图 4.26 。
图 4.26 新增属性
- 现在每个线段都有自己的长度,我们只需简单的加总,就能知道全线段"Total", 接下来选择 Vector ‣ Analysis Tools ‣ Basic Statisticsfor fields , 如 图 4.27 。
图 4.27 计算
- 然后在 Input Layer 中选择"usa_railroads",在 Field to calculate statistics on 中选择"length_km"。 按下 Run 后,就可以看到多个统计资讯出现,其中的"Sum"数值就是我们这次要找的铁道总长度, 如 图 4.28 。
铁道总长度在不同的投影下会有些不同。实物上,线段、道路等长度一般会在制作资料库时一并测量,并作为要素的其中一个属性。 本节介绍的方法可以当作真实线段长度的近似估计,使用在那些没有这个属性的要素上。
图 4.28 计算结果
4 属性表与CSV表连接
当想要用的资料集可能不是 shapefile,或是任何一种空间资料格式。 这些资料的格式往往是表格或试算表,要把它们加入你的资料分析中, 必须让它们和你手上的空间资料产生关联。操作这个过程称为资料表连接 Table Join 。 这节我们会说明在 QGIS 中如何将资料表连接起来。
我们使用美国加州的人口统计分区 shapefile,与美国人口调查局提供的人口数资料表,做一份加州的人口分布图。 可以在这里下载: http://www.qgistutorials.com/downloads/tl_2013_06_tract.zip
http://www.qgistutorials.com/downloads/ca_tracts_pop.csv
4.1 表连接
-
我们先载入人口统计分区的 shapefile文件。选择 Layer ‣ Add Vector Layer ,加载"tl_2013_06_tract.shp"图层, 可直接点 Add , QGIS 就会载入人口统计分区资料,如 图 4.29 。
图 4.29 加载图层 -
图层加载后单击图层右键,进行属性查看。选择 Open Attribute Table 检视 shapefile 中每个分区的属性。 要把表格资料与这份 shapefile 文件相关联,图层中的每个要素都需有个共同属性,其值在每个图征中各不相同。 在这个例子中,"GEOID"属性可以识别每一个分区,这就可以把这份 shapefile 与任何包含同样 ID 的表格资料"link"起来, 如 图 4.30 。
图 4.30 属性查看
- 用文字编辑器打开"ca_tracts_pop.csv"这份 CSV 文件。你会注意到,文件中的每一列都含有关某个分区的资讯, 其中就有我们在上一步骤看到的识别属性。注意在这份 CSV 中,有个识别属性栏位叫作 “GEO.id2” 。 还会看到 “D001” 这个栏位记录了每个分区的人口数。如 图 4.31 。
图 4.31 CSV文件查看
- 我们可以不做任何加工,直接汇入这份 CSV 文件。不过,这样一来每个栏位预设的资料型态会是 “String” (文字)。 这样通常没有问题,除了像 “D001” 这样包含人口数字的栏位。如果这些数字栏位被当作文字汇入,我们就不能拿这些栏位做数学计算。 要让 QGIS 把这些栏位当作数字汇入,我们必须建立一个".csvt"的附加文件。这个附加文件只会有一列内容, 用来指定每一栏位的资料型态。我们把这个附加文件命名为"ca_tracts_pop.csvt"储存到原本的".csv"文件所在的目录。 如 图 4.32 。
图 4.32 CSV文件
- 我们可以把 CSV 文件汇入 QGIS 中了。选择 Layer ‣ Add Layer ‣ Add Delimited Text Layer , 在目录下浏览并选择 CSV 档。注意 File format 要选择 “CSV (comma separated values)” 。这份资料是单纯的表格, 所以我们得注明文件中不包含地理资讯。选择 No geometry (attribute only table) , 再点选 Add ,如 图 4.33 。
图 4.33 加载CSV文件
-
这样 CSV 文件就被汇入 QGIS 里成为一份表格,接下来选择"tl_2013_06_tract"图层,然后按右键选择 Properties , 在 Layer Properties 视窗中,选择 Joins 分页,按下底端的"+"号按钮,以建立新的资料表连接, 如 图 4.34 。
图 4.34 Joins分页 -
在 Add vector join 视窗中,Join layer 选择"ca_tracts_pop",然后我们需要为 shapefile 和 CSV 档选择用以 连接的独特属性,也就是说 Join field 要填上"GEO.id2"和 Target field 要填上"GEOID" 。最后按下 OK , 如 图 4.35 。
图 4.35 连接
- 关闭 Layer Properties 视窗,回到 QGIS 主画面。现在 CSV 档中的资料已经与 shapefile 连接在一起了。 在"tl_2013_06_tract"图层上按右键,选择 Open Attribute Table ,现在我们可以看见所有的图征都多了几个新的栏位, 包括"ca_tracts_pop_D001"这个栏位。现在你可以从 CSV 的资料表连结存取每个分区的人口了,现在关掉属性表并回到 QGIS 主视窗,如 图 4.36 。
图 4.36 连接新属性
- 接下来我们设置一下图层,在"tl_2013_06_tract"图层上按右键选择 Properties ,选择 Symbology 分页, 然后从下拉式选单中选择 Graduated 。由于我们要制作人口分布图,最好的颜色配置当然是基于人口的数量多少来决定。 在行栏位中选择"ca_tracts_pop_D001",然后再从 Color ramp 下拉选单中选择 “Column” 。 接着在 Mode 中选择 “Quantile (Equal Count)” 。按下 Classify 后,就可看到不同的人口数量被指定成不同颜色, 最后按下 OK ,如 图 4.37 。
图 4.37 图层设置
- 这下我们就看到了一张人口分区普查结果地图。你可以使用 Zoom in 钮查看图层中较小的区域, 如 图 4.38 。
图 4.38 放大查看
- 精细、准确的加州的人口地图制作完成。也可以试着使用同样的方法针对不同的普查结果制作地图, 如 图 4.39 。
图 4.39 效果图