python:Cartopy的基礎使用


前言

經常使用地圖底圖的繪製通常由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
相關文章
相關標籤/搜索