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

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

[复制链接]
6 m, Q) }$ n, u8 W5 M! g

文章目录

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

前言

L: z. c( X- L6 A; T

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

! n7 a' e+ f1 ^! {; e
s/ D1 x( ^2 w0 G

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

- Y+ S3 f" }& l2 V+ `0 I

一、基础介绍

+ Z/ ] P. r$ @6 u" c) v

首先导入相关模块。

import numpy as np2 r# W9 T9 E7 X# L import matplotlib.pyplot as plt ; |/ Z' K3 v. w! @ import cartopy.crs as ccrs % Z+ \7 C/ q& {1 ]4 X, O2 P# o import cartopy.feature as cfeature ; H# M5 p! L* ]: a) @( k from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter 1 h, p' P8 ^+ b- \ 12345 9 |+ g1 x8 Q% P# Z( ^% ^; M9 {- @

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

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0))5 m$ ^ ?# Z5 V, V* I6 v) c 1

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

#ax.add_feature(cfeature.LAKES.with_scale(scale)) . }& {! o$ x2 v ax.add_feature(cfeature.OCEAN.with_scale(scale))7 c! x$ L' ~8 }5 ?! q5 o #ax.add_feature(cfeature.RIVERS.with_scale(scale))0 E1 W+ o$ s3 l% P, h #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) ?0 d4 N. m9 s, A/ x3 `8 D ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) : [% {4 v5 K% T3 S2 W 12345 , ~2 O% X4 g/ B" w% Z/ R7 m! t5 O

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

6 W' ?9 @: S7 Q8 _2 @: S% L+ @0 ^ ' k' ^# Q; M N6 X$ z( v+ A
) ~& U; ]/ |6 z: L g

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

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) , ?2 v5 t# S" y2 T) N& e ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree()); a" d! ]' G* A #zero_direction_label用来设置经度的0度加不加E和W$ P+ s1 m& b" e+ l7 J( y lon_formatter = LongitudeFormatter(zero_direction_label=False) ' C" p/ B# X! X2 _ lat_formatter = LatitudeFormatter()1 ~( Z3 ], y1 v% q" P) }/ x ax.xaxis.set_major_formatter(lon_formatter)3 B/ j" |4 ]" x ax.yaxis.set_major_formatter(lat_formatter). r/ a( r8 E2 |2 T4 J" R 1234567

可以看到效果图如下:

+ j/ N5 w9 A+ k ; l. y. Y$ {3 R) W0 b
; {/ z$ C. H$ v" r. {* ~1 _

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

ax.outline_patch.set_visible(False) ! N, f( _* n, v( F' D/ D ax.spines[bottom].set_visible(True) ) _6 E4 [+ q' o9 l% ` ax.spines[left].set_visible(True) ( E# s% e2 L6 ^4 b. b" [* k7 j ax.spines[right].set_visible(True) ( h( ]$ {# w& d( M8 X* q/ g ax.spines[top].set_visible(True) 3 _2 W( Q# O& t! l8 o. H ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细' \, B3 D& `( M& E# K* j# q' { ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 5 j O+ q+ G/ u' l( g9 | ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 1 k' p& d" B: H& v7 m2 a; J7 q ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细6 l$ D, T& C6 u! r3 P; K ' p, d$ F& K5 U* k0 g% F- N 12345678910

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

$ s5 |0 U- R- {5 Z

二、区域地图的绘制

/ X, \4 n4 z$ n; z. W1 K

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

ax.set_extent(box,crs=ccrs.PlateCarree()) . m8 o+ Y* ?- I( ~ 1 7 s- k; K3 Z3 k' |- _1 r6 k

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

$ y! k4 p# y( K' T4 X W" g4 V 9 \0 ^6 d* H. j/ w2 S& f
& ^5 A x6 V4 @8 ?; p' V7 E7 ?7 ^

总结

: g2 B7 e+ K) m; w' C; b9 H3 M1 \

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

def map_make(scale,box,xstep,ystep): ( a9 F* ?- u- | ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) # K: P9 h! H* i9 R a = (box[1]-box[0])//xstep; d: T8 f6 a: [ x_start = box[1] - a*xstep $ `7 v& L+ n" n1 A- O$ { a = (box[3]-box[2])//ystep 3 L1 W \4 U3 |$ R$ A y_start = box[3] - a*ystep 8 j/ h& J! \/ J" P- I% U: {; t0 y ax.set_extent(box,crs=ccrs.PlateCarree()) / G+ D3 ?) E# c4 l) B8 d; C #ax.add_feature(cfeature.LAKES.with_scale(scale)) % Q9 M4 r- b' u6 ~( F$ e #ax.add_feature(cfeature.OCEAN.with_scale(scale))7 j8 f; m z4 M: ? #ax.add_feature(cfeature.RIVERS.with_scale(scale))& b; {9 I: E7 ~' D8 [ #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)+ R M# I3 G6 ~" o3 W# h ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) % D& B, E( s) c5 v: |& b" p( L n- b6 @( g$ i, v K1 f ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) 7 {$ Z( X: f I$ ^. i8 v) w ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree()), N* O- y2 O) Z% \; z& m, k #zero_direction_label用来设置经度的0度加不加E和W# p! n C9 i2 r lon_formatter = LongitudeFormatter(zero_direction_label=False) # b7 x: u4 @: A' F/ W. z, x lat_formatter = LatitudeFormatter() $ n2 Z( a0 F6 O: W! n6 ?# i ax.xaxis.set_major_formatter(lon_formatter) 6 X8 t2 u6 T: X% c- Q2 k& Y ax.yaxis.set_major_formatter(lat_formatter) , I. q0 b5 W t) Q, E; b #添加网格线# Z+ E/ d% h% z2 A# e7 o, W# ^ ax.grid() - k- e. ?2 v* Z3 z5 F7 x) S' j5 P ax.outline_patch.set_visible(False)( R: n! y( s3 x4 t* N ax.spines[bottom].set_visible(True) . }* Q# c8 j+ ~& H T ax.spines[left].set_visible(True), L" T5 V, ~) C ax.spines[right].set_visible(True) 9 t# |7 c% \; I ax.spines[top].set_visible(True)2 P1 m; _1 C A6 L0 r' ~* Z ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 . P, e4 D$ o8 ]0 G { ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细8 }3 {. \+ j; A$ @9 D7 ^4 R* M8 ? ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 4 A( ]# C. o! n) K' E* A" X ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细" x! {, w8 w; w3 b: G; T/ P # I3 v9 y; y3 p1 _3 e+ Y; w' j. Z* I return ax

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

1 z4 N; k. F+ }% C) D / n: _1 u1 T+ ^4 L2 y$ D% P ' u( K5 R* H" @* r* O: _# [ % K( K: T3 L2 \& A 9 ~9 c) z# A o+ P3 Z
回复

举报 使用道具

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