【GDAL应用】基于rasterstats的矢量数据分区统计栅格值信息

文章目录

  • 1 实现效果
  • 2 实现功能
  • 3 实现代码

1 实现效果

矢量数据:
在这里插入图片描述
栅格数据:只有一个value值(像素值或DN值),为1,计算统计时nodata作为0值处理。
在这里插入图片描述
输出结果:
在这里插入图片描述

2 实现功能

基于单波段的栅格数据(一般常为分类数据)和矢量面要素数据,计算矢量数据内栅格数据的统计值(如最大值、平均值、总和、最小值等)。

3 实现代码

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
"""
@time: 2023-10-24 9:04
@author: RSer_gis
@description: 分区统计
计算栅格数据与矢量数据中相应多边形区域相关的统计信息。
"""import time
import rasterio
from rasterstats import zonal_stats
from osgeo import ogrdef create_field(shp_file, stats_list=['majority']):'''功能:为矢量数据创建属性字段:param shp_file:   输入矢量文件shapfile文件:param stats_list: 待添加字段列表:return:'''driver = ogr.GetDriverByName('ESRI Shapefile')layer_source = driver.Open(shp_file, 1)lyr = layer_source.GetLayer()defn = lyr.GetLayerDefn()# 获取图层字段数量featureCount = defn.GetFieldCount()exists_fields = []  # 创建一个空列表,用于存储已存在的字段名称for i in range(featureCount):field = defn.GetFieldDefn(i)  # 获取图层字段的定义(描述字段的信息)field_name = field.GetNameRef()  # 获取字段的名称exists_fields.append(field_name)  # 将当前字段的名称添加到exists_fields列表,以便后续检查字段是否存在# 判断待添加字段是否已存在当前矢量数据属性表(字段)中for ele in stats_list:if ele in exists_fields:print(f"{ele}字段已存在当前矢量数据属性表中")else:cls_name = ogr.FieldDefn(ele, ogr.OFTReal)  # 创建字段描述信息(字段结构),制定名称,数据类型# cls_name.SetWidth(64)lyr.CreateField(cls_name)  # 在图层中创建新字段driver = None  # 在创建字段后,将驱动程序设为“None”以释放资源def set_fieldvalue(raster_file, shp_file, stats_list=['majority']):''':功能   基于矢量要素,为新添加的字段赋值统计信息:param raster_file:  输入栅格数据tif文件:param shp_file:  输入矢量数据shapfile文件:param stats_list: 为添加的字段赋值:return:'''ras_driver = rasterio.open(raster_file, driver="GTiff", nodata=0)array = ras_driver.read(1)  # 如果是多个波段,只读取第1个波段;波段索引从1开始affine = ras_driver.transformzs = zonal_stats(shp_file, array, affine=affine, all_touched=True,stats=stats_list,nodata=0)  # 每个要素的统计信息以字典(Dictionary)的形式存储在列表中 zs = [{'min': 1.0, 'max': 5.0, 'mean': 2.5},{'min': 0.0, 'max': 3.0, 'mean': 1.5},...]driver = ogr.GetDriverByName('ESRI Shapefile')layer_source = driver.Open(shp_file, 1)lyr = layer_source.GetLayer()defn = lyr.GetLayerDefn()featureCount = defn.GetFieldCount()count = 0feature = lyr.GetNextFeature()  # 获取第一个要素while feature is not None:for i in range(featureCount):field = defn.GetFieldDefn(i)field_name = field.GetNameRef()# 判断图层要素中的字段是否存在于stats_list,如果存在,将相应的统计信息设置到要素的相应字段中if field_name in stats_list:feature.SetField(field_name, zs[count][field_name])lyr.SetFeature(feature)else:passcount += 1feature = lyr.GetNextFeature()  # 获取下一个要素# 清理资源if layer_source is not None:layer_source = None  # 关闭数据源并释放相关资源driver = None  # 释放驱动程序引用ras_driver.close()  # 关闭数据集if __name__ == "__main__":start = time.time()rasterPath = r"D:\Desktop\test\data\潍坊市1702361169438\WF2024.tif"shpPath = r"D:\Desktop\test\data\gd_AL.shp"# stats_list = ['min', 'max', 'mean', 'median', 'majority'] # 统计信息字段名称stats_list = ['majority', 'max']print("创建字段...".center(25, "-"))create_field(shpPath, stats_list)print("字段赋值...".center(25, "-"))set_fieldvalue(rasterPath, shpPath, stats_list)print("分区统计完成!".center(25, "-"))end = time.time()print((end - start) / 60.0)

说明:
zonal_stats 函数的参数解释如下:

  • shp_path: 矢量数据的路径(如shapefile)。
  • array: 栅格数据的NumPy数组。
  • affine: 仿射变换矩阵,用于将栅格坐标映射到地理坐标。这通常是一个包含六个元素的元组或列表,如 (xoff, a, b, yoff, d, e),其中 xoff 和 yoff 是左上角的x和y坐标,a 是x方向的像素分辨率(通常为负),d是y方向的像素分辨率(通常为正),b 和 e 通常是0(表示没有旋转或倾斜)。
  • all_touched:
    如果为True,则即使多边形只与栅格的一个像素相交(而不仅仅是完全覆盖它),也会返回该像素的统计信息。如果为False,则只返回完全在多边形内的像素的统计信息。
  • categorical: 如果为True,并且array是一个分类栅格(即每个值代表一个类别而不是一个数值),则返回每个类别的计数,而不是数值统计(如平均值、标准差等)。
  • nodata: 用于标识array中无数据或缺失值的值。

zonal_stats 函数返回一个列表,其中每个元素都是一个字典,表示与shp_path中相应多边形区域相关的统计信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录刷题打卡day22

1 最大二叉树 使用递归的思路构造二叉树,一般选择前序遍历对树进行构造,需要先构造中间节点,然后递归构造左子树和右子树。 三部曲 确定递归函数的参数和返回值 参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点&…

关于勒索攻击,绝大多数企业存在的三个认知误区

网络空间,有一个挥之不去的“幽灵”,它的名字就叫勒索攻击。 近年来,企业遭受勒索攻击的事件被频频曝光。就在不久前,国家安全部曝光了一起境外黑客组织对我国某高新科技企业实施勒索攻击的案例,该企业的相关信息化系统…

Java云商城系统 云端商城 一站式系统Java源码 云商城自助下单平台 云商城虚拟交易网

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 云商城系统,无后门,一站式系统Java源码,心权益商品数量不限数量 系统对接 手动发货 自动发货 兑 换 码 订单监控 商品监控 对象存储 邮箱提醒 加价模板 密价…

【ElementUI -- 优化小技巧系列】 -- el-tree 节点内容过长优化 以及选中默认节点

在使用elementui过程中经常碰到关于样式的问题,我曾经很喜欢通过类名修改css样式来做,其实原生封装的elementui库的样式对于普通开发来说已经足够了,通过类名修改css只会让组件臃肿难以维护,现在真的越来越怕写css,经常…

解决html2canvas生成图片慢的问题

// 主要看那个点击事件就行 <divclass"textBox-right-board-group"v-for"item in screenList":key"item.id"><!-- 获取不同分辨率下的屏幕的展示的文字大小DPI&#xff1a; fontSize: getFontSize(item.resolutionRatio), --><di…

AI智能化逐渐趋于成熟后,预测今后最吃香的开发职业

AI智能化正在成熟的路途中&#xff0c;这中间会有波折&#xff0c;但终有一天会来的&#xff0c;我相信等到了这一天&#xff0c;我们的开发效率和代码质量&#xff0c;将会大大不同&#xff0c;而我们的团队与个人&#xff0c;也会面临着很棒的体验。 那么在AI智能化真正趋于成…

前端开发攻略---使用Sass调整颜色亮度,实现Element组件库同款按钮

目录 1、演示 2、实现原理 3、实现代码 1、演示 2、实现原理 改变颜色亮度的原理是通过调整颜色的 RGB 值中的亮度部分来实现的。在 Sass 中&#xff0c;可以使用颜色函数来操作颜色的 RGB 值&#xff0c;从而实现亮度的调整。 具体来说&#xff0c;亮度调整函数通常会改变颜…

武汉星起航:展望跨境电商新篇章,创新发展助力品牌国际化

随着全球经济一体化的深入发展&#xff0c;跨境电商行业正迎来前所未有的发展机遇。在这个充满机遇的时代&#xff0c;武汉星起航电子商务有限公司以其独特的自营亚马逊跨境电商模式和卖家孵化服务&#xff0c;成为了行业内的一股强劲力量。展望未来&#xff0c;武汉星起航将继…

VLM与基础分割模型的联合使用

最近做的项目里有涉及大模型&#xff0c;里面有一部分的功能是&#xff1a; 将图片输入VLM(视觉语言模型&#xff0c;我使用的是llava)&#xff0c;询问图中最显著的物体&#xff0c;将其给出的答案作为基础分割模型&#xff08;我使用的是Grounded-SAM&#xff09;的text prom…

云原生测试实战-云计算大数据云原生架构容器技术Kubernetes计算机软件工程软件开发

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

Gradle报错Cause: zip END header not found,构建问题解决

问题描述 构建报错&#xff1a;Cause: zip END header not found 解决办法 File>>setting>>Build,Execution,Deployment>>Gradle 选择你本地的Gradke路径 问题解决

2024年数维杯数学建模C题思路

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

拼多多投产比怎么逐步调高

提高拼多多的投产比&#xff08;ROI&#xff09;需要综合考虑多个因素&#xff0c;包括点击量、转化率、客单价以及点击花费。以下是一些有效的方法&#xff1a; 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自…

8-3 html中的表单标签 select和textarea

跟学b站黑马程序员pink老师&#xff0c;之前发过长篇&#xff0c;太长不好阅读&#xff0c;拆分成短篇 8.4.3 select下拉表单元素 如果在页面中有多个选项让用户选择&#xff0c;并且想要节约页面空间&#xff0c;我们可以用<select>标签来定义下拉列表 1.<select&g…

图片批量处理:批量调整图片色调,简单方法与高级技巧

随着数字摄影和社交媒体的普及&#xff0c;我们每天都接触到大量的图片。为了提升图片的观感和视觉效果&#xff0c;对图片进行色调调整变得至关重要。而对于那些需要处理大量图片的用户来说&#xff0c;批量调整图片色调则是一个能够大大提高工作效率的功能。本文将介绍办公提…

layui 数据表格 自动定位新增行位置

由于数据表格新增行后没有到新增到当前位置 继续增加的需求&#xff1a; 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…

【Node.js工程师养成计划】之使用Node连接MongoDB进行增删改查

一、Node连接MongoDB mongodb npm install mongodb # or ... yarn add mongodbdemo: const { MongoClient } require(mongodb); // or as an es module: // import { MongoClient } from mongodb// Connection URL const url mongodb://localhost:27017; const client ne…

PyQt程序的打包

Qt hello - 专注于Qt的技术分享平台 记录下PyQt程序的打包。 一&#xff0c;安装 pip3 install PyInstaller 二&#xff0c;打包 pyinstaller -w -n app app.py 根据需要选择打包参数&#xff0c;例如&#xff1a;-F表示生成单文件模式&#xff0c;即只有一个可执行文件…

windows驱动开发-内核调度(二)

这篇文档记录剩下的内核调度对象。 信号灯 任何驱动程序都可以使用信号量对象在其驱动程序创建的线程和其他驱动程序例程之间同步操作。 例如&#xff0c;当驱动程序没有未完成的 I/O 请求时&#xff0c;驱动程序专用线程可能会将自身置于等待状态&#xff0c;并且驱动程序的…

javaWeb入门(自用)

1. vue学习 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"https://unpkg.com/vue2"></script> </head> <body><div id"…