python采用Basemap绘制完美中国地图

摘要

本文主要想在目前网络文献中为大家抽去除一些比较个人的经验的问题。其中包括,

  1. 如何安装Basemap组件;
  2. 如何采用Basemap定位出较为美观的中国区域平面效果
  3. 如何采用shapefile文件绘制完全的中国官方地图 — 目前Basemap默认绘制的中国行政区域地图缺少了,藏南地区、我们的宝岛台湾,九段线。

本人主要抱着抛砖引玉的心态,为网友准备的一个入门级表的实操,还请各位大佬见谅。

Basemap的安装

在这里为大家准备是的才windows平台上如何安装Basemap,对于Linux操作系统本人并未做尝试,但是应该都差不多,首先要讲一点就是Basemap在Anaconda 和pip的仓库中都没有,所以需要自己去下载对应的whl文件:

下载Basemap安装文件

  1. Basemap安装文件的下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
  2. 我们需要下载两个文件 PyprojBasemap — 建议直接采用浏览器的文字搜索在网页上搜索关键字找,网页的锚好像没用了
    Pyproj下载
    basemap下载
  3. 下载时注意对应本机的Python版本就好了, 比如我电脑上是3.7的python我就使用的cp37-cp37m-win_amd64.whl

安装 Pyproj& Basemap

安装可以采用pipanaconda命令进行安装

pip install pyproj‑1.9.6‑cp37‑cp37m‑win_amd64.whl
pip install basemap‑1.2.0‑cp37‑cp37m‑win_amd64.whl
conda install pyproj‑1.9.6‑cp37‑cp37m‑win_amd64.whl
conda install basemap‑1.2.0‑cp37‑cp37m‑win_amd64.whl

两者令名差不多,其实看自己本机环境安装就好了,这里我没碰到什么坑,基本安装都很正常,为了保险,我先安装了pyproj 之后再安装的 basemap

Basemap的Helloword

这里个人水平有限不太懂地图的投影之类的知识,还有basemap提供的项目内容,我就直接粘贴代码:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
# plt.figure(figsize=(16, 8))
m= Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
# m= Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=53)
m.drawcountries(linewidth=1.5)
m.drawcoastlines()
plt.show()

Basemap的第一张中国地图
了解地图的网友应该知道这地图的行政区域上藏南地区是有一些问题的。所以这图在很多地方其实是不太好使用的。

使用Shapefile绘制中国行政区域地图

有很多网友在网上提供的下载中国区域的shapfile文件地址是:https://gadm.org/download_country_v3.html 这个网站确实能下载到比较多的地图,但是这上面的地图和Basemap默认提供的地图一样存在国界线的问题。
所以我在github上找到一个好的中国国界线shapefile,内容比较少,但是基本边界是没有我能提的,下载地址为:https://github.com/dongli/china-shapefiles。目前好多同学讲说不能直接下载, 我把他在csdn上做了上传,地址:地图数据下载

绘制

m3= Basemap(llcrnrlon=77, llcrnrlat=14, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m3.readshapefile("china-shapefiles-master/china",  'china', drawbounds=True)
plt.show()

shapfile绘制的中国
由于我们直接使用shapefile来绘制了,所以就没有再使用basemap的绘制海岸线国界线等API了,一面看起来比较混杂。

给区域上色

这里我就使用了简单的上色方案,让matplotlib是调色板自动加色,所以效果没那么好,这毕竟不是我想做的重点如果对这部分有兴趣的同学可以参考用Matplotlib配合Basemap画一个中国地图 使用中国省份人口数据来上色的,效果好一些。

from matplotlib.patches import Polygon
from matplotlib.colors import rgb2hex


m5= Basemap(llcrnrlon=80, llcrnrlat=0, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m5.readshapefile("china-shapefiles-master/china",  'china', drawbounds=True)
m5.readshapefile("china-shapefiles-master/china_nine_dotted_line",  'nine_dotted', drawbounds=True)

cmap = plt.cm.YlOrRd

ax =plt.gca()
for nshape, seg in enumerate(m5.china):
    color = rgb2hex(cmap(nshape)[:3])
    poly = Polygon(seg, facecolor=color, edgecolor=color)
    ax.add_patch(poly)
plt.show()

上色后的中国

利用pandas打印一下shapefile区域内容信息

provinces = set()
for shapedict in m5.china_info:
    statename = shapedict['OWNER']
    provinces.add(statename.replace("\x00",""))
print(provinces )
{'上海市',
 '云南省',
 '内蒙古自治区',
 '北京市',
 '台湾省',
 '吉林省',
 '四川省',
 '天津市',
 '宁夏回族自治区',
 '安徽省',
 '山东省',
 '山西省',
 '广东省',
 '广西壮族自治区',
 '新疆维吾尔自治区',
 '江苏省',
 '江西省',
 '河北省',
 '河南省',
 '浙江省',
 '海南省',
 '湖北省',
 '湖南省',
 '澳门特别行政区',
 '甘肃省',
 '福建省',
 '西藏自治区',
 '贵州省',
 '辽宁省',
 '重庆市',
 '陕西省',
 '青海省',
 '香港特别行政区',
 '黑龙江省'}

绘制气象观测站点位置

stations_lon_lat = pd.read_csv("lon_lat_mean.csv")
plt.rcParams['figure.figsize'] = (30.0, 18.0) 
m7= Basemap(llcrnrlon=80, llcrnrlat=0, urcrnrlon=140, urcrnrlat=51, projection='lcc', lat_1=33, lat_2=45, lon_0=100)
m7.readshapefile("china-shapefiles-master/china",  'china', drawbounds=True)
m7.readshapefile("china-shapefiles-master/china_nine_dotted_line",  'nine_dotted', drawbounds=True)
longitudes, latitudes = m7(stations_lon_lat["Longitude"].get_values(), stations_lon_lat["Latitude"].get_values())
m7.scatter(longitudes, latitudes, s=10, marker='*',facecolors='r',edgecolors='r') 

在这里插入图片描述

参考博文

[1]: 【译】Basemap手册 https://www.sohu.com/a/237965467_165070
[2]: Anaconda中 安装basemap包 https://blog.csdn.net/pengranxindong/article/details/79136486
[3]: Basemap画一个中国地图 https://blog.csdn.net/u011596455/article/details/79620676

  • 27
    点赞
  • 275
    收藏
    觉得还不错? 一键收藏
  • 36
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值