(4) 中级QGIS操作

1. 数据表连接

想要用的数据集可能不是shapefile,或是任何一种空间数据格式。这些数据的格式往往是表格或电子表格,要把它们加入数据分析中,必须让它们和手上的空间数据产生关联。操作这件事情称为数据表连接(Table Join)。这篇教学会说明在QGIS中要如何将数据表连接起来。

内容说明

使用美国加州的人口统计分区shapefile,与美国人口调查局提供的人口数数据表,做一份加州的人口分布图。

会学到这些

• 为CSV档案制作一份.csvt档案,以注明各字段的数据型态

• 在QGIS中加载不含任何地理信息的CSV档案

取得资料

美国人口调查局 提供多种从MAF/TIGER数据库导出的空间数据。可以查询并下载加州的人口统计分区shapefile。下载 Census Tractsfor California 这个档案。

Americal Fact Finder 提供所有美国的人口统计资料。可以用「进阶搜寻」(Advanced Search),查询Topic-Total Population与Geographies-All Census Tractsin California,以建立并下载我们需要的CSV档案。以下教学使用Total Population 2010 Census Summary File1这份数据。

为了方便起见,可以直接用下面的连结下载这两份数据集:

tl_2013_06_tract.zip

ca_tracts_pop.csv

数据源: [TIGER][USCENSUS]

操作流程

先载入人口统计分区的shapefile。选择图层→加入向量图层。

浏览并选择载下来的tl_2013_06_tract.zip压缩文件。QGIS可以直接开启压缩文件,所以档案不用事先解压缩。

选择tl_2013_06_tract.zip图层并点选确定。

QGIS就会加载人口统计分区资料。

图层上右键单击,选择开启属性表格。

检视shapefile中每个分区的属性。要把表格数据与这份shapefile相关联,图层中的每个图征都需有个共同属性,其值在每个图征中各不相同。在这个例子中,GEOID属性可以识别每一个分区,这就可以把这份shapefile与任何包含同样ID的表格数据「连接」起来。

用文本编辑器开启ca_tracts_pop.csv这份CSV档案。会注意到,档案中的每一列都含有关于某个分区的信息,其中就有在上一步骤看到的标识属性。注意在这份CSV中,有个标识属性字段叫作GEO.id2。还会注意到D001这个字段记录了每个分区的人口数。

可以不做任何加工,直接汇入这份CSV档案。不过,这样一来每个字段默认的数据型态会是「字符串」(文字)。这样通常没有问题,除了像D001这样包含人口数字的字段。如果这些数字字段被当作文字汇入,就不能拿这些字段做数学计算。要让QGIS把这些字段当作数字汇入,必须建立一个.csvt的附加档案。这个附加档案只会有一列内容,用来指定每一字段的数据型态。把这个附加档案命名为ca_tracts_pop.csvt,储存到原本的.csv档案所在的目录。也可以从这里下载这个csvt档案

可以把CSV档案汇入QGIS了。选择图层→加入分隔文字图层。

在目录下浏览并选择CSV檔。注意文件格式要选择CSV(逗号分栏值)。这份数据是单纯的表格,所以得注明档案中不包含地理信息。选择无几何字段(仅产生属性表格),再点选确定。

这样,CSV档案就被汇入QGIS里成为一份表格。

选择tl_2013_06_tract图层,然后右键单击选择属性。

在图层属性窗口中,选择链接(Joins)分页,按下底端的+号按钮,以建立新的数据表连结。

在加入向量链接窗口中,链接(Join)图层选择ca_tracts_pop,然后需要为shapefile和CSV档选择用以链接的独特属性,也就是说链接字段要填上GEO.id2,目标字段要填上GEOID。最后按下确定。

关闭图层属性窗口,回到QGIS主画面。现在CSV文件中的资料已经与shapefile链接在一起了。在tl_2013_06_tract图层上右键单击,选择开启属性表格。

现在可以看见所有的图征都多了几个新的字段,包括ca_tracts_pop_D001这个字段。现在可以从CSV的数据表连结存取每个分区的人口了,请关掉属性表格并回到QGIS主窗口。

在tl_2013_06_tract图层上右键单击选择属性。

选择样式分页,然后从下拉式选单中选择渐层。由于要制作人口分布图,最好的颜色配置当然是基于人口的数量多寡来决定。在行字段中选择ca_tracts_pop_D001,然后再从色彩映射表下拉选单中选择喜欢的色条。接着在模式中选择分位数(每个颜色相同计数)。按下分类后,就可看到不同的人口数量被指定成不同颜色,最后按下确定。

就可视化了一张不错的人口分区普查结果地图。可以使用放大钮查看图层中较小的区域。

精细、准确的加州的人口地图制作完成。可以试着使用同样的方法针对不同的普查结果制作地图。

2. 空间连接

空间连接是个经典的GIS课题:如何基于空间关系,把相关属性值从一个图层转到另一个图层?在QGIS中,有个称为由空间链接属性的工具,可以实现此一功能。

内容说明

使用2个图层,分别为纽约市邻里的边界,以及纽约市护理之家的所在地。最终目标是使用空间连接,找出每个区的护理之家的总乘载人数。

会学到这些

从图层的属性表格中删除整栏

取得资料

NYC Open Data Portal 是纽约市不错的免费数据源。

可以使用接口上的Export钮下载 Borough Boundaries 的zip檔。

使用接口上的Export钮下载Nursing Homes的zip檔。

为了方便起见,可以直接用下面的连结下载:

nybb_12c.zip

OEM_NursingHomes_001.zip

操作流程

选择图层→加入向量图层,选择刚才下载的nybb_12c.zip,然后按开启。

选择nybb.shp图层并点选确定。

对另一个档案OEM_NursingHomes_001.zip重复步骤3与4,载入OEM_NursingHomes_001.shp图层。两个图层都加载后,右键点选OEM_NursingHomes_001图层然后选择开启属性表格。

查阅每个图征的属性,由于要计算每个区护理之家的总承载人数,因此可使用Capacity(乘载人数)属性来连接行政区的边界图层。

选择向量→数据管理工具→由空间链接(Join)属性。

目标向量图层是要加入新属性的图层,因此在本教学中为区边界的nybb图层。而结合(Join)向量图层则是护理之家的分布图层OEM_NursingHomes_001。由于想要把所有在同一区的护理之家乘载人数加总,因此请选择相交图征概要然后选择总合。输出档命名为nyc_borough_join.shp,在输出表格一栏中,选择保留所有纪录。

处理结束时,程序会问要不要把图层加入TOC(QGIS主窗口),选择是。新的图层nyc_borough_join含有从nybb复制过来的图征,而且属性已与OEM_NursingHomes_001连接完成。右键点选新图层,选择开启属性表格。

可以看到属性表中出现了新的字段SUM Capacit,这就是原本属于同一区的护理之家的Capacity属性加总。

已经找到想要的信息了,但是在输出中还存在着其他不需要的字段,接着来清理一下。点选切换编辑模式,然后选择删除栏按钮。

在删除属性窗口中按下Control+A以选择所有字段,然后按住Control键,取消选取想保留的属性,最后按下确定。

回到属性表格,再次按下切换编辑模式以储存刚才的更动。

回到QGIS主画面中,可以使用识别图征工具,验证输出档中每个区的图征只具有我们想要的属性。

3. 找出在多边形中的点

GIS的强项之一,就是同时分析多种不同来源的数据。想找到的信息或答案,通常会藏在不同的图层中,必须要透过许多的萃取程序,才能把这些东西汇整在一起。类似这种概念的技术中,有一种称为Points-in-Polygon(多边形中的点),是指当有一个多边形图层和一个点图层时,要如何找出那些点分布在多边形内的分析技术。

内容说明

已有许多重要地震的位置,现在要找出哪个国家的地震数量最多。

取得资料

这里要使用NOAA的美国国立地球物理数据中心(NGDC)的 Significant Earthquake Database ,内含所有的全球重大地震。下载 地震资料的tab分隔文件

Natural Earth上有 Admin0-Countries 国家边界资料,这边 可以下载。

为了方便起见,也可以直接用下面的连结下载:

signif.txt

ne_10m_admin_0_countries.zip

数据源:[NGDC][NATURALEARTH]

操作流程

打开QGIS,选择图层→加入分隔文字图层,然后选择刚下载的signif.txt。

这个档案是Tab分隔檔,所以可以在文件格式字段选择定位键。程序会自动选择X和Y字段,所以按下确定即可。

批注

可能会看到QGIS显示读取档案的时候出现了一些错误,这是由于档案中的某些值异常所引起的,这些异常的数据不会被读取。在本教学中,就先忽略这些错误没关系。

因为地震数据是以经纬度坐标纪录的,所以在选择坐标参考系统时,要选WGS84EPSG:436这个CRS。

现在地震的点图层已在QGIS中呈现。接下来要开启的是国家的图层,选择:menuselection:图层–>加入向量图层`,点选下载的ne_10m_admin_0_countries.zip然后按下开启。在选择加入的图层窗口中,选择ne_10m_admin_0_countries.shp。

选择向量→分析工具→点图征在多边形中,

在跳出的窗口中分别指定多边形图层和点图层,然后把输出图层命名为earthquake_per_coutry.shp,完成后按下确定。

批注

按下确定后,QGIS可能要花上10分钟处理数据,请保持耐心。

当程序为问是否要加入图层到QGIS中时,选择要。

现在有个新图层已加入了QGIS中。在图层上右键单击选开启属性表格,进入属性字段的显示页面。

在属性表格中,可以找到称为PNTCNT的新字段,此栏就是地震点落在此多边形的总数目。

如要找到目标国家,可以简单地把国家按照PNTCNT字段的大小来排序。在PNTCNT域名上按2次,这栏就会从大到小排序,点选第一个字段,然后关掉属性表格。

回到QGIS窗口后,有一个图征会被标成黄色,这个图征就是刚刚选择的、有最多点在内的多边形。选择识别图征钮然后单击此多边形,就可以看到有着最多重要地震的国家是中国大陆。

在这个简单的分析中,对比了2笔数据库,发现中国大陆境内具有最多的主要地震。也可以尝试继续进一步分析,像是考虑人口与国家的大小,这些都会影响大地震对一个国家的冲击程度。

4. 空间查询

空间查询是许多种GIS分析技巧的核心。在QGIS中,这个功能可以透过Spatial Query这个附加组件来达成。

内容说明

使用的2个数据库分别为河流的线图层以及城市的点图层,要做的事情是寻找所有与河流的距离小于10公里的城市。

会学到这些

• 在QGIS中直接开启zip檔

• 选择适合的投影法,重投影向量数据

• 制作「环域〈buffers〉」

• 使用类SQL的表示法选择图征

• 把shapefile转换为KML檔

• 利用Google Earth来验证结果

取得资料

要使用Natural Earth提供的ne_10m_rivers_lake_centerlines和10m_populated_places_simple这两个数据库。

下载河流与湖泊中心线

下载人口居住地

数据源:[NATURALEARTH]

操作流程

载好数据以后,打开QGIS,选择图层→加入图层→加入向量图层。

点选浏览然后移到下载数据的地方。

按住Shift键后点选两个zip档,全部选起来后按下开启。

可能需要从zip档中选择图层加载,选ne_10m_rivers_lake_centerlines.shp然后按下确定。

因为选了两个压缩文件,所以相同步骤要再重复一次。选择10m_populated_places_simple.shp然后按下确定。

接着QGIS中就可以看到这两个图层。

下一步是为点和线图层制作「环域」,它是一种地理预算函数,QGIS会使用图层的单位计算空间中的任一点到图征的距离,也就是「环域距离」。目前的地理坐标参考系统(Geographic CRS)以角度作单位,如果要使用公尺或公里为单位进行分析,可能就不是那么适当。因此,必须先使用一个投影坐标系统(Projected CRS)重投影图层。在10m_populated_places_simplelayer图层上右键单击,然后选择存盘为…。

在储存向量图层为…的窗口中,按下在另存为旁边的浏览钮,然后选择输出文件的位置。把输出档命名为populated_places_reprojected.shp,然后按下在CRS旁边的浏览钮〈地球图示〉。

现在要选择适合目的的CRS。由于要制作环域,方位等距投影应会是最好的投影法,因为此投影法具在投影中心附近有非常准确径向距离。本例中,要选个全球投影,以符合全球性的数据集。在选择坐标参考系统窗口中,搜寻worldaz后应该就会看到要的结果,选择World_Azimuthal_Equidistant然后按下确定。

批注

World_Azimuthal_Equidistant投影只会覆盖到投影中心延伸出去90度角的地方,由于的投影中心会是经度0度,所以只有在经度正负90度以内的数据点会被转换。

回到储存向量图层为…的窗口,勾选加入储存档案至地图中,然后按下确定。

对ne_10m_rivers_lake_centerlines重复以上操作,把输出档存为rivers_lake_reprojected.shp。

现在在图层面板中可以看到4个图层,请把原本的图层取消勾选,这样就只有重投影过的图层会显示。不过,重投影的图层目前因为设定的关系,仍然以Geographic CRS显示,把此设定关掉吧。点选项目属性钮,或是前往项目→项目属性。

在项目属性窗口中CRS的分页下,取消开启实时CRS转换的勾选,然后按下确定。

回到QGIS主窗口,右键点选任一个重投影过的图层,选择缩放到图层范围。

现在就可以看到资料使用图层的CRS投影了。接下来就来制作两个数据集的环域,请前往向量→地理运算工具→环域(Buffer)。

在环域工具窗口中,选择populated_places_reprojected作为输入图层,环域距离输入10000。注意本CRS的单位是公尺,所以10,000意味着10公里。输出档取名为populated_places_buffer.shp,然后按下确定。

环域处理结束后,按下是以加入新建的图层到QGIS中。(较新的QGIS版本则需要在上一步骤选择。)

对rivers_lake_reprojected图层重复以上步骤,输出档命名为rivers_lake_buffer.shp。

rivers_lake_buffer图层实际上包含了河流与湖泊,学习目标只需要用到河流图征,所以还要执行一次查询工作,把河流选取起来。在rivers_lake_buffer图层上右键单击,选择开启属性表格。

可以看到,featurecla属性可以利用来作为选择河流图征的工具。请按下使用表示式选取图征钮。

输入表达式“featurecla”=‘River’然后按下选取,接着按下关闭,回到QGIS主窗口。

现在可以进行空间查询了。首先必须要启用Spatial Query附加组件才能使用此功能,如需更多细节请查阅 使用附加组件 。启用后,前往向量→空间查询→空间查询。

查询目标是选择那些自身环域有被河流的环域覆盖到(也就是当图征「相交于」)的城市。请确认选中的图征旁的方框有被勾选起来,这是确保本查询只会只用到之前选择的河流图征。最后按下套用。

查询完成后,窗口会出现一个新区域,名为选中的图征。按下由所选建立图层钮后,有个新图层就会被加到QGIS的图层列表中。最后按下关闭。

现在可以缩放到任一区域察看一下结果,可以发现新的图层只包含了与河流环域相交的图征。

最后,应该要随时检查的结果,确保分析的过程中并没有出错。有个验证的方法是把结果输出成KML档,然后在Google地球中读取,这样就可以确认找到的城市真的距离河流不到10公里。请以右键点选图层,选择存档为…。

在储存向量图层为…的窗口中,需要选择WGS84为CRS,这是KML文件格式的需求。把KML命名为cities_near_river.kml。

打开Google地球,然后验证这些城市(环域可表达其约略范围)真的非常接近河流。

5. 制作热区图

热区图(Heatmap)最适合用来呈现高密度的点数据。它可用于识别点数据中的高度密集区域,在丛集分析或热点分析的操作中也非常有用。

内容说明

使用2011年在英国萨里郡(Surrey)的犯罪地点资料,找出郡内犯罪的热点区域。

会学到这些

如何为高密度的点数据进行热点分析或丛集分析。

取得资料

data.police.uk 以CSV档格式,提供街头犯罪与其结果,以及街头拦检的数据。

从 Surrey Police 下载数据并解压后,就可得到CSV檔。

为了方便起见,你也可以直接用下面的连结下载:

2015-08-surrey-street.csv

数据源:[POLICEUK]

操作流程

首先,要把CSV档汇入QGIS中(细节请参考汇入工作表或CSV檔)。选择图层→加入分隔文字图层。

找到并开启2015-08-surrey-street.csv(如果在网站直接下载的话,档名可能会有些许不同)。文件格式选择CSV(逗号分栏值)后,可以看到Longitude和Latitude字段自动带入到X和Y坐标了。勾选使用空间索引,可以加快在此图层上操作的速度,最后按下确定。

加载时可能会看到一些错误,在本教学中可以先忽略。按下关闭即可。

资料被读到QGIS后,会看到一个警告框写着CRS was undefined:defaulting to CRS EPSG:4326-WGS84。这是因为CSV加载程序的设定是如果坐标是经纬度,那么预设会用EPSG:4326来处理投影。在其他状况下,会有一个窗口跳出来问数据所使用的坐标系统。因为资料是以EPSG:4326投影,所以尽管忽略此警告没关系。(注:随着QGIS版本不同,也有可能会要求输入坐标系统,这时选EPSG:4326即可。)

批注

如果要改变自动指定的CRS,可以到menu selection:向量–>数据管理工具–>定义目前投影中修改。

稍微放大检视数据,可以发现数据相当密集,很难快速判断哪个区块的点密度最高。这种情形下,就是热区图派上用场的时候。

如果是要制作纯粹用来可视化或是打印出来的热区图,QGIS有个内建的图例样式就叫做热区图,先来试试看这个吧。在2015-08-surrey-street图层上右键单击,选择属性。

在属性窗口中切换到样式的分页,样式类别设定成热区图,会看到有许多种不同的色阶可以选,先选个Oranges色阶。其他参数保持不变,按下确定即可。

如此一来就可以看到数据的热区图,换句话说就是犯罪密集度高的地方比较「热」。在刚才的参数页面中有非常多的选项,可以调整到最适合某笔数据的情况。如果只是要弄一个可视化或打印版本的热区图,那么就已经完成了!不过,在这边还要再看看另一种更强大的热区图制作方法,可以使用热区图的输出数据进行后续分析。

启用核心附加组件热区图,可参考使用附加组件进行操作。启用后,选择影像→热区图→热区图。

在Heatmap附加组件的窗口中,输出影像字段填上crime_heatmap当作输出档名,半径字段填上1000。这里的「半径」是指对每个像素而言,要使用多大的圆来计算有多少点涵盖在内。把进阶设定选项打开,这样就能进一步设定输出热区图的尺寸。在行字段中输入2000,会看到列字段会自动更新。按下确定后就会开始制作热区图。

程序跑完后,会有一个叫做crime_heatmap的图层出现在画布上。现在可以把2015-08-surrey-street图层取消勾选了。

让来把这它弄得更像热区图,就像是早些时候的版本那样。在热区图图层上右键单击选择属性。

在样式分页中,绘图类型选择单波段伪彩色,然后在加载最小/最大值字段下方的精确程度,勾选估算(较快),接着按下载入。程序会找出热区图的像素最小值和最大值,以供制作适当的色阶。接下来在产生新的色彩对映表字段中,选择YlOrRd(黄-橘-红)当作色阶,接着按下分类,最后按确定。

现在就可以看到这个图层变得比较像是热区图的感觉了。可以使用识别图征工具,在热区图上的任一区点一下,就可以在结果窗口里面看到这个像素的值。这个值代表图层中有多少点落在这个像素周围指定的区域内(例子是方圆1000公尺)。

这张热区图可以储存下来供未来使用,在许多时候,要找的是那些地方有相当高的点密度(也就是热点,Hotspot),接下来就看要怎么操作。选择影像→影像计算。

第一步是要决定一个门坎值,值比这个门坎还高的像素,会被当作位于高浓度区域。对于此笔资料,先来试试看10吧。在影像计算窗口中,把输出图层命名为crime_hotspots,然后双击在影像波段字段中的cirme_heatmap@1,它就会被加入到下方的影像计算表示式当中。依照如下所示完成表示式,然后勾选将结果加入项目,最后按下确定。

"crime_heatmap@1">10

接着crime_hotspots这个新图层就会被加到QGIS中。这个图层的像素值不是0就是1,它们分别表示像素值小于等于10或大于10。下一步选择影像→转换→转换成多边形(影像转为向量)。

把输出档命名为crime_hotspots_vector,勾选域名及处理完成后载入QGIS地图中,最后按确定。(注:域名请填上DN)

转换完成后,QGIS就会载入crime_hotspots_vector。这是在前一步骤所制作的热点分布图的向量化表示法。目前此图层包含了0与1的集合,所以还要把0的集合滤掉之后,剩下1的集合才是热点的分布区。在图层上右键单击,选择开启属性表格。

在属性表格窗口中按下使用表示式选取图征的按钮。

输入如图所示的表达式,按下选取,然后关闭。

"DN"=0

在属性窗口中,可以看到符合条件的图征被选取了。按下工具栏的切换编辑模式,然后再按下删除已选取图征(DEL)按钮。

把选取的图征删除后,按下储存编辑钮,然后再按下切换编辑模式钮把此图层再次设定为只读。现在可以关闭属性表窗口了。

在QGIS主窗口中,取消crime_hotspots图层的勾选。最终图层crime_hotspot_vector现已包含从热区图中撷取出来的热点。至此为止,已从原始资料中使用精巧的方法收集了热点,或许可以从中发现什么洞见,或是为这些数据做进一步的处理分析。

发表评论

邮箱地址不会被公开。 必填项已用*标注