文章目錄
- 前言
- 一、基礎介紹
- 二、區域地圖的繪制
- 總結
前言
常用地圖底圖的繪制一般由Basemap或者cartopy模塊完成,由于Basemap庫是基于python2開發的一個模塊,目前已經不開發維護,故簡單介紹cartopy模塊的一些基礎操作,一、基礎介紹
首先匯入相關模塊,
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設定規則一樣,詳情可以看上一篇文章,
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為線條粗細,此處繪制海岸線和海洋,效果圖如下:

在繪制結束后,作為地圖,經緯度自然是必不可少的,在該模塊中,引進同時設定坐標軸標簽改變該標簽刻度的表示,具體形式如下:
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)
可以看到效果圖如下:

當然如果想對坐標軸粗細變化可以引入一下命令,
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);####設定上部坐標軸的粗細
應該在該模塊下,控制坐標軸的命令已經和常規不一樣,因此先關閉該控制,然后開啟常規坐標軸設定,
二、區域地圖的繪制
當我們在某一小塊區域研究時,需要繪制區域地圖,此時我們可以引入命令:
ax.set_extent(box,crs=ccrs.PlateCarree())
其中box為繪制區域,crs為投影型別,其他命令基本不變,設定box為[40,180,0,90],可得到效果圖如下:

總結
為方便各位讀者,我書寫了繪制地圖的函式,大家在使用時可直接呼叫,此處示例為方形投影,若希望繪制其他投影,只需要修改函式部分引數即可,代碼如下:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/197676.html
標籤:其他
