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

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

[复制链接]
* O8 n4 ?/ ?) O* y6 z( H- s

文章目录

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

前言

! _# L; p6 N+ n

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

, [ g* J4 T4 a
6 r& r$ r$ C, M3 b$ z

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

5 [$ g# Q7 p1 ^; b

一、基础介绍

9 D2 i1 \1 L, P2 c( M8 m) Y2 w

首先导入相关模块。

import numpy as np $ n( K) p, I% A( k# s, E: @: g# h* ` import matplotlib.pyplot as plt& O# `' M7 }0 J* T8 _ import cartopy.crs as ccrs ) b* S" V4 e7 f import cartopy.feature as cfeature * g# ]5 w# z; {) \6 |$ Q: Q1 j, o6 T from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter. C4 @3 e k$ d& q" k& B, K! Q1 F 12345 5 u2 Z- f4 W" X2 M4 B, }9 ^5 M

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

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0)) 5 ^% i- c8 b" }, C% w' l! l% ` 1

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

#ax.add_feature(cfeature.LAKES.with_scale(scale)) 5 p. ^+ l5 D$ b) D0 n. x9 G ax.add_feature(cfeature.OCEAN.with_scale(scale)) $ L6 V- F3 f8 W3 `# X #ax.add_feature(cfeature.RIVERS.with_scale(scale)) ( r3 |) S* L# S' H n #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) 9 T4 ^" t1 ^& [$ N: L' z ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) $ s2 [- j; [; @ 12345% Z# A( n0 w7 O x" S

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

: Z% G/ ~! J5 X/ o7 D* B2 _/ C 9 U1 ^4 Z% [& l: T- a; F
# f: J4 l/ z) z& {+ ^* f/ g

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

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) , A, e1 H- \9 Z9 c ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree())8 j! a9 t1 u G# b# }8 K+ N! @ #zero_direction_label用来设置经度的0度加不加E和W$ M9 i( k! Z" c lon_formatter = LongitudeFormatter(zero_direction_label=False)5 |8 p! p: K4 w- @7 z8 Q lat_formatter = LatitudeFormatter() 0 W9 B- h8 H, s2 M& u* ?4 u `: ~ ax.xaxis.set_major_formatter(lon_formatter)8 s; @# F0 j1 C, Z, u1 [( k ax.yaxis.set_major_formatter(lat_formatter)5 [6 k- N+ p; C) C9 ^ 1234567

可以看到效果图如下:

' U. y6 [2 Z2 T0 f4 G " V; Z0 I7 L; c) X) B( N# e) a* \
* [ G; }) z" M$ l% o1 p5 M0 L

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

ax.outline_patch.set_visible(False)/ }' b5 N/ P- _# ^3 n9 A ax.spines[bottom].set_visible(True) ; [; ^! n* e; V8 A. j ax.spines[left].set_visible(True) % Z7 R. Z9 Q* m ax.spines[right].set_visible(True)! c9 w3 s$ Q! T ax.spines[top].set_visible(True) ) Z6 e6 C+ _9 Y; [/ K' ]5 ^3 N: }: @7 X ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细$ V' l$ a# e2 b! O2 N% }0 G ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 $ N7 p1 C7 b$ [* S ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细5 e9 w8 \# {3 e' _5 A) D$ S) x" E ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 # Y5 R" T, |) z, B: M2 C" x/ U$ c8 L" q 12345678910

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

$ v5 D% M% e; ~

二、区域地图的绘制

b% |* M: J1 E' [0 F+ g( `

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

ax.set_extent(box,crs=ccrs.PlateCarree())/ z. S6 n& [2 k4 Y( B; R, Z 11 I5 u4 l. q: M6 g

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

- H# G5 s) o7 T/ `' A9 H1 N" k: [" Y$ `/ g, C" W
, m; a7 m1 q: S: Z' Q! A! d% y e

总结

; Q; d1 Q' _! H9 O# E

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

def map_make(scale,box,xstep,ystep): 1 m5 n+ i3 r, l$ K( H* D+ b ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180))/ n; K" X, n4 V/ Y; w a = (box[1]-box[0])//xstep9 f) R1 p( M N6 f. t x_start = box[1] - a*xstep + j$ o, b- P4 p, }& K; E a = (box[3]-box[2])//ystep ( m4 b% ~ A, F) w, O6 E' } y_start = box[3] - a*ystep. q7 R: U4 f1 D: ^, X. x ax.set_extent(box,crs=ccrs.PlateCarree())# X1 D( O* l4 E7 N0 V #ax.add_feature(cfeature.LAKES.with_scale(scale))" |4 `9 Y6 [+ u9 k #ax.add_feature(cfeature.OCEAN.with_scale(scale)) - B2 i+ f) X8 B* ?0 T* ~6 ^ #ax.add_feature(cfeature.RIVERS.with_scale(scale))& a4 \6 S' x4 a. ]! m1 |9 R #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)' u# B e( O3 O! ] ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) . c4 G; M* z3 {: S+ `1 e " J) m) B' }" { ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) 2 [3 ]- @4 j+ P6 p3 S ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree()), l7 a4 I6 F, B$ {6 \) v. q; ] #zero_direction_label用来设置经度的0度加不加E和W ; t# |2 X9 E( b: u' M3 E/ Y lon_formatter = LongitudeFormatter(zero_direction_label=False)* q3 [, I$ ]# l1 `; g% n/ l lat_formatter = LatitudeFormatter()+ n2 R( f' X6 s6 s/ Z2 b$ O8 h ax.xaxis.set_major_formatter(lon_formatter) |* ~0 U! |! c7 U( G% ]2 d' s ax.yaxis.set_major_formatter(lat_formatter)/ Y4 i B' n8 ]9 B" Y #添加网格线 - q2 r5 i9 O+ l6 g+ o2 X ax.grid()2 F% |+ I1 L7 D6 \0 j & ^, E6 U0 U5 }) m' _ ax.outline_patch.set_visible(False) / g# }2 Z, j* g" A ax.spines[bottom].set_visible(True); \1 j* H' M# r! q L ax.spines[left].set_visible(True) ) i& M. A7 e. y3 A" z4 p ax.spines[right].set_visible(True) # G6 G w7 x0 ?& ^; g% t3 O% Y; z ax.spines[top].set_visible(True) 8 @( e e2 t6 D% Z! B$ _& { ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细+ d3 N; f/ ]# ?* ]+ c m ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细- m3 O. M, v3 P5 P# n) j ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细6 ]2 H; i8 v- r' J! G. E% _ ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细# j, b4 ?; q- r. l % f8 _, {+ W( _# A return ax

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

* F g) k) T T: H; p: I' q1 {2 Y2 k3 e: p; n! E% p 3 |$ B) N9 d0 C: S; f 9 k8 s8 [6 j' j - m- x. v- E5 D- B6 k1 `+ X
回复

举报 使用道具

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