收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

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

[复制链接]
# A A4 ^8 D: @; I7 I

文章目录

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

前言

5 G9 x, o2 [: b5 u9 d* t% s

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

% p4 E# s/ M2 _. G
. U! n3 [4 W4 I! D! r$ O8 v

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

+ O; H% s ~0 k- W* ] D+ w

一、基础介绍

% q4 m1 |8 ~6 {3 v6 _. g/ B5 j! p

首先导入相关模块。

import numpy as np/ @9 J" ` z7 V' l8 { import matplotlib.pyplot as plt: B2 W1 `$ ]7 E- b1 @ import cartopy.crs as ccrs ( O7 I# u- s3 J/ q; V W7 y import cartopy.feature as cfeature! ^% q' o2 q! @, ]$ q: Q7 p from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter / U$ G) ^+ O5 @$ Y% t 123451 o% @! U0 J8 O6 Y# Q( [9 |

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

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0)) 9 M2 s. _% A9 q 1

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

#ax.add_feature(cfeature.LAKES.with_scale(scale))1 e# t, V" k, e9 m) n0 `; ? ax.add_feature(cfeature.OCEAN.with_scale(scale))- ]( e% \' {$ A; ^0 r' i #ax.add_feature(cfeature.RIVERS.with_scale(scale)) , V4 D7 t: G( J0 g" i# F #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) : v, F+ q. c; p" O1 N ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) ! ^; U6 h* {! `4 T ? 12345 5 k: M4 k1 B% ^

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

: ?) s0 @8 ^3 O/ O) R + l. s n% ^2 F2 G4 f# x f3 q
$ ]+ r5 j9 L$ w

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

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) V2 d5 v) D2 O+ V- C ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree())( E) p0 q! z: \' a- x2 Z #zero_direction_label用来设置经度的0度加不加E和W . A9 E2 y* |" y0 t4 p lon_formatter = LongitudeFormatter(zero_direction_label=False) 7 h( J2 X3 I9 T8 e lat_formatter = LatitudeFormatter() ( s# x3 P6 [6 e ax.xaxis.set_major_formatter(lon_formatter)' Y9 ~: t: ?! Q; C" k& k: u ax.yaxis.set_major_formatter(lat_formatter) # E5 p a" N' z5 u 1234567

可以看到效果图如下:

; z6 D0 M. W! L V3 l- H8 X$ f. T5 U+ t) \6 F" v
, l: a1 T: }& ~( p( o; ?8 F S

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

ax.outline_patch.set_visible(False) , x5 @5 ]; K; K+ e/ h/ ~ ax.spines[bottom].set_visible(True)' h& J. L. Q9 ?* h ax.spines[left].set_visible(True) E; v# [) i! }) P3 K ax.spines[right].set_visible(True) & ~# f, \" V* n! X% M, \6 n ax.spines[top].set_visible(True) & x* O& H* H7 A) m& {$ s ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细# U- y/ ?0 e) O! \4 J& i ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 + [3 F9 _: D Z9 u) ~' \) u ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细" e- d% b6 J" y1 S ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 ) t$ {& M8 k. G A8 o0 r5 j9 F' P3 O& v! H 12345678910

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

8 h5 A; j# @+ l8 B, V) p5 s" u; g

二、区域地图的绘制

+ ?2 W& D- S, G- J% M1 a

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

ax.set_extent(box,crs=ccrs.PlateCarree()) 5 K; J O4 R9 X5 |+ R/ r( y& ^ 1 3 K4 p: W; K+ F ~4 \( }$ n

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

) W6 u$ j1 I1 N* g9 K; T/ D0 e/ L3 C/ V3 W' _, @) G
' u, M0 e9 s" A% |/ a: D

总结

2 n% F, Y3 e0 p! `5 W

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

def map_make(scale,box,xstep,ystep):9 `1 ] ^% I) ] ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) f& O. \7 c5 m& I5 i$ f! B# |# D a = (box[1]-box[0])//xstep 1 @& M* X; T0 k- n; L$ z x_start = box[1] - a*xstep # x) H1 k1 T g1 y a = (box[3]-box[2])//ystep Z9 X4 v3 j# u3 @ y_start = box[3] - a*ystep7 _' x2 ^' X" Y% B( G: l) ^ ax.set_extent(box,crs=ccrs.PlateCarree())6 T1 f% ?( c" _6 R$ { #ax.add_feature(cfeature.LAKES.with_scale(scale))# M: n6 |7 e8 o( H M9 J" a #ax.add_feature(cfeature.OCEAN.with_scale(scale)) p( |) n! c* V+ O- h- } e% [; T #ax.add_feature(cfeature.RIVERS.with_scale(scale)). s+ w$ _' J( J/ h #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)& Q4 Z5 P; D5 e% a6 m& M ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2)& |0 H5 H; q! L6 c& U 5 ?0 q6 w3 H N8 Y/ J ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) # p: ~$ g4 w( I ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree()) $ m; \5 [9 l( d4 [; {0 f( ?& P# T #zero_direction_label用来设置经度的0度加不加E和W 1 D; L& i: n) Q, i# ` lon_formatter = LongitudeFormatter(zero_direction_label=False) * n8 _9 p# j2 v3 X$ d: { lat_formatter = LatitudeFormatter()0 |3 E# _, B+ Q- o: |. M ax.xaxis.set_major_formatter(lon_formatter)) f5 T- W! Q \9 j9 h& x- _/ | ax.yaxis.set_major_formatter(lat_formatter)" J# S( ~- b6 y- x/ { #添加网格线7 `& M: v H- ~9 r$ C+ J ax.grid() 9 k4 Y F$ L, S ) G; f$ q# w7 i1 ~ ax.outline_patch.set_visible(False)+ w" Z% Z: w7 O" Y2 W0 R( ` ax.spines[bottom].set_visible(True)5 P, v# `4 k8 J7 w6 R3 T ax.spines[left].set_visible(True)8 d. l- Z" ^+ G4 j5 v0 W3 `" @3 R ax.spines[right].set_visible(True)7 i% K/ r; e" F ax.spines[top].set_visible(True)2 K' B6 {9 X! w ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 & \8 o' d h* P4 D% p9 s ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 , N8 B+ @7 X$ M/ p7 C O ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细# p- g/ @7 B/ ? X' b) N( z4 I' h ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 ; K5 A) ?3 F9 x! ?, F % v* z, F& J- ~/ C3 U: @5 G4 f" @) u return ax

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

( a% }1 C- k/ j& _/ j6 g; E: | y- N g * v$ u# B( \+ ~0 t0 v) P 7 Z7 ]/ z% t5 v% ~1 n5 T' F7 T* ?6 b( { ; ~- i+ U( v8 s V6 h" M
回复

举报 使用道具

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