前言
經常使用地圖底圖的繪製通常由Basemap或者cartopy模塊完成,因爲Basemap庫是基於python2開發的一個模塊,目前已經不開發維護。故簡單介紹cartopy模塊的一些基礎操做。1、基礎介紹
首先導入相關模塊。python
import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
首先介紹參數projection,該命令能夠配合ccrs設置投影類型,此處以方形投影命令爲示例。其中central_longitude參數爲投影中心位置。其中心設置與Basemap設置規則同樣,詳情能夠看上一篇文章。git
ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0))
在設置好繪製類型後,繪製地圖各特徵量。其代碼以下:函數
#ax.add_feature(cfeature.LAKES.with_scale(scale)) ax.add_feature(cfeature.OCEAN.with_scale(scale)) #ax.add_feature(cfeature.RIVERS.with_scale(scale)) #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2)
參數scale爲地圖分辨率,目前支持10m,50m,110m,參數lw爲線條粗細。此處繪製海岸線和海洋,效果圖以下:
在繪製結束後,做爲地圖。經緯度天然是必不可少的,在該模塊中,引進同時設置座標軸標籤改變該標籤刻度的表示,具體形式以下:
spa
ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree()) #zero_direction_label用來設置經度的0度加不加E和W lon_formatter = LongitudeFormatter(zero_direction_label=False) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter)
能夠看到效果圖以下:
固然若是想對座標軸粗細變化能夠引入一下命令。
3d
ax.outline_patch.set_visible(False) ax.spines['bottom'].set_visible(True) ax.spines['left'].set_visible(True) ax.spines['right'].set_visible(True) ax.spines['top'].set_visible(True) ax.spines['bottom'].set_linewidth(2.5);###設置底部座標軸的粗細 ax.spines['left'].set_linewidth(2.5);####設置左邊座標軸的粗細 ax.spines['right'].set_linewidth(2.5);###設置右邊座標軸的粗細 ax.spines['top'].set_linewidth(2.5);####設置上部座標軸的粗細
應該在該模塊下,控制座標軸的命令已經和常規不同。所以先關閉該控制,而後開啓常規座標軸設置。code
2、區域地圖的繪製
當咱們在某一小塊區域研究時,須要繪製區域地圖。此時咱們能夠引入命令:orm
ax.set_extent(box,crs=ccrs.PlateCarree())
其中box爲繪製區域,crs爲投影類型。其餘命令基本不變。設置box爲[40,180,0,90],可獲得效果圖以下:
blog
總結
爲方便各位讀者,我書寫了繪製地圖的函數,你們在使用時可直接調用。此處示例爲方形投影,若但願繪製其餘投影。只須要修改函數部分參數便可。代碼以下:圖片
def map_make(scale,box,xstep,ystep): ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) a = (box[1]-box[0])//xstep x_start = box[1] - a*xstep a = (box[3]-box[2])//ystep y_start = box[3] - a*ystep ax.set_extent(box,crs=ccrs.PlateCarree()) #ax.add_feature(cfeature.LAKES.with_scale(scale)) #ax.add_feature(cfeature.OCEAN.with_scale(scale)) #ax.add_feature(cfeature.RIVERS.with_scale(scale)) #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree()) #zero_direction_label用來設置經度的0度加不加E和W lon_formatter = LongitudeFormatter(zero_direction_label=False) lat_formatter = LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) #添加網格線 ax.grid() ax.outline_patch.set_visible(False) ax.spines['bottom'].set_visible(True) ax.spines['left'].set_visible(True) ax.spines['right'].set_visible(True) ax.spines['top'].set_visible(True) ax.spines['bottom'].set_linewidth(2.5);###設置底部座標軸的粗細 ax.spines['left'].set_linewidth(2.5);####設置左邊座標軸的粗細 ax.spines['right'].set_linewidth(2.5);###設置右邊座標軸的粗細 ax.spines['top'].set_linewidth(2.5);####設置上部座標軸的粗細 return ax