用Python进行栅格数据的分区统计和批量提取


Posted in Python onMay 27, 2021

有时候我们会有这样的想法,就是针对某个区域的栅格数据,要提取它的平均值或者其他统计指标,比如在一个省内提取多年的降雨数据,最后分区域地计算一些统计值,或者从多个栅格数据中提取某个区域的数值形成一个序列。为了方便,画一个示意图看看,比如就像提取这个区域中的某一个市的区域,然后形成一个序列数据,这就可以使用rasterstats库了,此外的分区统计也可以用这个库

这个实验使用的数据格式分别是栅格(*.tif)和矢量(.shp),之后的分区统计操作和栅格数据的提取都是源于这两类数据。为了能使用上这个rasterstats库,选择了在google colab平台运行脚本,因为安装库实在是太方便了,在win上老是安装不上的,在google notebook立马就搞定了,而且可以把数据存储到谷歌云盘,直接在notebook中就是可以链接使用的

用Python进行栅格数据的分区统计和批量提取

那么现在就开始做测试,使用的数据就是左侧的栅格和矢量数据集
导入相关的模块

import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import rasterio
import rasterstats
from rasterio.plot import show
# show()方法用来展示栅格图形
from rasterio.plot import show_hist
# 用来展示直方图
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter

使用geopandas和rasterio分别读取矢量和栅格数据

# 使用geopandas读取矢量数据
districts = gpd.read_file('/content/drive/MyDrive/Datashpraster/Data/Districts/districts.shp')

# 使用rasterio读取栅格数据,栅格数据和矢量数据的坐标投影需要一致
raster = rasterio.open('/content/drive/MyDrive/Datashpraster/Data/Rainfall Data Rasters/2020-4-1.tif')
# 把矢量数据和栅格数据绘制到一个axis上,这个axis不是坐标轴,而是图形
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 20

fig, (ax1,ax2) = plt.subplots(1,2,figsize=(15,6))

show(raster, ax=ax1,title='Rainfall')
# 读取进来的矢量数据可以直接调用gpd的plot()方法绘制
districts.plot(ax=ax1, facecolor='None', edgecolor='red')
show_hist(raster,ax=ax2,title='hist')

plt.show()

先绘制一下结果看看

用Python进行栅格数据的分区统计和批量提取

读取栅格数据:

# 提取雨量栅格值到numpy数组
# 遵循GDAL规则从第一波段读取
rainfall_data = raster.read(1)
rainfall_data

用Python进行栅格数据的分区统计和批量提取

开始分区统计:

# 设置坐标变换信息
affine = raster.transform

# 准备开始进行空间分区计算
# 第一个参数是矢量分区,第二个是栅格,第三个是坐标变换信息,第四个是统计均值
avg_rallrain = rasterstats.zonal_stats(districts,rainfall_data,affine=affine,stats=['mean'],geojson_out=True)
# avg_rallrain

# 除了统计平均值之外,还有最大最小值那些

绘制一下,只是一个简单的图形而已

用Python进行栅格数据的分区统计和批量提取

当然第二部分更有意思,就是从多个分散的栅格数据中提取数据形成一个序列

,就是这些tif数据

用Python进行栅格数据的分区统计和批量提取

loop这些栅格数据集:

用Python进行栅格数据的分区统计和批量提取

获得提取到的结果,没错,就是这么一个序列数据,然后就是绘图了

用Python进行栅格数据的分区统计和批量提取

转换数据格式

# 将Date列转为时间型
data['Date'] = pd.to_datetime(data['Date'], infer_datetime_format=True)

# print(data)

data['Date'] = data['Date'].dt.date
print(data)

用Python进行栅格数据的分区统计和批量提取

绘图结果就是简单的图形而已

# 准备绘制图形
fig,(ax1,ax2)= plt.subplots(2,1,figsize=(18,6))
plt.rcParams['font.size'] = 15

data.plot(x='Date', y='Average_RF_Porto', ax=ax1, kind='bar', title='Avg_Rail_Porto')
data.plot(x='Date', y='Average_RF_Faro', ax=ax2, kind='bar', title='Avg_Rail_Faro',color='red')

#自动调整图形的分布
plt.tight_layout()
plt.show()

用Python进行栅格数据的分区统计和批量提取

结果就这样一个序列图,目的就是从栅格提取指定的研究区,然后提取栅格的值,再来绘图

虽然感觉不是那么花里胡哨的图,但这个应该还是比较实用的,特别是大批量提取栅格值的时候。由于在google colab里面操作的步骤比较多,中间可能有省略的地方,但重要的应该都在文中了,当然也可以迁移运用到其他地方,也可以查看一下这个第三方库的教程,比如read(1)是什么意思,官网的docs就写得有,实在是很方便的

以上就是用Python进行栅格数据的分区统计和批量提取的详细内容,更多关于Python 栅格数据的分区统计和批量提取 的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
详解Python核心对象类型字符串
Feb 11 Python
python发送邮件脚本
May 22 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
Python enumerate内置库用法解析
Feb 24 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 Python
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
You might like
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
django缓存配置的几种方法详解
2018/07/16 Python
python生成九宫格图片
2018/11/19 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python实现图片中文字分割效果
2019/07/22 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
python实现超级玛丽游戏
2020/03/18 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
html5与css3小应用
2013/04/03 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
农村婚礼证婚词
2014/01/10 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
思想品德自我评价
2014/02/04 职场文书
愚人节活动策划方案
2014/03/11 职场文书
Java存储没有重复元素的数组
2022/04/29 Java/Android