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

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

  • 摘要
  • Basemap的安装
    • 下载Basemap安装文件
    • 安装 Pyproj& Basemap
  • Basemap的Helloword
  • 使用Shapefile绘制中国行政区域地图
      • 绘制
      • 给区域上色
      • 利用pandas打印一下shapefile区域内容信息
      • 绘制气象观测站点位置
      • 参考博文

摘要

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

  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 — 建议直接采用浏览器的文字搜索在网页上搜索关键字找,网页的锚好像没用了
    python采用Basemap绘制完美中国地图_第1张图片
    python采用Basemap绘制完美中国地图_第2张图片
  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()

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

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

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

绘制

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()

python采用Basemap绘制完美中国地图_第4张图片
由于我们直接使用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()

python采用Basemap绘制完美中国地图_第5张图片

利用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') 

python采用Basemap绘制完美中国地图_第6张图片

参考博文

[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

你可能感兴趣的:(python采用Basemap绘制完美中国地图)