用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 相关文章推荐
通过Python来使用七牛云存储的方法详解
Aug 07 Python
python读取oracle函数返回值
Jul 18 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
python Tensor和Array对比分析
Jan 08 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 Python
浅谈Python数学建模之数据导入
Jun 23 Python
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
You might like
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
jquery cookie插件代码类
2009/05/26 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
javascript常用函数(2)
2015/11/05 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
Python中__init__.py文件的作用详解
2016/09/18 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python利用platform模块获取系统信息
2020/10/09 Python
python中类与对象之间的关系详解
2020/12/16 Python
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
有个性的自我评价范文
2013/11/15 职场文书
实习求职信
2013/12/01 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL