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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python利用Nagios增加微信报警通知的功能
Feb 18 Python
python smtplib模块实现发送邮件带附件sendmail
May 22 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
Python使用googletrans报错的解决方法
Sep 25 Python
Python中psutil的介绍与用法
May 02 Python
python实现的自动发送消息功能详解
Aug 15 Python
python爬虫 2019中国好声音评论爬取过程解析
Aug 26 Python
用python解压分析jar包实例
Jan 16 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
python实现交并比IOU教程
Apr 16 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 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中的CMS的涵义
2007/03/11 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
js获取域名的方法
2015/01/27 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python requests获取网页常用方法解析
2020/02/20 Python
python和JavaScript哪个容易上手
2020/06/23 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
什么是URL
2015/12/13 面试题
银行给客户的感谢信
2015/01/23 职场文书
写给女朋友的保证书
2015/05/09 职场文书
2015年防汛工作总结
2015/05/15 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js