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

文章目录

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

1 实现效果

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

2 实现功能

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

3 实现代码

# -*- 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 gdal, 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)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   # 释放驱动程序引用if __name__ == "__main__":start = time.time()rasterPath = r"D:\Desktop\test\data\test.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.rhkb.cn/news/319919.html

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

相关文章

探索设计模式的魅力:分布式模式让业务更高效、更安全、更稳定

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索分布式模式之旅✨ 在数字化时代,企业面临着前所未有的挑战和机遇。…

面试中算法(使用栈实现队列)

使用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。 栈的特点:先入后出,出入元素都是在同一端(栈顶)。 队列的特点:先入先出,出入元素是在两端(队头和队尾)。 分析&…

yolov8 区域声光报警+计数

yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的,具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points,当行人这一类别…

Microsoft Remote Desktop Beta for Mac:远程办公桌面连接工具

Microsoft Remote Desktop Beta for Mac不仅是一款远程桌面连接工具,更是开启远程办公新篇章的利器。 它让Mac用户能够轻松访问和操作远程Windows计算机,实现跨平台办公的无缝衔接。无论是在家中、咖啡店还是旅途中,只要有网络连接&#xff0…

【hive】transform脚本

文档地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManualTransform 一、介绍二、实现1.脚本上传到本地2.脚本上传到hdfs 三、几个需要注意的点1.脚本名不要写全路径2.using后面语句中,带不带"python"的问题3.py脚本Shebang…

ASP.NET淘宝店主交易管理系统的设计与实现

摘 要 淘宝店主交易管理系统主要采用了ASPACCESS的B/S设计模式,通过网络之间的数据交换来实现客户、商品、交易的管理和对客户、商品、交易统计工作,从而提高淘宝店主在管理网店过程中的工作效率和质量。 系统分为基本资料模块,统计资料模…

【MySQL】第一次作业

【MySQL】第一次作业 1、在官网下载安装包2、解压安装包,创建一个dev_soft文件夹,解压到里面。3、创建一个数据库db_classes4、创建一行表db_hero5、将四大名著中的常见人物插入这个英雄表 写一篇博客,在window系统安装MySQL将本机的MySQL一定…

安装库后JupyterLab一直报ModuleNotFoundError问题解决

背景: 先安装的Python3.10,安装在默认路径: C:\Users\#用户名省略#\AppData\Local\Programs\Python\Python310\ 后安装的Anaconda,更改过路径在D盘: D:\ProgramData\anaconda3 此时C盘Python安装路径下Scripts文件…

华为手机ip地址怎么切换

随着移动互联网的普及,IP地址成为了我们手机上网的重要标识。然而,在某些情况下,我们可能需要切换手机的IP地址,以更好地保护个人隐私、访问特定地区的内容或服务,或者出于其他网络需求。华为手机作为市场上的热门品牌…

MVC和DDD的贫血和充血模型对比

文章目录 架构区别MVC三层架构DDD四层架构 贫血模型代码示例 充血模型代码示例 架构区别 MVC三层架构 MVC三层架构是软件工程中的一种设计模式,它将软件系统分为 模型(Model)、视图(View)和控制器(Contro…

【kettle006】kettle访问华为openGauss高斯数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下华为openGauss高斯数据库相关知识体系 3.欢迎批评指正,跪谢…

【C语言回顾】数据在内存中的存储

前言1. 概述2. 大小端字节序和字节序判断2.1 大端字节序(Big-Endian)2.2 小端字节序(Little-Endian)2.3 判断字节序的示例 3. 数据在内存中的存储3.1 整数在内存中的存储3.2 浮点数在内存中的存储 结语 ↓ 上期回顾: 【C语言回顾】…

Coursera: An Introduction to American Law 学习笔记 Week 05: Criminal Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 05: Criminal LawKey Criminal Law TermsSupplemental Re…

【Python项目】基于opencv的的【疲劳检测系统】

技术简介:使用Python技术、OpenCV图像处理库、MYSQL数据库等实现。 系统简介:用户可以通过登录系统平台实现实时的人脸照片的拍摄和上传,结合上传图像的内容进行后台的图像预处理和运算分析,用户可以通过照片分析界面查看到当前检…

企业计算机服务器中了rmallox勒索病毒怎么处理,rmallox勒索病毒解密恢复

网络在为企业提供便利的同时,也为企业的数据安全带来严重威胁。随着网络技术的不断发展,越来越多的企业利用网络开展各项工作业务,网络数据安全问题,一直成为企业关心的主要话题,但网络威胁随着网络技术的不断成熟&…

OpenCV如何模板匹配(59)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现背投(58) 下一篇 :OpenCV在图像中寻找轮廓(60) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入…

第 129 场 LeetCode 双周赛题解

A 构造相同颜色的正方形 枚举&#xff1a;枚举每个 3 3 3\times 3 33的矩阵&#xff0c;判断是否满足条件 class Solution {public:bool canMakeSquare(vector<vector<char>>& grid) {for (int i 0; i < 2; i)for (int j 0; j < 2; j) {int c1 0, c…

Spring Cloud架构进化实操:Eureka、Apollo、OpenFeign、Ribbon、Zuul组件

文章目录 前言一、引出二、服务注册与发现2.1 创建Eureka注册中心2.1.1 引入pom依赖2.1.2 配置yaml2.1.3 启动服务21.4 测试访问 2.2 创建服务提供者2.2.1 配置yaml2.2.2 启动服务2.2.3 测试访问 2.3 创建服务消费者2.3.1 服务提供者接口2.3.2 服务消费者调用接口 三、负载均衡…

在GPU上加速RWKV6模型的Linear Attention计算

精简版&#xff1a;经过一些profile发现flash-linear-attention中的rwkv6 linear attention算子的表现比RWKV-CUDA中的实现性能还要更好&#xff0c;然后也看到了继续优化triton版本kernel的线索。接着还分析了一下rwkv6 cuda kernel的几次开发迭代以此说明对于不懂cuda以及平时…

LLVM Instruction Selection 笔记

Instruction Selection 所处阶段 注&#xff1a;上图来源于 Welcome to the back-end: The LLVM machine representation 可以看到 SelectionDAG 架在 LLVM IR 和 LLVM MIR 之间&#xff0c;在此之前 machine independent optimization 已经完成。之后基本上就进入了 machine …