苏东坡的“流浪地图”

本文授权转载自公众号:前进日志(mrqianjinsi)

作者:前进四先生

不久前,我在搜韵上看到了一件很好玩的作品:将诗人的一生轨迹展示在地图上,并且标记出在每个途经点创作的诗歌。比如下图就显示了孟浩然的诗歌轨迹。

1

图片截图自http://sou-yun.com/poetlifemap.html

这种将时间和空间结合起来展示诗人作品的方式,其实也是我长久以来就有的想法,只是因为工作量太大就一直没有动手。看到搜韵网已经做出来了,有一种心想事成的感觉,非常开心。 不过还是有一点遗憾,搜韵的这个诗歌地图是基于百度地图的API做的,百度地图只有现代中国的地图数据。而经过数百年的变迁,很多城市和地区和古代的名字已经不一致。这就导致诗歌中提到的地名和现代的城市名不匹配,看起来总有出戏的感觉。 如果能够以古代的地图作为背景,那该有多好。比如我们讲李白的时候,就以唐代的地图为背景;讲苏轼的时候,就以北宋的地图为背景,这样就完美了。 当然,我们在网上能够找到很多古代地图的图片,比如这张来自维基百科的地图:

2

但是,这些地图都是图片,并没有地理信息数据,无法做到根据地点的经纬度在地图上自动做标记。我们需要的是一份数字地图,可以输入地点的经纬度,自动在图上标记。那么问题来了,从哪找到一份古代的数字地图?
熟悉我的朋友都知道,我是苏东坡的脑残粉。那么,接下来就以苏东坡生活的北宋为例,来告诉大家如何解决这个问题。(其实选择苏东坡的另一个原因是:搜韵的诗歌地图上暂时还没有苏东坡,我这也算是补遗啦)

1 老板,请给我一份1080年的中国数字地图

首先要找到数据源,使用哈佛大学的Hartwell数据集作为我们的数据源。链接为:https://www.fas.harvard.edu/~chgis/data/hartwell/

Hartwell是哈佛大学的一位教授,已于1996年逝世。这位教授在临终前将他收集制作的古代中国地理数据赠予了哈佛大学,在此向他致敬。虽然Hartwell教授已经仙逝,但是这个数据集却一直在发展。到现在为止,已经有了唐、宋、元、明详细到各个县的数据。我们要用的是北宋的数据。古代的领土观念没有现在这么强烈,国界也不精确,基本上都是势力范围的概念。所以,即使是北宋一朝,领土的边界也在不停变动。Hartwell数据集提供的是1080年那一年的北宋领土疆界。正好,苏东坡的生卒年是1037~1101,1080年苏东坡43岁,正值壮年。
宋朝的行政区规划和现在很像,也是三级制。区别只是在于名字而已:
现在的省在宋朝称为路;
现在的市在宋朝称为府/州;
现在的县在宋朝还是称为县;

注:准确的说,宋朝的路虽然辖区大,但是没有统一的行政机构,所以权力很小,远没有现在的省那么威风。
我们不需要那么详细的数据,详细到路这一级别就好了。

1.1 下载数据

数据下载完毕,我们关心的地理信息都保存在.shp文件中,用QGIS打开v5_1080_chin_chn_1080_l.shp这个文件,如下图:

3

仔细看,图内各个行政区的划分,和现在的各个省划分还是不一样的。这份数据不能直接使用,必须经过以下预处理。

1.2 坐标转换

Hartwell提供的地图数据是在西安1980坐标系,地图内各个地点的位置不是用经纬度表示。这当然很不方便,我们习惯了经纬度,况且很多历史地点都只能查到经纬度数据。因此我们首先要把地图的坐标转换到WGS-84坐标系下(想起来我在线性代数中提到过的坐标转换了吗?),这难不倒我们,用QGIS将shp文件另存为的时候,选取WGS-84坐标系就好了。

4

这样我们就得到了WGS-84坐标系的地图数据。

1.3 格式转换与压缩

现在WGS-84坐标系下的地图数据还是shp格式,约1.6M大小。我打算继续用echarts来制图,echarts允许的自定义地图数据格式只能是geojson格式,因此要将数据从shp格式转换为geojson。此外,对于一个网页来说,1.6M有点大,我们要将其压缩一下。这两点需求都可以通过http://www.mapshaper.org/来实现。
通过对数据进行格式转换和压缩,我们成功得到了一份大小为440kb的geojson数据。压缩后的地图数据如下图所示:

5

能够看出,基本没有任何精度损失,效果令人满意。

1.4 地图上色

我们知道,北宋一朝,一直都是北宋、辽、西夏、大理、吐蕃等各个国家并存。shp数据中包含了各个行政区域的国家信息,但是在地图上并没有显示出来。所以,接下来我们按照不同国家来对地图上色,最终的效果如下图:

6

实际上,在鼠标悬停在每个行政区之上,会显出该行政区的名称,但是截图体现不出来。请大家在我将数据整理并上传到网站后,自行体会。

1.5 补充城市数据

目前这份数据还只是行政区分界线,空荡荡的。接下来我们将补充城市信息到地图中,当然是古代的城市名称。继续使用我们在《计算机告诉你,唐朝诗人之间的关系到底是什么样的》文中提到过的CBDB数据库,这个数据库在ADDRESSES表中存储了非常多的古代地名,并且有我们想要的经纬度信息。比如我们查询 福州:

7

有很多重名。我们通过城市所属国家“宋朝”,立刻判定出第三个福州才是我们想要的信息,并且得知福州的地理位置为:东经119.32158°,北纬26.07395°,属于福建路。我不打算详尽的在地图中标出宋朝所有的大小城市,我只标出各路的治所,也就是现在的省会概念。此外还标注了辽朝各个行政区的治所。如下图:

8

有了地图,接下来,我们就可以绘制苏东坡一生的行迹了。

2 东坡行迹

2.1 东坡年谱

苏东坡的一生跌宕起伏,大概可以说是二起二落:
第一次起是21岁(1057年)进士及第,到43岁(1079年)时湖州任职。这段时间虽然官职升迁不大,但是逐渐树立了他在北宋文坛的地位,特别是1072年欧阳修逝世之后,苏轼成为了当时众望所归的文坛领袖。
第一次落是1079年因乌台诗案被捕入狱,几乎丧命。苏轼也因此成为宋朝第一位因为文学作品被捕入狱的人。后来因为朝野相救,侥幸不死,被免除官职贬谪黄州。这段时间一直持续到1084年。
第二次起是在宋哲宗即位之后。因为哲宗年幼,高太后临朝,苏轼逐步升迁,最终在1093年官至礼部尚书。
第二次落是在1094年,高太后病逝,哲宗亲政之后,苏轼被指以文字“讥刺先朝”,贬谪海南岛惠州。此后一直到1100年,才遇大赦,渡海北归。在北归途中,1101年,苏轼就因病去世了,终年64岁。
因为我这一篇的重点不在于苏轼,所以这里对苏轼的介绍非常粗略。对苏轼生平感兴趣的朋友,强烈推荐林语堂先生写的《苏东坡传》。根据苏轼一生的经历,我整理了一份简单的年谱,即某年到某地所为何事。部分数据如下图所示:

9

2.2 绘制轨迹

苏轼一生去过很多地方,我们从CBDB中把年谱中涉及到的地名的经纬度查询出来,标记到地图上。并根据时间顺序画出来,最终形成下面的轨迹图:

10

从图中可以看出,轨迹有两个密集核心,一个是开封府,一个是杭州。开封府自不必说,是当时的首都。杭州则是苏轼任职过两次的地方,一次任通判,一次任知州,累积住过五年,并修建了苏堤,留下了“淡妆浓抹总相宜”等名句。

因为信息太多,可能有些看不清楚,我们再把地名隐去,应该就能更清楚的看出苏轼的一生是多么曲折起伏了。

21

这个轨迹图其实是动态的,不过截图体现不出来。我会在两天后把北宋的地图和苏轼的轨迹图都上传到我的网站mrqianjinsi.com,网站上可以体现出图的动态性。

本文授权转载自公众号:前进日志(mrqianjinsi),作者:前进四先生

更多有趣好玩的内容 尽在品玩微信公众号
brand

PingWest品玩移动客户端