这篇文章主要讲解了“python怎么绘制中国地图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python怎么绘制中国地图”吧!
气象、海洋、地球科学相关的分析必然少不了地图的可视化。
Python中我常用的绘制地图和空间信息分析的库是Cartopy。
Cartopy有一个非常严重的问题,那就是自带的中国国界数据有问题,这也是很多国外开源库的普遍问题。
在做中国区域的分析时,由于九段线的位置很偏南,因此最标准的做法是同时绘制南海区域的子图。
在做一些站点展示的时候,如果只单独画上几个站点总觉得很丑,可以加上一些地形背景。
综上,今天想要用一个小例子解决这3个问题:
# -*- coding: utf-8 -*-import numpy as npimport pandas as pdimport cartopyimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERfrom cartopy.io.shapereader import Reader, natural_earthimport matplotlib.pyplot as pltimport matplotlib.ticker as mtickerfrom matplotlib.image import imreaddef create_map(): shp_path = './cn_shp/Province_9/' # --创建画图空间 proj = ccrs.PlateCarree() # 创建坐标系 fig = plt.figure(figsize=(6, 8), dpi=400) # 创建页面 ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) # --设置地图属性 provinces = cfeat.ShapelyFeature( Reader(shp_path + 'Province_9.shp').geometries(), proj, edgecolor='k', facecolor='none' ) # 加载省界线 ax.add_feature(provinces, linewidth=0.6, zorder=2) # 加载分辨率为50的海岸线 ax.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=10) # 加载分辨率为50的河流~ ax.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=10) # 加载分辨率为50的湖泊 ax.add_feature(cfeat.LAKES.with_scale('50m'), zorder=10) ax.set_extent([105, 133, 15, 45]) # ax.stock_img() ax.imshow( imread('./NE1_50M_SR_W.tif'), origin='upper', transform=proj, extent=[-180, 180, -90, 90] ) # --设置网格点属性 gl = ax.gridlines( crs=ccrs.PlateCarree(), draw_labels=True, linewidth=1.2, color='k', alpha=0.5, linestyle='--' ) gl.xlabels_top = False # 关闭顶端的经纬度标签 gl.ylabels_right = False # 关闭右侧的经纬度标签 gl.xformatter = LONGITUDE_FORMATTER # x轴设为经度的格式 gl.yformatter = LATITUDE_FORMATTER # y轴设为纬度的格式 gl.xlocator = mticker.FixedLocator(np.arange(95, 145 + 5, 5)) gl.ylocator = mticker.FixedLocator(np.arange(-5, 45 + 5, 5)) # --设置小地图 left, bottom, width, height = 0.67, 0.15, 0.23, 0.27 ax2 = fig.add_axes( [left, bottom, width, height], projection=proj ) ax2.add_feature(provinces, linewidth=0.6, zorder=2) ax2.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=10) ax2.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=10) ax2.add_feature(cfeat.LAKES.with_scale('50m'), zorder=10) ax2.set_extent([105, 125, 0, 25]) # ax2.stock_img() ax2.imshow( imread('./NE1_50M_SR_W.tif'), origin='upper', transform=proj, extent=[-180, 180, -90, 90] ) return axdef main(): ax = create_map() title = f'distribution of station around China' ax.set_title(title, fontsize=18) df = pd.read_csv('buyo_position.csv') df['lon'] = df['lon'].astype(np.float64) df['lat'] = df['lat'].astype(np.float64) ax.scatter( df['lon'].values, df['lat'].values, marker='o', s=10 , color ="blue" ) for i, j, k in list(zip(df['lon'].values, df['lat'].values, df['name'].values)): ax.text(i - 0.8, j + 0.2, k, fontsize=6) plt.savefig('station_distribute_map.png')if __name__ == '__main__': main()
感谢各位的阅读,以上就是“python怎么绘制中国地图”的内容了,经过本文的学习后,相信大家对python怎么绘制中国地图这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4579695/blog/4512542