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第八周:详解网络编程基础(socket)
Dec 14 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
python实现转圈打印矩阵
Mar 02 Python
python的等深分箱实例
Nov 22 Python
python数字类型math库原理解析
Mar 02 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
python实现层次聚类的方法
Nov 01 Python
Python实现聚类K-means算法详解
Jul 15 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
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP闭包函数详解
2016/02/13 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
AngularJS语法详解
2015/01/23 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
Python实现完整的事务操作示例
2017/06/20 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
集团薪酬管理制度
2014/01/13 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
求职面试个人自我评价
2014/02/28 职场文书
献爱心倡议书
2014/04/14 职场文书
企业宣传工作方案
2014/06/02 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python
Python 实现Mac 屏幕截图详解
2021/10/05 Python