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

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

[复制链接]
$ S5 I( V0 b5 `# N1 r

文章目录

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

前言

3 e, _4 n. e: n. D3 _

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

0 h1 f0 z4 u' e# x
' D4 m, ]4 ~% {# J4 [4 O# `

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

* p) w2 S, T0 l) T

一、基础介绍

( f1 r8 k- p6 a

首先导入相关模块。

import numpy as np ; R. U3 Z# ]% Q. b import matplotlib.pyplot as plt ( y, o ~; W' F, ^ import cartopy.crs as ccrs 7 d; U0 D) ~. ? E import cartopy.feature as cfeature ( X- y- ]( E4 g* q+ p& g$ j from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter p0 y- j$ v( f6 D 123454 l/ c9 ]3 }' W Q s* m

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

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0)) 0 t, L! s; k. l 1

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

#ax.add_feature(cfeature.LAKES.with_scale(scale))" v# l, }( l; X5 B" p* e ax.add_feature(cfeature.OCEAN.with_scale(scale))# |1 n/ H, L' H& r; A5 H) q #ax.add_feature(cfeature.RIVERS.with_scale(scale)) - A# j& e) M! V1 o) b #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) * B: L- w N) Z( q) L ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) % N3 K& r/ k9 `# W" X% y, a7 } 12345 " W0 B$ k# E- I: w% X

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

. Q# U$ I2 c7 R7 `6 r* a1 @ _6 k0 n3 O z0 h; c
) e% U% Z& { U7 D) w% P

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

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) ' n0 C. @6 {" H, B' G ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree()) ; m" x! e U, _3 M( W' `* t #zero_direction_label用来设置经度的0度加不加E和W2 C: }: K) n2 O lon_formatter = LongitudeFormatter(zero_direction_label=False)# K6 B/ O0 [# i) e9 s, U lat_formatter = LatitudeFormatter()4 `- U t3 B9 o" ~3 P j) |! x ax.xaxis.set_major_formatter(lon_formatter) : X3 R- g$ _" w T7 H& [ ax.yaxis.set_major_formatter(lat_formatter) 1 {1 x5 ^- P' Q n0 s* G 1234567

可以看到效果图如下:

9 h0 x% }8 b4 t4 [- ?* W 3 b* V: O9 M8 M# [% g9 }
; n% |: C6 G$ ~

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

ax.outline_patch.set_visible(False) ! A3 n8 T8 u5 C ax.spines[bottom].set_visible(True)* p6 m" o& Z5 B0 X4 h ax.spines[left].set_visible(True)$ y/ T( u0 n5 H1 K$ B ax.spines[right].set_visible(True) # u5 O' T6 \: z' m9 X$ @( H ax.spines[top].set_visible(True) 3 ]& N6 O- m4 z' U ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 O1 t8 C. M- |6 w5 @ ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 + w: `. o" @" s1 O8 D5 m ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细9 }. e; p9 i2 p ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细7 Q, ^0 y8 [- Y5 ? - f# {7 ]% {8 l; a 12345678910

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

+ h4 J3 x( X5 o4 h9 x$ D; i* _

二、区域地图的绘制

# F6 }3 m/ V3 X1 s2 @9 q {4 b. _( g2 R

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

ax.set_extent(box,crs=ccrs.PlateCarree()) x e! h0 f2 V! K8 j \" p 1; k+ q- J3 c4 a z

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

5 ~0 k9 s9 x2 u 3 g4 ^% L3 O2 H3 N5 o
' |) [/ A9 X2 J8 A, h$ g3 n

总结

- O! c8 i9 ]/ A* I, T7 z' {" `

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

def map_make(scale,box,xstep,ystep):, t2 K T% C) N+ N% y3 n% Q ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180))' D5 k. _7 `1 o+ O, b1 m a = (box[1]-box[0])//xstep 9 `7 ]) Y. w y @! j x_start = box[1] - a*xstep # n' d; o2 ]- w- V4 @$ G a = (box[3]-box[2])//ystep 8 ~3 Q; x" v( O# R! w y_start = box[3] - a*ystep / h/ \( i( L9 s0 ~4 |, r ax.set_extent(box,crs=ccrs.PlateCarree()) 0 U& L3 u7 g# d3 c6 J #ax.add_feature(cfeature.LAKES.with_scale(scale)) X4 A# e5 w( k& G- `7 B1 A# T #ax.add_feature(cfeature.OCEAN.with_scale(scale)) . h; J0 ?$ n* J# q #ax.add_feature(cfeature.RIVERS.with_scale(scale)) ) c5 ]& ^& y+ \; D2 _! o1 l2 C+ k #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5) % E: O: G- @. |6 V ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) , u# l) C% V. O# @ $ L# v k6 }1 K# H; U' q1 [ ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) P% y, P. a" N5 F, K/ w& g7 Y ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree())6 [( \* {, V ?. F2 ]9 ? #zero_direction_label用来设置经度的0度加不加E和W0 ]) F& t( g; ^6 X0 E0 @/ h# i lon_formatter = LongitudeFormatter(zero_direction_label=False)+ T; [& X+ R9 d: H lat_formatter = LatitudeFormatter() : p% e" Z. A& P$ A% M+ v0 F0 ~7 S" ~4 h ax.xaxis.set_major_formatter(lon_formatter) ' k. P( I3 g8 F6 g: X2 G ax.yaxis.set_major_formatter(lat_formatter)2 ^9 A4 D! M; @ _4 r6 R #添加网格线 4 e( e, i% z2 K) G& _ ax.grid() $ G2 n& |& E; g4 p9 K ' D/ v! H5 `9 h) C2 h* R ax.outline_patch.set_visible(False) 5 H! Z9 e2 ?( r% c, a ax.spines[bottom].set_visible(True) 2 I# N5 B: E7 ~' g) |$ @- Y ax.spines[left].set_visible(True)" A" L4 X: X! v6 m z, D ax.spines[right].set_visible(True)* o/ `2 o! x/ L q ax.spines[top].set_visible(True) + F6 g/ [( ?( I8 ]( Z ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 ) i7 ^* y8 `6 h ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 2 i# H% v B" L) W( R ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 : c/ p) A q" o$ ]! L ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 ) Y" `# Y* Y) {8 ]: T' x, } # R9 j/ ~* ~" l9 a+ P return ax

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

8 R3 E9 G8 p8 R 4 U4 A2 I$ v) w& _ 8 c4 V% v: x3 d# O# p( }6 ?, u5 K# G& V6 u & `2 ?) V$ x# f) E6 {
回复

举报 使用道具

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