用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数据类型详解(四)字典:dict
May 12 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
对pandas中apply函数的用法详解
Apr 10 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
Python生成器generator用法示例
Aug 10 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
在Python中实现函数重载的示例代码
Dec 12 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
Python configparser模块常用方法解析
May 22 Python
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
怎么在Windows系统中搭建php环境
2013/08/31 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
PHP7 新增常量
2021/03/09 PHP
jquery提交form表单简单示例分享
2014/03/03 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
pycharm显示远程图片的实现
2019/11/04 Python
详解Django配置优化方法
2019/11/18 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
python实现学生信息管理系统源码
2021/02/22 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
工程监理应届生求职信
2013/11/09 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
60句有关成长的名言
2019/09/04 职场文书
如何用python插入独创性声明
2021/03/31 Python
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
Python echarts实现数据可视化实例详解
2022/03/03 Python