背景
Bokeh的Geo采用谷歌地图API,无法调用;国内的百度、腾讯、高德API在热点图渲染时可以用,至于Echarts的使用,也出现了一些鸡肋BUG,于是想从根源上解决这个问题。
代码
安装Basemap、下载繁体字转简体字代码。
(一)注意在渲染全国地图时,一定要加上湾湾,确保政治正确:
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=0.5)
# m.drawcoastlines(linewidth=0.5)
m.readshapefile('gadm36_CHN_shp/gadm36_CHN_0', 'china', drawbounds=True) # 中国,竟然没有湾湾,NND
m.readshapefile('gadm36_CHN_shp/gadm36_TWN_0', 'taiwan', drawbounds=True) # 湾湾,是中国的一部分
(二)Basemap在读取shp地名时,部分地名竟然还是繁体字,必须改过来:
from langconv import *
traditional_sentence = '憂郁的臺灣烏龜'
Converter('zh-hans').convert(traditional_sentence)
Out[2]: '忧郁的台湾乌龟'
(三)在绘制省市边界时,需要事先知道绘制范围,左下、右上经纬度边界。以陕西省为例:
fig = plt.figure(figsize=(16, 9))
ax = plt.gca() # 获取当前绘图区的坐标系
bmap = Basemap(llcrnrlon=105,llcrnrlat=31,urcrnrlon=112,urcrnrlat=40,
projection='lcc',lat_1=33,lat_2=45,lon_0=120)
# bmap.etopo()
bmap.bluemarble()
# 画省
shp_info = bmap.readshapefile('gadm36_CHN_shp/gadm36_CHN_1','states',drawbounds=False)
for info, shp in zip(bmap.states_info, bmap.states):
# proid = info['NAME_1'] # NAME_1代表各省的拼音
proid = Converter('zh-hans').convert(info['NL_NAME_1'] ) # 汉语
if '陕西' in proid:
poly = Polygon(shp,facecolor='w',edgecolor='b', lw=0.2)
ax.add_patch(poly)
# 画市
bmap.readshapefile(shapefile='gadm36_CHN_shp/gadm36_CHN_2',
name='citys',
drawbounds=True) # 市
for info, shp in zip(bmap.citys_info, bmap.citys):
# proid = info['NAME_2'] # NAME_2 代表各市的拼音
proid = Converter('zh-hans').convert(info['NL_NAME_2'] ) # 汉语
# print(proid)
if "西安" in proid:
poly = Polygon(shp,
facecolor='r',alpha=0.3,
lw=3)
ax.add_patch(poly)
bmap.drawcoastlines()
bmap.drawcountries()
plt.title('陕西省')
# plt.savefig('fig_province.png', dpi=100, bbox_inches='tight')
plt.show()
至于再细化到某一城市,以及GIS级别的效果,需要你自行摸索了。
下载
本主将一下文件打包,2020年初微信付费文章还没有出来了的时候,撸了一下打赏系统,需要的可以自行打赏提取。共155M,易一网络科技 - 付费文章。
来源:oschina
链接:https://my.oschina.net/u/4348626/blog/4943129