查看原文
其他

独家课程 | 历史GIS(二)

王涛 零壹Lab 2022-10-08


历史GIS(二)




作者简介

 王涛,历史学博士,现为南京大学历史学院教授、数字史学研究中心主任。主要研究领域涉及教会史、德国史、数字史学等方向。



王涛老师往期课程回顾:

独家课程丨历史研究的新素材

独家课程丨社会网络分析

独家课程丨文本挖掘(一)

独家课程 | 文本挖掘(二)

独家课程丨历史GIS(一)

1.融合历史研究的HGIS运用


通过上面的教程,我们实现了一次华丽的转变:作为人文学者,我们再也不是用传统的眼光来看待文献了,而开始用数据(或者“数据库”)的思维审视历史文本。这个小小的变化,会让传统的史料迸发出更多可能性。那么问题来了,历史学家拿着这些空间数据,可以做什么呢?


这是一个大问题,并且跟每个研究者自己的问题意识紧密相联,无法给出统一的答案。但是,这个大问题可以分解成许多小步骤,研究者在GIS的软件平台对空间数据进行配准、关联、查询等相关操作时,会有一些隐匿的问题浮现出来。这将是HGIS的工作流带给研究者最刺激的内容。换句话说,HGIS是一种探索性的研究,研究者有时并不知道从盒子里能拿到什么味道的巧克力。当然,我们也有可能抓出一张巧克力的包装纸,一无是处;但这并没关系,扔掉废纸重新开始:因为在HGIS的系统里,换一种方法,导入新的数据,再尝试一种新思路的成本并不高。


下面,我们将进入实操的环节,向大家演示配准、基于栅格地图制作矢量地图、可视化呈现等具体任务的实现步骤。


为了打消大家以为GIS很困难的错误印象,我们先从最基本的一些操作开始,目的是要树立一种信念:QGIS原来如此简单。


我们首先要对QGIS做基本设置。

首先,语言环境。QGIS是由国外团队开发的,所以其默认语言是英语,不过该软件支持多国语言,包括中文。如果你觉得英文的语言环境看着别扭,可以把系统语言变更为中文。操作如下:


菜单栏上选[Settings],点击[Options],在弹出的对话框左边标签栏选择[General],右边的各种选项中,勾选排在第一个的[override system locale],这是之前灰色的[User Interface Translation]会出现下拉式菜单,找到[简体中文]。点击[OK]确认后,退出QGIS重新打开,系统的工作语言就变成中文了。但是,我并不建议大家改变语言环境,因为后续的学习以及网上各种资料以英文为主,熟悉英文界面对我们很有必要。


其次,我们要对数据源做一些改动,避免将来处理多语种数据时出现乱码的问题,比如德语中的变元音ö-ä-ü等无法正确显示的情况。路径同样是[Settings]→[Options],这次选择标签[Data Sources],在右边的窗口中,有一个[Ignore shapefile encoding declaration],取消前面的复选框,点击[OK]确认退出。


2.矢量图层的基本处理


设置好后,我们重新打开QGIS,屏幕中心的界面空空如也,因为我们没有载入任何图层。现在我们就开始载入一个矢量地图,在实战中理解矢量数据的点、线、面三种类型叠加的状态。样本数据可以在后文提供的百度网盘下载。


动作的路径为[Layer]→[Add Layer] →[Add Vector Layer..],找到存放样本数据的位置,我们先加入一个柏林的区域图,选择“Berlin_Admin”文件夹中后缀为.shp的文件,然后点击[Add]就可以了。

(图1:导入矢量数据)

如果顺利的话,我们应该能够看到原来空白的屏幕中央,出现了一张地图。我们把鼠标放在地图上,滑动滚轴,就可以放大缩小地图。地图的清晰度不会因为放大而模糊,这就是矢量地图的优势。


我们用相同的操作,将柏林的有轨交通线和公共交通站点加入地图。最终大家会看到一张类似下图的图片:

(图2:柏林行政区的图层)

软件界面的左下角有一个[Layers]的面板,我们能够看到已经载入了3个图层,分别对应着点线面三种数据模型。通过“选择/取消”每个图层前面的复选框,可以控制图层的显示或者隐藏。为了研究的方便,我们还可以给每个图层取一个更容易区分的名字,甚至可以是中文名,比如把点图层默认的“gis_osm_transport_free_1”这一长串名字更名为“公交站点”。


把鼠标移到[Layers]面板,右键单击点图层“gis_osm_transport_free_1”,在弹出的对话框中,选择[Rename Layer],然后键入“公交站点”。

(图3:修改图层名称)

 

大家在自己的电脑进行“添加矢量图层”的动作后,看到的画面可能跟教程中不一样。特别是柏林行政图的颜色可能并不是紫红色,这个颜色是系统随机分配的,我们会觉得影响对地图的观察,可以重新给地图上色。


同样是先将鼠标移动到[Layers]面板的“行政区域”图层,点击右键调出对话框,但这次我们选择最后一个[Properties...]。弹出的对话框中,选择左边标签页的[Symbology],这里有很多参数可以调整。我们目前都用不上,我们只想达到一个至简的效果,让行政区域的背景变成白色。选择[Simple fill],然后在下面的[Fill style]的下拉式菜单中选择[No Brush],点击[OK],完成设置。当我们退回到屏幕时,就发现整个地图干净了。

(图4:调整图层背景色)

实际上,通过这几步操作,你应该不会对QGIS感到畏惧了吧。它的操作界面非常友好。我们再进行几种动作,大家更能体会到QGIS的便捷。


在讲到GIS的基本原理时,我们提到空间数据与属性数据的关联。在QGIS中,如何查看属性数据呢?依然需要使用鼠标右键调出。由于每一个矢量图层都有自己的属性数据,所以我们同样要在[Layers]面板中选择相应的图层。比如,我们想看看“公交站点”的属性,选择[Open Attribute Table]。

(图5:调出矢量图层的属性数据)


弹出来一个像Excel表格的窗口,这个就是跟“公交站点”图层关联的属性数据。我们看到不少描述性的数据,包括站点ID、站点类型、站点名等,还可以看到站点的总数等信息。我们可以用一些操作把相关属性反映在地图上。

(图6:属性数据) 

大家从图2看到,七千多公交站点密密麻麻散落在地图上,是不是很难区分?我们从属性数据可以看出,站点存在不同的类别,有火车站、汽车站、码头、有轨电车站等。能否将这些站点根据交通工具类型分别显示呢?


再次进入公交站点图层的[Properties...]→[Symbology]。我们要关注最上面有一个下拉式菜单,可以调出[Categorized]。

(图7:对点图层数据进行分类)


然后会有一个新的对话框出来。在[Column]选择[fclass](属性数据中的一列),然后点击窗口左下侧的[Classify],我们就会看到系统自动根据不同的交通工具进行了分类,一共有六种,对应六种颜色。

(图8:点数据的分类)


(图9:点数据的分类)

回到地图上,我们看到了不同的呈现状态。QGIS在“公交站点”的图层下自动依据分类生成了新的图层,每个图层前也有复选框控制是否显示,我们现在只想看铁路站点,把汽车站点隐藏,整个世界清静了。


(图10:显示火车站站点)


这时,我们又想着,火车站点应该有名字的吧,可以让站名也显示在地图上吗?只需要再次调出[Properties...],这次选择左边标签页的[Labels],在下拉式菜单中选择[Single labels],至于[Label with]则选择属性数据列表中的[name],大功告成。当然,为了美观,字体的大小、颜色、位置等都可以调整。我们在这里就不演示了,大家自己去探索一番吧。

(图11:设置站点标签)


对矢量图层的基本操作大概就是上述内容,它们虽然基础,但对我们理解HGIS的原理以及QGIS的工作思路都很有帮助,而且这些步骤在今后的研究中也会被经常使用。


3.文献史料的空间化


们前面已经多次提到,将历史文献中描述性的“空间信息”(比如道路里程数、进出口贸易、人口信息等),经过“地理编码”转换为“空间数据”,是HGIS的关键环节。这意味着,历史学家在阅读史料的过程中,在用空间思维对待传统素材。为了让空间数据能够在QGIS中被展示、被分析,我们需要一些技能提升效率。


对于现代地名的“地理编码”,已经有非常好用的工具来自动完成;然而在HGIS的语境下,地理编码最大的挑战是地名随着时间的推移发生了改变。比如最典型的例子,柯尼斯堡(Königberg)这个地名在任何一张现代地图中都找不到,用OpenStreetMap来进行编码,显然是不可能完成的任务。所以,对历史地名进行地理编码,手动工作不可避免。


但我们有一个讨巧的办法。


假如我们在阅读史料的时候,发现了下面这则材料,德意志帝国政府的统计年鉴,显示了1875和1890两年德国若干大城市的人口数量(来源:Quelle: Statistisches Jahrbuch für das Deutsche Reich; 1881, S. 3ff (1875); 1893, S. 9ff (1890);)。传统的处理方式无非是把它制作成表格:

(图12:历史数据)

但HGIS的空间思维让我们敏锐地意识到,这里涉及到德意志地名,完全可以对它们进行地理编码,然后在地图中显示出来。如果我们手头刚好有1890年德意志帝国的行政区划矢量地图的话(后文提供的百度网盘下载),就可以在QGIS中通过“关联CSV表格”来实现。


原理很简单。我们都知道矢量地图都有配套的属性数据,打开一张1890年帝国行政区划图就能看到。属性表格有许多项目,但巧合的是,也有一些城市的名字,虽然不一定能够跟我们的人口统计城市名称一一对应,但可以把相同的城市关联起来。这个任务只需要简单几步操作,就能够实现文献史料的空间化处理。

(图13:1890年帝国行政区的属性数据)


不过,第一步需要我们把人口统计表格转化为CSV格式。这个很容易,我们在Excel里用另存为就能完成(后文提供的百度网盘下载CSV文件)。我们把这个CSV文件当作一个图层叠加到1890年行政区图上。路径为[Layer]→[Add Layer]→[Add Delimited Text Layer..]

(图14:添加CSV文件)


在弹出的窗口中,导入我们转换好的CSV文件,其他参数都不用管,唯一需要注意的是在[Geometry Definition]中选择[No geometry]。

(图15:导入CSV文件)


点击下面的[Add]按钮,文件就顺利导入,我们在QGIS的[Layers]面板也可以看到多出了一个图层,名字正是CSV文件的名称。


现在是最关键的一步。鼠标移到[1890Admin]图层,点击右键,选择[Properties...],这次我们选择左边标签页的[Joins],然后点击右下角的[+],新建一个链接。我们要做的,就是把wachstum.csv文件中城市名,和[1890Admin]图层属性数据中的城市名对应,所以[Join field]选择[Stadt];[Target field]选择[HAUPTSTADT]。其他参数都默认,点击两次[OK]后,链接完成。

(图16:关联数据)


但似乎没有任何变化?没关系,我们再次看看[1890Admin]图层的属性列表,是不是发现多出几列,刚好是wachstum.csv文件中的人口数量和增长率。

(图17:关联后的属性数据)


最小代价的地理编码就完成了。我们可以通过调整图层的参数,将不同城市所隶属的行政区域的人口数量在地图上显示出来。整个步骤跟上面讲到的“矢量图层的基本处理”完全一致。大家可以自我练习,实现不同的效果。

(图18:关联之后)


红色越深,相关城市所在行政区的人口数量越多,柏林虽然是面积最小的,但毫无疑问是人口最多的行政区域。


用这种方式完成的“地理编码”,可以将文本描述的空间数据在地图上呈现,帮助我们直观地发现相关信息。但缺点也非常明显,如果你恰好没有矢量地图怎么办?而且矢量地图属性列表中没有相应的地名怎么办?实际上,在我们的案例中,也确实有一些城市没有出现在属性列表中,所以最终呈现在地图上的数据也是不完整的。


要解决这个问题,我们只能另觅他途。一个解决的方案是,使用地名数据库。这样的数据库中包含了地名的经纬度,我们在使用的时候,可以通过Excel的VLOOKUP函数,批量对相应的地名填入地理坐标信息,然后就完成了地理编码。网络上虽然有现成的地理数据库免费下载使用,但在我们个人的研究语境下,一定会碰上例外的情况,因此搭建一个专属的历史地名数据库,是终极的解决方案。但这需要我们在日常研究的积累中不断充实和完善。这个过程将耗精力且漫长。


不过,也不是没有捷径。有研究团队开发了许多文本标注的工具,能够自动给文本中的人名、地名、官职等进行识别。可以想见,这样的工具一定存在误差,但终归能够解放一部分人力。我们在前文的“附加技能”介绍一种从文本提取地名的使用方法。


4.地图配准


跟地理编码稍微有些不同,地图配准(Georeferencing)主要是解决“模拟数据”形态的空间信息与坐标系统叠加的问题。最常见的任务场景是,把扫描的历史地图、航拍照片等赋予坐标系,然后不同的图层能够正确匹配,在此基础上进行对比、分析等空间操作。


如果是扫描地图的话,存在两种情况,一种是自带地理坐标系的地图(这样的地图往往是19世纪后期绘制的,已经有了现代意义上的测绘技术),另一种是不带坐标系的。前一种情况的配准工作要容易一些。


不论是哪种情形,在QGIS里进行配准之前,都要确保安装了插件[Georeferencer GDAL]。QGIS3.4.7应该默认安装好了,如果没有的话,大家自行百度解决安装问题。另外,还要保证这个插件处于激活的状态。


当然,在进入地图配准的教程之前,我们首先要解释一个问题。既然要“配准”,那应该以什么为参照进行匹配呢?换句话说,我们首先要找一张带坐标系的“底图”(basemap)。带坐标系是关键点,地图的形态就比较随意了。一般GIS的教程都会以一些网络地图服务公司(Web Map Service,WMS)提供的地图为基准,但有时,我们通过各种渠道拿到的矢量地图,也可以作为配准的底图。这个跟我们的使用目的密切相关。


矢量地图的下载,我们之前已经提及。现在我们来谈谈使用WMS服务。


其实,我们完全可以把WMS服务提供的地图当作图层来理解,所以调用它的方法也是添加一个图层[Layers]→[Add Layer],不过最后选择[Add WMS/WMTS Layer...]

(图19:添加WMS服务)


在弹出的窗口中,选择标签[New],新建一个WMS服务链接。最关键的是要知道提供服务的URL地址,我们可以在这里使用台湾中央研究院提供的WMTS代理服务器。

(图20:设置服务器)


确认之后,我们会在QGIS左边的浏览器面板[Browser]发现多出了刚才加入的WMS服务器名称。双击一个地图的名称,就可以把地图载入系统,比如OpenStreetMap。

(图21:添加OpenStreetMap为底图)


使用WMS的服务,好处是地图种类比较全,不需要我们自己再花时间找。不过,你可能会问,我怎么知道WMS服务器的地址呢?标准答案是在网上搜索。但网络世界那么大,我觉得会迷路。所以,我在这里推荐大家安装一个插件QuickMapServices,它集成了许多提供WMS服务的网站,我们只需要在菜单中选择一下,就能够迅速导入一张底图。


查看和安装这个插件,请点击QGIS主界面的[Plugins],然后选择[Manage and Install Plugins...]

(图22:添加插件)


等连上服务器后,会有一个插件管理的窗口弹出。我们在这里可以看到本系统安装过的插件,以及所有可供选择安装的插件。


在左边标签页是[All]的时候,在[search...]对话框中键入quick,下面会出现许多备选插件,找到QuickMapServices,完成安装。这时,我们会在菜单栏[Web]下找到多出一个选项[QuickMapServices],表明我们安装成功了,打开菜单,我们就能够发现多种网络地图提供者,比如OSM。

(图23:插件安装成功)


但使用WMS的服务也有一个明显的弊端,因为它提供的是在线地图,所以从服务器下载各种数据会受网路状况的影响。我们应对的一个策略是,将网路服务商提供的地图下载到我们本地的硬盘。这里,我们需要另外一个插件:OSMDownloader。


安装好后,QGIS的主界面应该会出现一个小图标,表示可以开始使用了。

要下载地图非常简单。我们添加一个OSM的地图,然后缩放到我们想要的地方,点击工具栏上的OSMDownloader插件的图标,鼠标移到地图上面时候自动变成一个大的“+”,选取我们想下载的区域,就能够把地图下载到硬盘。OSM地图有大量属性,所以地图的文件比较大,下载需要较长时间。


好不容易下载好地图,新问题又来了。通过插件下载的数据,后缀名是.osm。这是OpenStreetMap专属的文件格式,无法直接套用到QGIS。这时我们需要安装一个叫QuickOSM的插件,能够帮助我们对osm格式的文件进行解析。这个过程也比较耗时。

(图24:下载底图)


为了准备一份底图,我们学习了许多额外的技能。实际上,也不需要如此复杂。我们可以在网络上下载各种矢量地图,也能作为底图使用。这样的地图大量存在。


好了,有了底图后,我们就可以进入配准的环节。前面提到,扫描的地图有两种情况,一种是自带坐标系的,一种没有坐标系,难易程度不同,我们分别做介绍。


首先是有坐标系的地图,比如这张绘制于1856年的普鲁士和德意志西部的地图。(经由后文提供的百度网盘下载)

通过路径为:[Raster]→[Georeferencer...],进入配准的窗体。在[File] →[Open Raster...]打开一个扫描地图开始工作。

(图25:打开栅格地图)


系统会提示选择一个“投影系统”。可惜,这是一张老地图,我们并不知道投影系统。不过,没有关系,我们选择[Cancel]。然后,就直接进入了配准的工作界面。

(图26:配准界面)


用通俗的话说,配准就是要给扫描地图上的点赋上地理坐标值。我们已经知道,扫描的地图是栅格数据的一种,本质上是像素阵列组合而成,给每个点赋值,该是多么艰巨的任务?别担心,QGIS的智能化程度很高,我们只需要找出3-6个控制点(Ground Control Points)的坐标,剩下的工作就可以由电脑自动完成。窗体工具栏上的加号和减号可以对地图进行缩放,手型工具可以对地图进行拖动,灵活调整地图的呈现格局。

(图27:观察地图坐标系)


因为原始地图有坐标系,控制点的选择就简单很多。具体到这张普鲁士的地图,我们从精度的角度考虑,选择一个矩形的四个点,应该就足够了。


先选择工具栏上的[Add Point]

(图28:添加控制点)


这时我们会发现,当鼠标在地图上移动时,它会变成了一个“+”字,这是为了我们更好在地图上进行定位。


在选好的地方点击一下鼠标,会弹出一个窗口,需要我们输入坐标值。记住:X/East是经度(longitude),Y/North是纬度(latitude),输入相应的数组就好。

(图29:输入坐标值)


点击[OK]后,我们会发现地图上多出了一个红点,这就是我们设置的控制点;同时,下面的控制点列表,也多出了相应的一行。

(图30:控制点赋值)


我们重复5次同样的动作,控制点一般找6个就可以了。最终的结果如图所示。

(图31:完成控制点赋值)


控制点的赋值工作就完成了,但在配准之前,我们需要调一些参数。选择工具栏上的齿轮图案,进入对话框:

(图32:调整参数)


大部分参数都选择默认。关于投影系统(Target SRS),系统会自动分配一个,但很有可能不准确。这个参数在没有任何线索的情况下,需要去推测与尝试。如果你对历史地图的绘制史有研究,你或许能够根据地图出版年代、作者、出版社等信息推算出来;我们也可以多次尝试不同的投影,通过最终配准扭曲的程度来筛选出一个最合适的投影系统。


等一切工作都准备好,我们就可以点击开始配准的按钮,系统就自动完成后续的工作。

(图33:开始配准)


因为我们刚才在设置当中选择了[Load in QGIS when done],配准完成的地图会自动作为一张栅格图层添加进来。如何来验证配准的成效呢?我们可以找一张矢量地图(1890年德意志帝国行政区图,后文提供的百度网盘下载)来叠加一下,看上去效果不错。

(图34:叠加一个矢量图层)


行文至此,自带坐标系的地图配准就结束了。


至于没有坐标系的地图,其配准的大部分步骤与自带坐标系的地图配准非常类似,唯一需要注意的是控制点的选择。我们可以通过一些没有发生变化的建筑物、标志性地点作为参照进行配准,控制点要均匀地分布在地图上。在这种情况下,我们需要使用[From map canvas]在底图上选择控制点来完成配准。


我们来看一张没有坐标系的1851年柏林地图如何进行配准。仔细观察这张地图,虽然没有坐标系,但非常写实,街道、Spree河和建筑物还可以在今天找到,所以我们可以根据这些不变的事物来完成配准。底图我们就使用OpenStreetMap,将柏林区域放置到屏幕中央。


其他的步骤都差不多,变化出现在开始添加控制点的时候。毫无疑问,菩提树下街比较好定位,我们在与弗里德里希大街的路口放置一个控制点。在弹出对话框后,我们并不知道该点的坐标,所以我们选择[From map canvas]。

(图35:在地图上找控制点)


此时,系统会自动回到OSM地图的界面,我们在认为的同一个地方点击一下,采集该地点的坐标,然后,系统会自动返回配准的窗口。我们会发现,坐标值已经自动被填入了。

(图36:自动填充坐标值)


同样的动作我们再做5次,控制点的设置就完成了。注意在调整[Transformation Settings]的时候,需要将CRS与底图的投影系统保持一致。如果一切顺利的话,配准完成后,地图会作为栅格图层自动添加到OSM图层上。

(图37:完成配准)


我们可以调整新加入图层的透明度,来验证与底图匹配的程度。这种不带坐标系的地图配准,是非常精细的活。经验不足、对历史地图不了解、对时空变迁不熟悉的话,控制点很难找得准确,都会影响最后配准的效果。所以,可能第一次的配准并不成功,这没有关系,多尝试几次,效果会越来越好。当然,一些没有坐标系的地图,其绘制可能并非基于测绘数据,它的空间信息存在失真的情况,不论我们如何细心与努力,也很难与现代地图完全重合。


5.地图输出


我们想把一张做好的地图输出,方便打印或者印刷,该如何操作?我们需要使用[Print Layout],其路径为:[Project]→[New Print Layout...]

(图38:输出地图)


这时会弹出一个窗口,需要输入新建布局的名称:

(图39:命名)


点击[OK]之后,就会有一个全新的窗口出现。

(图40:地图输出工作界面)


我们在这里进行地图布局的操作。


当然首先要把地图加进来,[Add Item]→[Add Map],我们只需要在中间的白布上按着鼠标左键拖动,底图中的内容就会自动添加到工作平台。

(图41:调整各种参数)


现在,我们可以对地图各种元素,例如投影等进行设置。这些参数都在工作台右边的窗口,在[Item Properties]设置,设置完成后,需要点击[Update Preview],才能看到更新数据后的效果。


我们可以不断往地图上添加新的图层。比如标签,比例尺、图标、说明等信息。路径都从[Add Item]开始,我们就不需要一一演示了。





参考书目:

Jim Clifford, Josh MacFadyen, and Daniel Macfarlane, "Georeferencing in QGIS 2.0," The Programming Historian 2 (2013), https://programminghistorian.org/en/lessons/georeferencing-qgis.


研究案例:

Katrina Navickas, From Chartist Newspaper to Digital Map of Grassroots Meeting, 1841-44, Journal of Victorian Culture, Vol. 22, No.2, 2017, pp. 232-247.


相关软件与数据百度网盘下载链接:

https://pan.baidu.com/s/17SaI3MLpls5hWFYuWKxrvw 提取码: ypg8




END


主编 / 徐力恒

责编 / 任苗青

美编 / 任苗青




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存