画世界上最漂亮的花,Python使用 matplotlib的basemap绘图之一--几行代码画世界地图和中国地图_qq

关注

近来读到几篇Basemap绘图的文章,实践了一下,感觉很有意思,在此分享给各位朋友一起来感受一下它的魅力。

Basemap简介

简介 在数据可视化过程中,我们需要将数据在地图上画出来。 比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。basemap 是Python的一个强大的负责实现地理信息可视化的库,是Matplotlib的一个附加工具包,通过结合 matplotlib 可以绘制出很多漂亮的地图。 basemap包括GSSH海岸线数据集,以及来自GMT的河流、州和国家边界的数据集。这些数据集可用于在地图上以几种不同的分辨率绘制海岸线,河流和政治边界。basemap底层使用了Geometry Engine-Open Source(GEOS)库,用来将海岸线和边界特征剪切到所需的地图投影区域。此外,basemap还提供读取shapefile的功能。 basemap面向地球科学家的需求,特别是海洋学家和气象学家。起初,杰夫·惠特克(Jeff Whitaker)写“底图”(basemap)用来帮助他进行气候和天气预报的研究。到现在,basemap 不断被开发扩展已经具备了很多功能。多年来,basemap的功能随着各个学科(如生物学,地质学和地球物理学)的科学家的要求和贡献的新功能而演变。

1 环境准备 这里我使用Anaconda3的jupyter notebook,里面的python版本为3.7,需要软件的从百度云盘下载,参考50题matplotlib从入门到精通-手把手使用Anaconda实践里的下载网址和使用方法。basemap模块约为120M左右,其依赖库pyproj约为20M左右。 由于basemap还没有pip检索,因此传统的(pip install basemap)安装方法不适用。Windows用户需要到https://www.lfd.uci.edu/~gohlke/pythonlibs/下载对应的wheel文件到本地,然后控制台进入其所在目录,使用pip install xxxx.whl文件安装。其依赖于pyproj库。具体安装过程参考https://zhuanlan.zhihu.com/p/34509847 。Linux用户安装步骤可参考 https://matplotlib.org/basemap/users/installing.html ,包括下载源码、安装GEOS库、设置GEOS_DIR环境变量等步骤,安装完成后可进入到examples文件夹,运行测试例子。 此外还可以通过Anaconda的Python发行版安装。 在这里插入图片描述 在这里插入图片描述 本人在测试过程中,下载花了几个小时没成功,后终于另找到相关资料下载成功。在这里提供百度云盘链接供各位朋友下载。链接: https://pan.baidu.com/s/1EGw7XGDubyxr9VyfKM8H9w 提取码: 91iq 需要注意的是,我提供的为基于我的编程环境的文件,Windows下python3.7的64位电脑。如果配置不同,需要自行下载。 在这里插入图片描述安装,我在Anaconda Prompt运行相关库的安装,以保证Anaconda能正确调用相关库。 安装geos,这个较小直接安装即可 在这里插入图片描述 安装Basemap 在这里插入图片描述pyproj同Basemap一样安装好后,我们就可以测试了。 2.绘制世界地图

1,五行代码绘制一个世界地图:

#画一个世界地图import matplotlib.pyplot as plt ##导入 matplotlib库from mpl_toolkits.basemap import Basemap #导入Basemap库m = Basemap() #使用Basemap()创建一个地图m.drawcoastlines() #把海岸线画上plt.show()#显示这个地图

效果如图: 在这里插入图片描述 图有点小。这里设定一下图的长宽(单位:英寸)

import matplotlib.pyplot as plt ##导入 matplotlib库from mpl_toolkits.basemap import Basemap #导入Basemap库plt.figure(figsize=(16,8)) #它的参数figsize=(16,8)定义了图的大小。m = Basemap() #使用Basemap()创建一个地图m.drawcoastlines() #把海岸线画上m.drawcountries(linewidth=1.5) # 开始画上国家plt.show()#显示这个地图

效果如图: basemap绘制世界地图1 黑白的颜色不好看,这里添加两行 m.drawmapboundary(fill_color = ‘aqua’)# 首先给地球涂上蓝色的一层 m.fillcontinents(color = ‘coral’, lake_color = ‘aqua’) # 再给大陆涂上棕黄色,给江河湖泊涂上大海一样的颜色 在这里插入图片描述 对代码m = Basemap()进行修改为: m = Basemap(projection = ‘ortho’, lat_0 = 30, lon_0 = 100) 说明:参数:projection = ‘ortho’,是画一个球状世界地图,我想让中国显示在地图中心,这里设置东经100(),北纬30度为投影中心,并改变了一下上图中两行设定的地图的颜色,效果如图: 在这里插入图片描述 basemap提供了24种不同的投影模式,有需要了解的请自行百度了解。

利用epsg 设置地图投影

ESPG是一种标准的命名投影方式的数字编码。Basemap允许使用这些标记来创建地图,但只局限于某些特定的情况下。要使用ESPG标记,需要在Basemap()里面加上epsg参数。

Basemap中的/mpl_toolkits/basemap/data/epsg对这种EPSG提供支持,但是有时使用这种方法还是会报错(ValueError: 23031 is not a supported EPSG code),所以不建议使用。

Basemap对带有"utm"的projection支持不太好,但是对带有"tmere"都能很好的支持。

下面的例子是用UTM投影显示祖国宝岛台湾省。

from mpl_toolkits.basemap import Basemapimport matplotlib.pyplot as pltplt.figure(figsize=(16,8))map = Basemap(llcrnrlon = 119.3, llcrnrlat = 20.7, urcrnrlon = 124.6, urcrnrlat = 26,resolution = 'h', epsg = 3415)map.drawmapboundary(fill_color = 'aqua')map.fillcontinents(color = 'coral', lake_color = 'aqua')map.drawcoastlines()plt.show()

效果如图: 在这里插入图片描述

3.画中国地图

中国经度范围:73°33′E至135°05′E;纬度范围:3°51′N至53°33′N。当中的字母E , 表示东经;字母N,表示北纬。东经正数,西经为负数;北纬为正数,南纬为负数。 画中国地图,只需要在创建Basemap时指定一下经纬度就行了:m= Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=53) 效果如图: 在这里插入图片描述 感觉有点变形,这是因为我们没有添加任何投影的原因。常用的是兰勃特投影,我们添加修改一下,并设置一下颜色: m= Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection=‘lcc’, lat_1=33, lat_2=45, lon_0=100) m.drawmapboundary(fill_color = ‘blue’) m.fillcontinents(color = ‘yellow’, lake_color = ‘aqua’) 效果如图: 在这里插入图片描述 是不是有点喜欢上了你自己绘制出来的中国地图,我们来导出jpg图片保存一下。 修改代码: plt.figure(figsize=(16,8)) 为赋值给fig变量: fig=plt.figure(figsize=(16, 8)) 然后在代码最后添加 fig.savefig(’…/test/china.jpg’,dpi=600) 说明:这里是保存地图到根目录下的test文件夹,如我在D:/pythontest中运行jupyter notebook,则地图会保存到D:/pythontest/test文件夹中,请确保先建有该文件夹。

本文主要参考了文章《我用Python之basemap画图27问》 文章:《Basemap手册——第一章 入门》 笔者将继续实践和分享,有兴趣的朋友可以关注留言交流。