零基础小白python入门必看之Cartopy的基础使用

[复制链接]
8 Q# ^2 q2 p: C* p7 p

文章目录

前言一、基础介绍二、区域地图的绘制总结

前言

4 L o1 \& }9 r a2 @

常用地图底图的绘制一般由Basemap或者cartopy模块完成,由于Basemap库是基于python2开发的一个模块,目前已经不开发维护。故简单介绍cartopy模块的一些基础操作。

# |* C! j. I0 }# B0 k5 ^- {% C0 ~4 o$ u8 x
: V( B+ [& H k

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python,关注小编,并私信“01”即可进裙,领取python学习资料,会节约很多时间,减少很多遇到的难题。

3 S' b8 v7 e- P( T2 ]6 x9 \! p# t

一、基础介绍

2 r" U( m" ~& T& [: v/ I

首先导入相关模块。

import numpy as np4 Y7 o5 d# L! T d4 U [" R import matplotlib.pyplot as plt ' F: v2 ~5 V, z# |2 p import cartopy.crs as ccrs # p4 }' o8 G7 y8 s, f9 w. J import cartopy.feature as cfeature/ A, }2 a, C; S8 }3 K3 v# g from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter( |# k& B! {- X7 g2 _ 12345/ M+ v; t4 F2 v

首先介绍参数projection,该命令可以配合ccrs设置投影类型,此处以方形投影命令为示例。其中central_longitude参数为投影中心位置。其中心设置与Basemap设置规则一样,详情可以看上一篇文章。

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0)) - q( r$ I$ g L6 ~' E$ W 1

在设置好绘制类型后,绘制地图各特征量。其代码如下:

#ax.add_feature(cfeature.LAKES.with_scale(scale)) % S6 w$ u0 \; e0 b ax.add_feature(cfeature.OCEAN.with_scale(scale)); s5 Q/ T; w# h+ `! O) ]" Y #ax.add_feature(cfeature.RIVERS.with_scale(scale)) " f" o# O2 X4 t! c2 I, S) {# O #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5). z2 [4 k( ~, ? ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) 3 D% l& K* Y6 a. y9 o' A 12345 9 h& a4 F" M. i5 ?3 I v% {% w

参数scale为地图分辨率,目前支持10m,50m,110m,参数lw为线条粗细。此处绘制海岸线和海洋,效果图如下:

# I1 e& h5 j1 M2 \) W% k1 y6 S# s+ b8 m6 W# u# i+ h
" \% g3 A& P% p6 V K2 ~

在绘制结束后,作为地图。经纬度自然是必不可少的,在该模块中,引进同时设置坐标轴标签改变该标签刻度的表示,具体形式如下:

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()); U% C2 c% W1 L ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree()) $ s9 c) }$ J$ z* F #zero_direction_label用来设置经度的0度加不加E和W8 d+ m- R1 d3 K; j( x lon_formatter = LongitudeFormatter(zero_direction_label=False)- n7 l2 j9 E! x x6 ~+ ~ lat_formatter = LatitudeFormatter(): d+ h- T7 v; i( ]) M4 {/ E8 J8 ~ ax.xaxis.set_major_formatter(lon_formatter) 0 c2 {+ P N* `/ k ax.yaxis.set_major_formatter(lat_formatter)& M% L' _3 T: w) p! T( z7 E/ L 1234567

可以看到效果图如下:

/ o7 [1 t+ V. A( T; z# s2 W! P j6 L. s6 ]) t; v
' h# w" Z( E/ [

当然如果想对坐标轴粗细变化可以引入一下命令。

ax.outline_patch.set_visible(False) 2 A# w0 I# X5 ?9 @ ax.spines[bottom].set_visible(True)6 i M% v8 D) T' l8 B) ^- l ax.spines[left].set_visible(True)" l" ]% u R7 c- |# a, R8 C ax.spines[right].set_visible(True)# w: Q4 h2 b" |' r- Q4 @/ _ ax.spines[top].set_visible(True)3 \1 r* p' }' L. P0 x ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 * t) |. g- _; l$ h: Y ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细$ t8 l" ~ s k! z5 r+ N ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 3 c3 Q' ]" ^1 i2 F3 u ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细8 ]) S7 l2 j' \/ a+ y; W) I9 Q& B/ v / Z$ `1 k9 M; [+ Q) M% T, B 12345678910

应该在该模块下,控制坐标轴的命令已经和常规不一样。因此先关闭该控制,然后开启常规坐标轴设置。

! {5 {8 x! h6 s) w( a. @6 J8 k

二、区域地图的绘制

, e, b, I2 c3 f; n/ E

当我们在某一小块区域研究时,需要绘制区域地图。此时我们可以引入命令:

ax.set_extent(box,crs=ccrs.PlateCarree()). N4 v/ l1 a- ^ v 1 " E) X5 S/ r J$ S- t0 \

其中box为绘制区域,crs为投影类型。其他命令基本不变。设置box为[40,180,0,90],可得到效果图如下:

- _1 C: N. r+ l0 a: ]% H. c , k3 [2 Z# z0 z# n( C8 s( q
" I$ P) ^, F' ~1 J

总结

. l0 A7 U0 K- K4 m/ U1 z3 @

为方便各位读者,我书写了绘制地图的函数,大家在使用时可直接调用。此处示例为方形投影,若希望绘制其他投影。只需要修改函数部分参数即可。代码如下:

def map_make(scale,box,xstep,ystep): ; C1 {3 W: O# b; R ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) & w+ L2 W H" K% w; e a = (box[1]-box[0])//xstep- f. c+ y1 D, E x_start = box[1] - a*xstep: _6 n& x9 j# D9 B o5 R. N$ M a = (box[3]-box[2])//ystep . Y% K" K$ S$ q4 F% s5 b% _" ~0 ?9 O9 ` y_start = box[3] - a*ystep / n& k ]/ w9 h- w ax.set_extent(box,crs=ccrs.PlateCarree())# r: E8 V: }5 l R #ax.add_feature(cfeature.LAKES.with_scale(scale)) 6 `8 y9 A' T) E- ` n, D* y6 ~ #ax.add_feature(cfeature.OCEAN.with_scale(scale)) , t4 ]2 i2 d- C+ p/ s% C! O5 _ #ax.add_feature(cfeature.RIVERS.with_scale(scale))2 @) h# c/ ^" v1 p #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) ( M# |( o+ d) }2 p4 B- B3 I& X ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) + T' x5 J8 T9 p3 q8 x! T# |: T& P* {8 u ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) 5 a5 k" R- D% }0 v! G' n ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree())2 y, y* ]" G* Z1 M& l1 S9 o! F #zero_direction_label用来设置经度的0度加不加E和W$ \/ }# s+ i9 g/ s S" ] lon_formatter = LongitudeFormatter(zero_direction_label=False); U9 ^ f g+ W7 W lat_formatter = LatitudeFormatter() $ |* ^! Y# j2 J) r$ F/ T& V6 B ax.xaxis.set_major_formatter(lon_formatter) 3 c/ z; m% j: E! G ax.yaxis.set_major_formatter(lat_formatter)& E1 m: P, |9 _$ w #添加网格线8 x/ e) J+ V8 _5 V5 ? ax.grid()9 I) x, V3 ]/ }+ ?( c+ a3 c( B * l4 I0 F1 Y. N" ~6 R- i u7 g6 u ax.outline_patch.set_visible(False)9 ?4 y# p* e4 S; [- z" o6 V( C3 r ax.spines[bottom].set_visible(True)& _6 A2 H' T W ax.spines[left].set_visible(True)) _) i) w1 R7 Z4 F$ Y L ax.spines[right].set_visible(True) 5 `4 [' c9 J- n& d% x. @0 g ax.spines[top].set_visible(True) , y, H' _' r: C; I) ^% w2 V ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细7 D6 @- v) k. |" H- E/ E2 I ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细( P Y( k4 M7 [% l& K% l, G5 g ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 ( K; s8 j1 x1 v* v( o1 u ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 6 c# v' E' t% C# X1 t$ X* }" r) E. a! ]4 U return ax

最后多说一句,想学习Python可联系阿喵,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以关注阿喵,并私信“01”领取。

+ @( P% S n8 [8 h: N# @ ! G* ?" r$ t$ y$ E( S* m( j& f, S / r- }4 ]$ F3 N5 c2 k 9 c8 M# ]3 l% J y# W4 D8 X 1 D5 ?7 y0 Q7 B F0 \
回复

举报 使用道具

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
大狼
活跃在3 天前
快速回复 返回顶部 返回列表