用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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
将python文件打包成EXE应用程序的方法
May 22 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
手把手教你怎么用Python实现zip文件密码的破解
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
You might like
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php生成二维码
2015/08/10 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
解放web程序员的输入验证
2006/10/06 Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
Python实现统计文本文件字数的方法
2017/05/05 Python
Python守护线程用法实例
2017/06/23 Python
import的本质解析
2017/10/30 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python实现图片识别汽车功能
2018/11/30 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
人力资源部经理助理岗位职责
2014/03/04 职场文书
公务员保密承诺书
2014/03/27 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Python django中如何使用restful框架
2021/06/23 Python
springboot读取nacos配置文件
2022/05/20 Java/Android