之前有想过用Basemap绘制地图,后来在查阅Basemap的说明文件的时候发现Basemap已经停止维护了,神特么停止维护,这该死可爱的不向下兼容的版本切换啊,为啥这么说呢,因为Basemap是基于py2开发的,所以推荐使用Cartopy,经过长达2天,合计7W+秒的钻研之后,终于完成了我自己需要的部分的代码的构建。你没有看错,就是基于我自己的需求进行的代码编写,毕竟我只是做个笔记便于后面使用方便查找
  话不多说,上代码。

# -*- coding:utf-8 -*-
"""
@ Tsinlu Lee
@ IDLE (python 3.7.9 64-bits)
@ email: liqinlu19@mails.ucas.ac..cn
@ Matplotlib+Cartopy+GDAL空间数据处理.py
Refs:1. 使用Cartopy画图. https://www.bilibili.com/read/cv112714912. 开源GIS类库GDAL资料. https://www.osgeo.cn/python_gdal_utah_tutorial/index.html
"""
#### 先导入依赖包
from copy import copy
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LATITUDE_FORMATTER, LONGITUDE_FORMATTER
import matplotlib.pyplot as plt
import numpy as np
import shapely.geometry as sgeom
from cartopy.io.shapereader import Reader
from osgeo import gdal

  接下来定义一个坐标系,官方解释说是美国常用的,咱也不知道是不是真的,主要是我们经常用,所以我就用了。

Alberts_China = ccrs.AlbersEqualArea(central_longitude=105,standard_parallels=(25.0, 47.0))
# 设置地图的显示范围
extent = [76.5,106,25.5,42]

  Alberts是一种投影坐标系,单位是m,所以在做研究时用的比较多,10km,250m等,当然也有用地理坐标系做精度的,0.1°,1°等,这个根据需求自行选择合适的坐标系就可以。

# 读取数据,获取相关信息
shp = Reader("Data Store/DBATP_Line/DBATP_Line.shp")
# 这个是青藏高原的边界图,引文格式:
# 张镱锂, 李炳元, 郑度. 《论青藏高原范围与面积》一文数据的发表:青藏高原范围界线与面积地理信息系统数据. 全球变化科学研究数据出版系统, 2014. DOI: 10.3974/geodb.2014.01.12.v1,http://www.geodoi.ac.cn/doi.aspx?doi=10.3974/geodb.2014.01.12.v1
# 读取已投影栅格图,用来自定义颜色
ds = gdal.Open("Arcgis Res/XYLast_.tif")
# 获取栅格的信息
### 获取像素值
data = ds.ReadAsArray()
data[data==data.min()]=np.NAN # 这里最小值是缺省值,所以理论上应该使用缺省值做条件判断
### 获取栅格数据集的像素数和波段数
cols = ds.RasterXSize
rows = ds.RasterYSize
bands = ds.RasterCount
### 获取栅格数据集的地理坐标信息
geotransform = ds.GetGeoTransform()
originX = geotransform[0] # 左上角x坐标
originY = geotransform[3] # 左上角y坐标维度
pixelWidth = geotransform[1] # 东西方向像素分辨率
pixelHeight = geotransform[5] # 南北方向像素分辨率
### 生成栅格的经纬度信息
Lons = np.linspace(start=originX,stop=originX+pixelWidth*data.shape[1],num=data.shape[1],endpoint=True)
Lats = np.linspace(start=originY,stop=originY+pixelHeight*data.shape[0],num=data.shape[0],endpoint=True)
# 对颜色进行分段
clevs =  np.linspace(100, 1200, 200)

  截止到现在,我们就完成了所有需要数据的准备,接下来就是数据可视化了,那么,上代码。

fig = plt.figure(figsize = (11,11))
ax1 = plt.subplot(221,projection = Alberts_China) # 设置子图的坐标系,这个决定了图形的形状
ax1.set_extent(extent, crs=ccrs.PlateCarree()) # 设置显示范围,注意crs,是和extent的定义是一致
# 读shp文件,这里就是青藏高原边界
ax1.add_geometries(shp.geometries(),crs=ccrs.PlateCarree(), # 坐标系需要对应,不然可能会出现坐标不对应的情况哦edgecolor='k',linewidths=0.5,facecolor='none')
# 栅格可视化,同时根据像元值设置图片颜色
Rs = ax1.contourf(Lons, Lats, data, clevs, transform=Alberts_China,cmap=plt.cm.jet,zorder=10)
# 绘制色带喽,做个图连图例都不放,有毒吧?亲
cbar = fig.colorbar(Rs, orientation='vertical', pad=0.08, aspect=20, shrink=0.65)
cbar.set_ticks([100,300,500,700,900,1100])
cbar.set_label('Happness (score day$^{-1}$)') #我的数据没有负值,所以快乐值都是正值,祝见者天天开心
# 绘制经纬网
gl = ax1.gridlines(xlocs = [75,80,85,90,95,100,105],ylocs = [25,30,35,40],#alpha=0.5, linestyle='--', #draw_labels=True, #dms=True, x_inline=False, y_inline=False, )
gl.top_labels = False;gl.right_labels = False
# 下来这里是最折腾我的地方了,前面其实很快就弄好了。这里死活折腾
# draw_labels设为True后,出来的经纬度是跟着角度走的,就离谱
# 所以只能用matplotlib来绘制经纬度了,所以首先需要知道每个经纬线的坐标
# 获取经纬度信息我是通过Arcgis来做的,各位看官要是要更改的话,需要注意边框的大小会影响实际刻度的位置,毕竟坐标系是有比例尺,你们自行摸索吧
ax1.set_yticks([3035000,3600000,4190000,4800000],crs=Alberts_China)# 注意坐标系哦,这里又变了
labels = ax1.set_yticklabels(["25$^o$ N","30$^o$ N","35$^o$ N","40$^o$ N"])
ax1.set_xticks([-2550000,-2040000,-1505000,-1015000,-500000,0],crs=Alberts_China)
labels = ax1.set_xticklabels(["80$^o$ E","85$^o$ E","90$^o$ E","95$^o$ E","100$^o$ E","105$^o$ E"])
plt.tick_params(labelsize=10,direction = 'in',pad = 5,length = 5,width = 1.)
ax4 = plt.subplot(224)
plt.scatter([1,2,3],[2,3,4],c = ["g","b","r"],marker="o")
### 这里其实没什么信息,主要是为了实现绘制子图啥的,其实很简单,单纯是为了占位
plt.tick_params(labelsize=10,direction = 'in',pad = 5,length = 3,width = 1.)
plt.show()

  最后展示下大家的开心值哈,over~溜了溜了

Cartopy绘制地图相关推荐

  1. cartopy绘制地图出现空白

    补充国家信息 eu_country_names = ['Austria','Belgium','Bulgaria' , 'Croatia', 'Cyprus','Czechia','Denmark', ...

  2. python用cartopy包画地图_python绘制地图的利器Cartopy使用说明

    python绘制地图一般使用Basemap绘图包,但该包配置相对较繁琐,自定义性不强,这里介绍一个绘制地图的利器Cartopy,个人认为该工具方便.快捷,附上一些自己写的程序. 准备工作,工欲善其事, ...

  3. python绘制地图地图cartopy_python Cartopy的基础使用详解

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

  4. cartopy 绘制中国地图,南海诸岛和十段线

    cartopy作为Basemap的替代者,绘制地图还是非常方便的,尤其是有很多大牛现成的例子,这里参考了多篇文章,结合了绘制dat格式和shp格式的边界方法,使用了GMT中文社区的中国边界,shp文件 ...

  5. 使用 Cartopy 绘制区域地图

    使用 Cartopy 绘制区域地图 绘制亚洲地区的地形图(Miller 投影),并根据中国地区的 shapefile 绘制各个省份自治区的边界. import matplotlib.pyplot as ...

  6. python绘制地图地图cartopy_python绘制地图的利器Cartopy使用说明

    python绘制地图一般使用Basemap绘图包,但该包配置相对较繁琐,自定义性不强,这里介绍一个绘制地图的利器Cartopy,个人认为该工具方便.快捷,附上一些自己写的程序. 准备工作,工欲善其事, ...

  7. Cartopy画地图第七天(python画浮雕地图和比例尺)

    Cartopy画地图第七天(python画浮雕地图和比例尺) 本文利用了python.cartopy进行了浮雕地图的绘制,同时还画了比例尺. 先上图为敬,一些图例符号不对请不要介意,随便表示的 第一. ...

  8. python三维图能画地图_使用Python绘制地图的三大秘密武器

    原标题:使用Python绘制地图的三大秘密武器 Python地图可视化库有大家熟知的pyecharts.plotly.folium,还有稍低调的bokeh.basemap.geopandas,也是地图 ...

  9. Cartopy画地图第八天(冷空气南下,NCL色标使用)

    Cartopy画地图第八天(冷空气南下,NCL色标使用) 相信很多朋友都看过这张漂亮的图吧 这是中国气象爱好者公众号画的一张反映冷空气的图片,当时就被惊艳到了,本帖就来复刻一下这张图. 本次的知识点大 ...

最新文章

  1. 《javascript高级程序设计》笔记:变量对象与预解析
  2. 一起学nRF51xx 9 -  pwm
  3. 单调队列板子:求滑动窗口中最大值和最小值
  4. C++总结笔记(十二)—— 智能指针
  5. 【ArcGIS Pro微课1000例】0002:ArcGIS Pro 2.5二三维联动显示
  6. 苹果挂端口方法_调音台变身直播声卡的方法
  7. selenium-标签元素定位法-0223
  8. 陈天桥、张朝阳力挺360:腾讯不可仗势压人
  9. AP聚类算法(Affinity propagation Clustering Algorithm )
  10. 软件需求最佳实践之需求的沟通与分析
  11. ARCore快速入门--在模拟器(Emulator)上运行AR应用
  12. 单片机——仿真软件Proteus基本使用教程
  13. 如何在计算机自动开机时选择用户,电脑如何设置自动开机
  14. Firefox 插件 FlashGot 创建 Axel 下载任务
  15. 【三维CAD设计经验分享】CrownCAD设计:旋转和扫描
  16. 深圳大学计算机与科学考研科目,2020深圳大学计算机专业课不考408了
  17. C语言图形颜色编程|颜色
  18. 做短视频必须要知道的几个视频设置参数,爆款必备。
  19. 【万字干货】产业互联网B端产品经理实操手册
  20. 【Java面向对象编程——喂养三种宠物】

热门文章

  1. 【MindSpore,ModelArts】华为云ModelArts简明教程 | 图文
  2. vue引入阿里妈妈的图标
  3. c4droid用c语言画爱心,【图片】[自学C语言第五天]发一个作品【c4droid吧】_百度贴吧...
  4. Expected required, optional, or repeated.错误解决方法
  5. 非常实用的JavaScript代码
  6. 职场中年危机,可能只是你放水太多又不接受现实而已
  7. 【GdiplusTypes.h error C3861 “min“ 找不到标识符】的终极方案
  8. MySQL中length()、char_length()的区别和用法
  9. (五证合一)法人和其他组织统一社会信用代码编码规则
  10. 东西方企业运营的根深蒂固的差异