Python使用 matplotlib的basemap绘图之一–几行代码画世界地图和中国地图

  • Post author:
  • Post category:python


近来读到几篇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 Basemap
import matplotlib.pyplot as plt
plt.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手册——第一章 入门



笔者将继续实践和分享,有兴趣的朋友可以关注留言交流。



版权声明:本文为qq_26665293原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。