近来读到几篇Basemap绘图的文章,实践了一下,感觉很有意思,在此分享给各位朋友一起来感受一下它的魅力。
简介
在数据可视化过程中,我们需要将数据在地图上画出来。 比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。basemap 是Python的一个强大的负责实现地理信息可视化的库,是Matplotlib的一个附加工具包,通过结合 matplotlib 可以绘制出很多漂亮的地图。
basemap包括GSSH海岸线数据集,以及来自GMT的河流、州和国家边界的数据集。这些数据集可用于在地图上以几种不同的分辨率绘制海岸线,河流和政治边界。basemap底层使用了Geometry Engine-Open Source(GEOS)库,用来将海岸线和边界特征剪切到所需的地图投影区域。此外,basemap还提供读取shapefile的功能。
basemap面向地球科学家的需求,特别是海洋学家和气象学家。起初,杰夫·惠特克(Jeff Whitaker)写“底图”(basemap)用来帮助他进行气候和天气预报的研究。到现在,basemap 不断被开发扩展已经具备了很多功能。多年来,basemap的功能随着各个学科(如生物学,地质学和地球物理学)的科学家的要求和贡献的新功能而演变。
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() #显示这个地图
效果如图:
黑白的颜色不好看,这里添加两行
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种不同的投影模式,有需要了解的请自行百度了解。
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()
中国经度范围: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手册——第一章 入门》
笔者将继续实践和分享,有兴趣的朋友可以关注留言交流。