用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的正则表达式re模块的常用方法
Mar 09 Python
python链接Oracle数据库的方法
Jun 28 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
python flask中动态URL规则详解
Nov 22 Python
python getopt模块使用实例解析
Dec 18 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
TensorFlow的自动求导原理分析
May 26 Python
Python使用openpyxl模块处理Excel文件
Jun 05 Python
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
You might like
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
ext监听事件方法[初级篇]
2008/04/27 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
初步理解Python进程的信号通讯
2015/04/09 Python
Python连接phoenix的方法示例
2017/09/29 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
工商管理实习自我鉴定
2013/09/28 职场文书
个人实用的自我评价范文
2013/11/23 职场文书
单位消防安全制度
2014/01/12 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
情况说明书格式范文
2014/05/06 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书