Python加载basemap绘制分省地图

瘦欲@ 提交于 2021-02-03 11:56:55

背景

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,易一网络科技 - 付费文章


https://www.intumu.com/article/27www.intumu.com


Python数据采集处理分析挖掘可视化应用实例www.zhihu.com图标

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!