第10天 世界那么大,我想去看看
【教孩子学 Python 编程】系列 Day10:了解如何使用 Python 生成地图

今天已经是本期春节特训营的最后一天了,我们讲一些轻松的话题 —— 世界那么大,我们一起去看看吧。
但是在看世界之前,我们得先熟悉一下世界地图,对我们生活的世界有一个整体认识。刚好,我们可以用 Python 来绘制地图!
我们的地球
现在我们都知道地球是一个两极稍扁,赤道略鼓的不规则球体。确切地说,地球是个三轴椭球体,大多数时候,我们可以认为地球是一个十分接近正圆球体的星球。但是,得到这一正确认识却经历了相当漫长的过程。。。
地球是圆的
据说,早在公元前500年前后,古希腊的毕达哥拉斯(Pythagoras,约公元前580-500年)就提出了大地是球形的观点。
古希腊哲学家亚里士多德(Aristotle,公元前384-322年)根据月食时月球上地影是一个圆,科学地论证了地球是个球体。亚里士多德真厉害,每天要花那么多时间写作,还要长时间观察月亮,夜间南北往返,出海远行。

除了认为地球是圆的,古代的先知们还精确测出了地球圆周长!
古埃及希腊裔人埃拉托斯特尼(Eratosthenes,公元前276-194年),生长于古埃及托勒密王朝时期,该王朝是亚历山大大帝的部将托勒密所建的。40岁时,埃拉托斯特尼被托勒密三世任命为亚历山大图书馆的馆长。

在任图书馆馆长期间,一天无意间发现了一本纸草的古文书,里面有这么一段话:
靠近尼罗河第一个瀑布的赛印(Syene,今埃及的亚斯文),每年6月21日中午,垂直竖立的柱子没有影子。
这一小段不起眼的叙述,引起他极大兴趣!

他做了一个实验:6月21日,在亚历山大城竖立柱子,观察会不会有影子。结果发现柱子有影子。
亚历山大城在赛印的北边,两地距离颇远,一地柱子有影子,另一地却无。他因此推测,如果地球是完全平的,不会产生这种现象,地球应该是圆的。

6月21日中午,从赛印的井边往下看,可看到太阳完全映在水井底部,此时太阳是位于正上方;同时,在亚历山大城,见到的太阳则有倾斜角。
埃拉托斯特尼大胆假设地球是圆的,仅使用粗陋的测量工具,以及简单的几何学知识,推算出与实际误差很小的地球圆周长。他由柱子的影子计算出太阳的倾斜角约为7度,也就是说,亚历山大城与赛印的距离,是地球圆周的 7/360。从往来两个城市的商队得知,两地的距离约500斯塔德(stadia,希腊尺寸单位),因此推断出地球圆周长在39690~46629千米之间,与实际地球圆周40008千米非常接近。要知道,那是两千多年前啊。

现在我们知道,埃拉托斯特尼做实验的时间其实就是夏至。每年6月21日前后的正午,太阳会直射北回归线,而赛印就位于北回归线附近。因此夏至中午,那里垂直竖立的柱子就不会有影子。

从地心说到日心说
虽然大家同意地球是圆的,但由于人们每天看到太阳、月亮从东边升起,在西边落下。于是就认为地球是宇宙的中心,日月星辰都是围绕地球运行的天体。

后来,罗马帝国时期的天文学家克罗狄斯·托勒密(Claudius Ptolemy,90-168年),进一步改进和完善了地心说,使之与天文观测符合得更好,并完成了天文学著作《至大论》,于是地心说成为了当时宇宙观的主流。

到了中世纪的欧洲,托勒密的地心说被教会所利用。教会明确提出:上帝生活在原动天,是上帝的推动才使得诸天围绕地球旋转,位于宇宙中心的地球,沐浴在上帝的恩泽之中,在上帝的意志下,所有的星星都向着地球上的人类闪闪发光。
由于地心说受到教会的支持和保护,随着传教活动而传遍欧洲,人们的头脑中逐渐根深蒂固 。在此后一千多年里,几乎没有人再对地心说表示怀疑。

直到16-17世纪,才有人开始质疑。首先出场的是波兰人哥白尼(Copernicus,1473-1543年),他提出了日心说,认为太阳才是宇宙的中心,地球才是绕着太阳转的。由于当时教皇比较开明,哥白尼论证日心说,并未遭到教皇的反对,但却害怕受到教会的反对和压迫,以至于他的著作《天体运行论》直到1541年才发表。

随后而来的是一代大师伽利略(Galileo,1564-1642年),这位老哥拿着自制的天文望远镜,朝着月球上一看,哇不得了,发现月球上全是坑。接着一发不可收拾,又观测到很多天文现象。经过严密的推算,伽利略宣告说:日心说是对的!

要知道当时还处于教会的统治下,为了巩固教会的威望、统一思想,任何发表支持日心说的言论都变得很危险。晚年的伽利略为了活命,被迫写了份声明,声称自己是不承认日心说的。勇敢的科学家布鲁诺(Bruno,1548-1600年)因为坚持日心说,被教会活活烧死了。

结束这一切争执的人,就是伟大的牛顿(1643-1727年)。一个万有引力定律就把教会的地心说给埋葬了。

把世界连成一片
欧洲文艺复兴以来,航海家也没闲着。1492年,哥伦布(1451-1506年)在西班牙王室的资助下,率领船队横渡茫茫无际的大西洋,同年10月12日,哥伦布的船队抵达加勒比海上的一个小岛,从此发现了一个新世界——美洲大陆。正是哥伦布发现美洲的壮举拉开了全球化时代的序幕。

1519-1522年,葡萄牙航海探险家麦哲伦(1480-1521年)率领船队横渡大西洋,进入太平洋、印度洋、好望角,最后回到欧洲,完成了环球航行。麦哲伦环球航行不仅成功开辟了新航线,还通过他的探险航行证明了地球是一个圆球。可惜在途径菲律宾群岛时,麦哲伦在与菲律宾土人冲突中被杀,无法见证伟大的时刻。

新航路的开辟,使得从欧洲到亚洲、美洲和非洲等地的交通往来日益密切,世界开始连成一个整体。欧洲大西洋沿岸工商业经济繁荣起来,促进了资本主义的产生和发展。

太空探索
随着技术的进步,人们开始进行太空探索,陆续从高空、从人造卫星、从月球的角度拍下了地球的照片。其中最著名的是下面这张 “蓝色弹珠”(英文:The Blue Marble)。

该照片是在1972年12月7日由阿波罗17号太空船船员所拍摄的。当时太空船正运行至距离地球45,000公里(28,000英里)之处。这张照片是迄今为止最广泛流传的照片**。它是少数能把整个地球清晰地拍下来的照片,正因拍摄当时太空船正背向太阳。**此时,对于身在太空船上的太空人来说,地球的大小就像小孩子的玩耍的弹珠一样,因而命名 “蓝色弹珠”。
是不是感觉似曾相识?没错,微信 App 启动界面上的那个地 球就来自于蓝色弹珠。
用 Python 画地球
接下来,我们使用 Basemap 包来绘制一些地图。我这里使用 Anaconda 安装,并在 Jupyter Notebook 中运行。打开终端,进入 Anaconda 环境,执行以下命令即可安装 Basemap:
conda install basemap
安装好之后就可以马上画一张地图啦~
切换到工作目录,在终端执行 jupyter notebook
,将会在浏览器中打开一个页面,点击新建 Python 3 将会打开一个新的页面,如下所示。今天的代码,我们将在这里输入并运行。

输入下面这几行代码:
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
map = Basemap()
map.drawcoastlines()
plt.show()
见证奇迹的时候到了!按 Shift + Enter 运行,你将会看到一张世界地图:

代码中的前两行是导入相应的 Python 库,后三行代码绘制一张最简单的世界地图。
Basemap 默认的投影方式是 cyl(圆柱等距离投影),我们可以通过传入参数来改变投影方式,比如使用 ortho 正射投影:
map = Basemap(projection='ortho', lat_0=0, lon_0=105)
map.drawcoastlines()
plt.show()
另外两个参数 lat_0
和 lon_0
分别表示中心点的经度和纬度,我们知道中国位于东八区,一个时区占经度15°,所以 lon_0=105
的目的是为了让亚洲大陆面向我们。

即使有新 的投影,但地图看上去实在太单调了,我们用一些颜色填充海洋和陆地吧!
map = Basemap(projection='ortho', lat_0=0, lon_0=105)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral', lake_color='aqua')
map.drawcoastlines()
plt.show()