python Cartopy的基础使用详解
作者:小龙人_tao 时间:2022-03-22 06:41:18
前言
常用地图底图的绘制一般由Basemap或者cartopy模块完成,由于Basemap库是基于python2开发的一个模块,目前已经不开发维护。故简单介绍cartopy模块的一些基础操作。 一、基础介绍
首先导入相关模块。
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
首先介绍参数projection,该命令可以配合ccrs设置投影类型,此处以方形投影命令为示例。其中central_longitude参数为投影中心位置。其中心设置与Basemap设置规则一样,详情可以看上一篇文章。
ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0))
在设置好绘制类型后,绘制地图各特征量。其代码如下:
#ax.add_feature(cfeature.LAKES.with_scale(scale))
ax.add_feature(cfeature.OCEAN.with_scale(scale))
#ax.add_feature(cfeature.RIVERS.with_scale(scale))
#ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)
ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2)
参数scale为地图分辨率,目前支持10m,50m,110m,参数lw为线条粗细。此处绘制海岸线和海洋,效果图如下:
在绘制结束后,作为地图。经纬度自然是必不可少的,在该模块中,引进同时设置坐标轴标签改变该标签刻度的表示,具体形式如下:
ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree())
#zero_direction_label用来设置经度的0度加不加E和W
lon_formatter = LongitudeFormatter(zero_direction_label=False)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
可以看到效果图如下:
当然如果想对坐标轴粗细变化可以引入一下命令。
ax.outline_patch.set_visible(False)
ax.spines['bottom'].set_visible(True)
ax.spines['left'].set_visible(True)
ax.spines['right'].set_visible(True)
ax.spines['top'].set_visible(True)
ax.spines['bottom'].set_linewidth(2.5);###设置底部坐标轴的粗细
ax.spines['left'].set_linewidth(2.5);####设置左边坐标轴的粗细
ax.spines['right'].set_linewidth(2.5);###设置右边坐标轴的粗细
ax.spines['top'].set_linewidth(2.5);####设置上部坐标轴的粗细
应该在该模块下,控制坐标轴的命令已经和常规不一样。因此先关闭该控制,然后开启常规坐标轴设置。
二、区域地图的绘制
当我们在某一小块区域研究时,需要绘制区域地图。此时我们可以引入命令:
ax.set_extent(box,crs=ccrs.PlateCarree())
其中box为绘制区域,crs为投影类型。其他命令基本不变。设置box为[40,180,0,90],可得到效果图如下:
总结
为方便各位读者,我书写了绘制地图的函数,大家在使用时可直接调用。此处示例为方形投影,若希望绘制其他投影。只需要修改函数部分参数即可。代码如下:
def map_make(scale,box,xstep,ystep):
ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180))
a = (box[1]-box[0])//xstep
x_start = box[1] - a*xstep
a = (box[3]-box[2])//ystep
y_start = box[3] - a*ystep
ax.set_extent(box,crs=ccrs.PlateCarree())
#ax.add_feature(cfeature.LAKES.with_scale(scale))
#ax.add_feature(cfeature.OCEAN.with_scale(scale))
#ax.add_feature(cfeature.RIVERS.with_scale(scale))
#ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)
ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2)
ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree())
#zero_direction_label用来设置经度的0度加不加E和W
lon_formatter = LongitudeFormatter(zero_direction_label=False)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
#添加网格线
ax.grid()
ax.outline_patch.set_visible(False)
ax.spines['bottom'].set_visible(True)
ax.spines['left'].set_visible(True)
ax.spines['right'].set_visible(True)
ax.spines['top'].set_visible(True)
ax.spines['bottom'].set_linewidth(2.5);###设置底部坐标轴的粗细
ax.spines['left'].set_linewidth(2.5);####设置左边坐标轴的粗细
ax.spines['right'].set_linewidth(2.5);###设置右边坐标轴的粗细
ax.spines['top'].set_linewidth(2.5);####设置上部坐标轴的粗细
return ax
来源:https://blog.csdn.net/weixin_49284189/article/details/109376547
标签:python,Cartopy
0
投稿
猜你喜欢
解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.
2022-05-02 14:42:15
XPath 1.0 学习笔记
2009-02-25 12:19:00
shtml网页SSI使用详解
2008-02-20 19:13:00
Tkinter组件Checkbutton的具体使用
2023-03-19 14:55:46
柳永法:vbs或asp采集文章时网页编码问题
2009-02-04 10:50:00
JavaScript设计模式之模板方法模式原理与用法示例
2024-02-24 02:17:20
python排序方法实例分析
2023-04-07 12:52:05
举例讲解Python的Tornado框架实现数据可视化的教程
2022-01-16 23:56:52
MySQL千万级数据的大表优化解决方案
2024-01-18 06:24:02
HTML在线编辑器的原理分析(整理)
2007-12-22 10:25:00
跟老齐学Python之让人欢喜让人忧的迭代
2022-10-02 14:33:23
Python查找不限层级Json数据中某个key或者value的路径方式
2023-07-08 02:39:43
Python分析最近大火的网剧《隐秘的角落》
2023-07-17 07:09:04
MySQL-group-replication 配置步骤(推荐)
2024-01-17 20:51:36
PHP基础之运算符的使用方法
2023-11-20 17:33:55
通过pycharm使用git的步骤(图文详解)
2023-07-24 14:43:21
如何让thinkphp在模型中自动完成session赋值小教程
2024-05-03 15:51:25
用python实现简单EXCEL数据统计的实例
2021-12-30 09:59:01
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2023-06-25 12:44:15
js string 转 int 注意的问题小结
2024-05-03 15:30:04