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

[复制链接]
( g- L ]% U8 _2 d

文章目录

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

前言

/ X& ]' u3 I8 A1 N% t& b/ [) V2 u! g+ b! |

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

9 c" X/ k9 F5 n- {4 ]3 G: ^
- ]' a- ^: F( S( i4 I8 g7 C2 A

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

7 N' T X6 i* M3 O) F$ a, K" n) J

一、基础介绍

5 E$ b2 Q/ t9 Y c% ^5 e7 I

首先导入相关模块。

import numpy as np ; ~8 n# X/ g% ~6 z3 a import matplotlib.pyplot as plt% m% M4 @8 o1 B5 Z2 n$ @ import cartopy.crs as ccrs% @/ w9 \) h! j4 t& W import cartopy.feature as cfeature & c& G& I; D) Y$ o: v+ G from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter 4 e7 U: o8 a9 } v* @ 123458 A. l( o2 n' p3 D3 t" d: n% P

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

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0))# \% l/ G& _% \* |8 S U 1

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

#ax.add_feature(cfeature.LAKES.with_scale(scale)) 9 v7 l% D8 w& q& f" E ax.add_feature(cfeature.OCEAN.with_scale(scale)): S- m% E+ Q# ]- d8 R5 V #ax.add_feature(cfeature.RIVERS.with_scale(scale))8 |2 z% M1 f/ ?: Y0 H% b3 ^7 D #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) 2 ~7 p( {8 I' U9 n$ q% N: \, A! G ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) / c* Y( a/ G; \$ n' @( P( @ 12345 " G, |* \" I. Y4 t3 R9 V

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

[; H, j( N k6 s" e 5 G) }& S5 v. ~" M3 X1 P. {2 _
( F _& _8 U1 c- P& f$ J& L4 F

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

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) 4 V: t) |/ b R( \9 ?1 Z/ A ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree()) , Z% T6 j7 N3 W9 p6 Y i& j #zero_direction_label用来设置经度的0度加不加E和W + A, e# @, e. g3 | lon_formatter = LongitudeFormatter(zero_direction_label=False)* S2 }& n s$ `/ l3 D lat_formatter = LatitudeFormatter() Y5 ~% g1 k" `2 X' j6 H- j ax.xaxis.set_major_formatter(lon_formatter) 1 [3 S9 A- |$ n% e d* W2 Z7 e ax.yaxis.set_major_formatter(lat_formatter) " G7 \: f9 ^) A: S5 Z 1234567

可以看到效果图如下:

. ]. Z5 U* y4 y9 e$ O! i3 \ 2 |+ d# {$ U" P
~, z. N* u# w0 N- N0 p

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

ax.outline_patch.set_visible(False)$ d+ f0 _4 r$ e* W ax.spines[bottom].set_visible(True)" Q% }& F. U5 U) R8 Z+ l t ax.spines[left].set_visible(True) " e, a5 M& Q+ n- `+ g- J ax.spines[right].set_visible(True) - K4 c8 Z6 V; N- K. |' u a2 X ax.spines[top].set_visible(True)5 j$ ]0 r; @1 z! I: P ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 * X. J- [) J- {) S8 d5 P& _" | ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 ) \# }6 ? F4 V; Y ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细& Q6 P* q! M( L4 Y$ T9 U0 A- g8 K ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细* p' ~8 S; a9 D! ^! b W 7 R7 A( s" A6 ]" P! N3 K: X4 e$ G 12345678910

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

% u9 `; S; f7 b8 J

二、区域地图的绘制

, p& s: m/ K' z. O! @2 e

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

ax.set_extent(box,crs=ccrs.PlateCarree())) b2 i5 Z3 E1 f4 s, L% D0 [ 1) z. M+ I/ Y1 U+ u/ V5 c ~ z

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

$ H+ E- q( j' D7 `4 a 4 z. Y( z/ G# c6 [: x' e- @# U
4 [2 S4 n) p0 {! d6 c! Z0 T1 b

总结

8 l; s# h' \* k; p

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

def map_make(scale,box,xstep,ystep): + [5 c; @/ \1 d ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) 4 c, O. c- _' H9 R. Y" k a = (box[1]-box[0])//xstep4 {% y5 i% ~6 K- W- }; f x_start = box[1] - a*xstep % a0 y) S0 K. _ a = (box[3]-box[2])//ystep5 g8 g2 U1 @3 U' h+ R y_start = box[3] - a*ystep; W+ q) w/ Z, b8 J. o ax.set_extent(box,crs=ccrs.PlateCarree()) - M* ^# P8 f7 R$ a4 O #ax.add_feature(cfeature.LAKES.with_scale(scale)) . q4 ]: w S6 M) P6 m! x #ax.add_feature(cfeature.OCEAN.with_scale(scale))7 r; M4 _; t0 p4 v7 V: l #ax.add_feature(cfeature.RIVERS.with_scale(scale))/ l: j' X* Z" h C1 Z #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5). J6 z$ P/ M3 }& ]2 b* {. k" R ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2)- Q' ?- l, ~+ {0 i) q ; M* w: M( O* {* j- E4 o ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) 8 N8 j5 h3 ^4 [. K8 R ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree()) 6 B4 S& N7 H: x( }3 M #zero_direction_label用来设置经度的0度加不加E和W% R& P! D m% O lon_formatter = LongitudeFormatter(zero_direction_label=False)) h' B# d3 i% l% j; N2 { lat_formatter = LatitudeFormatter() 8 [1 C7 y% d0 f9 [5 U0 ?* q ax.xaxis.set_major_formatter(lon_formatter)$ G( B1 y% @6 b o0 U# V5 Z ax.yaxis.set_major_formatter(lat_formatter)/ a/ Z* j* [4 e; A( A T$ _! N; Q$ S #添加网格线7 S- d! I! p& a" B+ _9 M ax.grid()' M5 K2 a, }2 H! J% @$ z! { ' t: |$ u4 L9 I- ]8 X* D8 r ax.outline_patch.set_visible(False)+ i" f, O c' r# c Q6 x0 @9 p ax.spines[bottom].set_visible(True), b3 j# E& z& t5 N' J) A ax.spines[left].set_visible(True) 7 i5 J1 B9 k5 w' Y$ B! P$ H g5 ~ ax.spines[right].set_visible(True) 7 y* l& r# W8 {8 T/ l' L6 F- o ax.spines[top].set_visible(True) ) ?, C& } x |: c, r9 \1 M ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 ' v7 V, v! G6 s( G \ ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细# J1 l4 y5 i9 t0 {! F0 U ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细, j. q) [1 i0 _1 K! U ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细3 U! B8 C( t! X0 t' k! n2 Q- J. _ ( E0 e+ Z! A8 A3 `6 b9 M1 o% ^ return ax

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

1 d- S. z6 l. m2 A) h* ^0 q8 } c, M) S( A( S% ^. {) Z . \* w+ i% c9 o1 D1 k- r) ^ 9 s* {/ Z. ]6 \ X8 J 7 X. G1 h$ G5 L+ d3 r$ P
回复

举报 使用道具

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