python Cartopy的基础使用详解


Posted in Python onNovember 01, 2020

前言

常用地图底图的绘制一般由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为线条粗细。此处绘制海岸线和海洋,效果图如下:

python Cartopy的基础使用详解

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

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)

可以看到效果图如下:

python Cartopy的基础使用详解

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

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],可得到效果图如下:

python Cartopy的基础使用详解

总结

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

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

到此这篇关于python Cartopy的基础使用详解的文章就介绍到这了,更多相关python Cartopy内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现dict版图遍历示例
Feb 19 Python
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
Python中单例模式总结
Feb 20 Python
python获取本机所有IP地址的方法
Dec 26 Python
Python中asyncio模块的深入讲解
Jun 10 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
django 扩展user用户字段inlines方式
Mar 30 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
python脚本定时发送邮件
Dec 22 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 #Python
关于python中导入文件到list的问题
Oct 31 #Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 #Python
Python在线和离线安装第三方库的方法
Oct 31 #Python
python安装第三方库如xlrd的方法
Oct 31 #Python
python 中关于pycharm选择运行环境的问题
Oct 31 #Python
python操作ini类型配置文件的实例教程
Oct 30 #Python
You might like
Session保存到数据库的php类分享
2011/10/24 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
PHP反射实际应用示例
2019/04/03 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
Python识别html主要文本框过程解析
2020/02/18 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
英国办公用品商店:Office Outlet
2018/04/04 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
员工安全承诺书
2014/05/22 职场文书
质量管理标语
2014/06/12 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
画展观后感
2015/06/17 职场文书
校长新学期致辞
2015/07/30 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书