使用GDAL库统计不同分区内的灾害点分布情况,计算灾害相对密度等统计指标

主要功能是处理地理空间栅格数据(TIFF文件)和灾害点数据(CSV文件),统计不同分区内的灾害点分布情况,并计算灾害相对密度等统计指标。

TIFF文件:已经重分类后的文件

CSV文件:灾害点经纬度坐标

可根据实际的分类数修改下面代码

import sys
import numpy as np
from osgeo import gdal
import pandas as pd
from typing import Dict, Tuple, Listdef read_tif_file(filepath: str) -> Tuple:"""读取TIFF文件并处理NoData值"""dataset = gdal.Open(filepath)if dataset is None:raise ValueError("无法打开TIFF文件")# 获取基础信息projection = dataset.GetProjection()transform = dataset.GetGeoTransform()x_size = dataset.RasterXSizey_size = dataset.RasterYSizebands = dataset.RasterCount# 初始化存储数组data_1 = np.zeros((y_size, x_size), dtype=np.float32)# 只处理第一个波段(根据需求调整)band = dataset.GetRasterBand(1)nodata = band.GetNoDataValue()arr = band.ReadAsArray(0, 0, x_size, y_size).astype(np.float32)# 处理NoData值if nodata is not None:arr[arr == nodata] = np.nandata_1 = arrreturn projection, transform, data_1, x_size, y_size, bandsdef disaster_point_optimized(excel_filepath: str, tif_filepath: str) -> Tuple[List[List[int]], int]:"""优化后的灾害点坐标转换"""try:# 读取灾害点数据disaster_df = pd.read_csv(excel_filepath, encoding='ISO-8859-1')required_cols = ['JD', 'WD']if not all(col in disaster_df.columns for col in required_cols):raise ValueError(f"CSV文件必须包含 {required_cols} 列")# 获取地理转换参数tif_data = read_tif_file(tif_filepath)transform = tif_data[1]x_size = tif_data[3]y_size = tif_data[4]# 坐标转换逻辑longitude = disaster_df['JD'].valueslatitude = disaster_df['WD'].valuesx_origin = transform[0]y_origin = transform[3]x_res = transform[1]y_res = abs(transform[5])# 计算行列索引col_indices = ((longitude - x_origin) / x_res).astype(int)row_indices = ((y_origin - latitude) / y_res).astype(int)# 限制索引范围col_indices = np.clip(col_indices, 0, x_size - 1)row_indices = np.clip(row_indices, 0, y_size - 1)return [[int(row), int(col)] for row, col in zip(row_indices, col_indices)], len(row_indices)except Exception as e:print(f"处理出错: {str(e)}")return [], 0def count_partition_statistics(tif_filepath: str, csv_filepath: str) -> Dict[int, Dict[str, float]]:"""统计分区指标(含异常值过滤)"""# 获取灾害点坐标disaster_indices, total_points = disaster_point_optimized(csv_filepath, tif_filepath)# 读取栅格数据tif_data = read_tif_file(tif_filepath)data_1 = tif_data[2]y_size = tif_data[4]x_size = tif_data[3]# 有效值过滤(处理NoData和异常值)valid_mask = ~np.isnan(data_1)data_1_int = np.full(data_1.shape, -9999, dtype=int)  # 用非常见值填充无效位置data_1_int[valid_mask] = data_1[valid_mask].astype(int)# 统计有效分区(1-5)valid_values = (data_1_int >= 1) & (data_1_int <= 5)unique_values, counts = np.unique(data_1_int[valid_values], return_counts=True)pixel_counts = dict(zip(unique_values, counts))# 统计灾害点分布disaster_counts = {}for row, col in disaster_indices:if 1 <= row < y_size and 0 <= col < x_size:value = data_1_int[row, col]if 1<= value <= 6:  # 只统计有效分区disaster_counts[value] = disaster_counts.get(value, 0) + 1# 合并结果并计算统计量S_total = sum(pixel_counts.values())D_total = sum(disaster_counts.values())# 构建结果字典result = {}for value in range(1, 6):  # 保证1-5都有输出pc = pixel_counts.get(value, 0)dc = disaster_counts.get(value, 0)# 计算相对密度if D_total == 0 or pc == 0:rd = 0.0else:rd = (dc / D_total) / (pc / S_total)result[value] = {'pixel_count': pc,'disaster_count': dc,'relative_density': round(rd, 4)}return resultif __name__ == "__main__":tif_path = r''csv_path = r''stats = count_partition_statistics(tif_path, csv_path)# 格式化输出print("分区值\t像元个数\t灾害点个数\t相对密度")for value in sorted(stats.keys()):data = stats[value]print(f"{value}\t{data['pixel_count']}\t{data['disaster_count']}\t{data['relative_density']:.4f}")

效果:

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

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

相关文章

jar 包如何下载

在 Javaweb - 2 中&#xff0c;我们导入了三那个 jar 包来进行服务端的 JSON 串格式转换&#xff0c;这个为大家做一个如何下载那三个 jar 包的教程~ 打开仓库网站 我们需要先打开一个仓库网址&#xff1a;Maven Repository: Search/Browse/Explore 这个网址中&#xff0c;几…

【vue3】打包配置webpack压缩,哈希值设置

压缩配置 依赖下载&#xff1a; npm i --save-dev compression-webpack-plugin vue.config.js配置 const CompressionWebpackPlugin require(compression-webpack-plugin);filenameHashing: true, // 打包后为文件名增加hash值// 配置webpackconfigureWebpack: config >…

vue3 + elementPlus 封装hook,检测form表单数据修改变更;示例用 script setup 语法使用

vue3 elementPlus 封装hook,检测form表单数据修改变更&#xff1b;示例 script setup 语法 原文&#xff1a;https://mp.weixin.qq.com/s/gCuqKskp-KBxdClxcpwFqw原文&#xff1a;https://mp.weixin.qq.com/s/gCuqKskp-KBxdClxcpwFqw原文&#xff1a;https://mp.weixin.qq.com…

Java-泛型类

一、泛型类的基本概念 1. 什么是泛型类 泛型类是指使用类型参数定义的类&#xff0c;可以在类定义时不指定具体类型&#xff0c;而在实例化时指定。 2. 泛型类的作用 类型安全&#xff1a;编译时检查类型匹配 消除强制转换&#xff1a;减少运行时ClassCastException风险 代…

信任边界的人生智慧

我曾经是个喜欢试探的人 总想知道朋友会不会在我困难时伸手&#xff0c;合作伙伴会不会在利益面前变脸&#xff0c;爱人会不会在诱惑下坚守 结果发现&#xff0c;每一次试探都像是在关系上撒盐 不是因为对方经不起考验&#xff0c;而是「考验」这个行为本身就充满了不信任的…

SQL Server 中 GO 的作用

CREATE DATABASE MyDatabase; USE MyDatabase; GO --定义局部变量 DECLARE s_no varchar(8), s_avgrade numeric(4,1); --对局部变量赋值 SET s_no 20170208; SET s_avgrade 95.0; --使用局部变量 UPDATE student SET s_avgrade s_avgrade WHERE s_no s_no;&#x1f31f; G…

指标中台+大模型:解密衡石Agentic BI的NL2DSL架构实现

——Text2Metrics引擎如何攻克语义鸿沟&#xff0c;碾压传统NL2SQL方案 一、传统NL2SQL的“架构原罪”&#xff1a;业务语义的失控黑洞 当某银行尝试用NL2SQL分析“高净值客户流失率”时&#xff0c;系统生成如下危险SQL&#xff1a; 这正是NL2SQL的三大架构缺陷&#xff1a;…

设计模式 - 抽象工厂

抽象工厂是对工厂的抽象化&#xff0c;而不只是制造方法。 为了满足不同用户对产品的多样化需求&#xff0c;工厂不会只局限于生产一类产品&#xff0c;但是系统如果按工厂方法那样为每种产品都增加一个工厂又会造成工厂泛滥。所以&#xff0c;为了调和这种矛盾&#xff0c;抽…

面向对象Plus(2/2)

目录 面向对象Plus(qianwen) 一.面向对象三大特性 封装 继承 多态 二.多态 1.了解多态 2.体验多态 三.类属性和实例属性 1.类属性 a.设置和访问类属性 类属性的优点 b.修改类属性 四.类方法和静态方法 1.类方法 a.类方法特点 b.类方法应用场景 2.静态方法 a…

MocapApi 中文文档 和github下载地址 NeuronDataReader(以下简称 NDR)的下一代编程接口

以下是 MocapApi 技术文档 github https://github.com/pnmocap/MocapApi?tabreadme-ov-file 国内可以查找getcode 英文文档 https://mocap-api.noitom.com/mocap_api_en.html 概述 MocapApi 是 NeuronDataReader&#xff08;以下简称 NDR&#xff09;的下一代编程接口&…

STM32历史、命名、Flash、工作频率

目录 命名: Flash: 工作频率&#xff1a; 复位&#xff1a; 低功耗模式&#xff1a; IO端口&#xff1a; JATG: 看门狗定时器&#xff1a; STM是一家半导体公式&#xff0c;专门做芯片的&#xff0c;STM32是指32位的微处理器&#xff0c;其中芯片的架构是ARM结构的&#…

了解公共部门中的数据网格:支柱、架构和示例

作者&#xff1a;来自 Elastic Elastic Platform Team 想想那些像公共健康记录、城市规划模型等项目背后的所有数据。政府机构一直在产生大量数据。当数据分散在云平台、本地系统或像卫星和应急响应中心这样的专业环境中时&#xff0c;情况变得更加复杂。找到信息变得困难&…

阿里云ACP-检索分析服务

当数据量爆炸增长&#xff0c;并且需要提供全文检索功能&#xff0c;需要有效的数据检索能力 用什么数据库怎么保证安全性如何解决统计分析问题如何解决单点故障如何解决检索难题 应对方案&#xff1a; 关系型数据库&#xff1a;主从备份解决数据安全性问题&#xff0c;数据…

【DBeaver】跨平台数据库连接工具DBeaver Community 23.2.5安装配置使用

DBeaver是一款免费开源的通用数据库管理工具和SQL客户端&#xff0c;支持多种数据库系统。它基于Java开发&#xff0c;具备跨平台能力&#xff0c;可以在Windows、macOS和Linux系统上运行。 目录 安装DBeaver 连接MySQL数据库 安装DBeaver 进入DBeaver官网 DBeaver Communit…

【钱包】WEB3钱包APP框架的设计

【钱包】WEB3钱包APP框架的设计 一、前言 前段时间&#xff0c;自己做了一款WEB3钱包APP&#xff0c;从产品设计到框架搭建都是我一个人搞的&#xff0c;更多的参考了其他公司的钱包APP。 在此&#xff0c;想把自己的钱包经验分享出来&#xff0c;帮助没有做过钱包APP的同学开…

openGL学习(基本窗口)

学习路线 学习 OpenGL 需要掌握一系列基础知识和技能&#xff0c;这些内容涵盖了计算机图形学的基本概念、编程语言、数学知识以及 OpenGL 的具体 API 使用。以下是学习 OpenGL 所需的主要知识点&#xff1a; 1. 计算机图形学基础 图形学概念&#xff1a;了解图形学的基本概…

无人机防护装置技术解析

一、技术要点 1. 侦测防御系统 多频谱复合探测 整合无线电侦测&#xff08;20MHz–6GHz频段扫描&#xff09;、雷达探测、光电跟踪&#xff08;可见光/红外/激光&#xff09;技术&#xff0c;实现360无死角监测。例如神州明达系统可5公里内识别无人机信号&#xff0c;并同步…

2.2.2、CAN总线-测试模式、工作模式

目录 1、测试模式 2、工作模式 &#xff08;1&#xff09; &#xff08;2&#xff09;SLEEP位&#xff1a; &#xff08;3&#xff09;INRQ位&#xff1a;&#xff08;Init Request&#xff09; &#xff08;4&#xff09;ACK&#xff1a;应答 &#xff08;5&#xff09;…

区块链大讲堂 | 分布式隐私计算友好的零知识证明协议

区块链大讲堂 主讲人&#xff1a;上海交通大学计算机学院助理教授胡云聪 报告题目&#xff1a;分布式隐私计算友好的零知识证明协议 参与方式&#xff1a;扫描海报二维码报名参与活动

MyBatis映射文件(XML)中参数传递和SQL特殊字符处理

1. 参数占位符 1.1 #{} 和 ${} 的区别 #{} 占位符 作用&#xff1a;安全传参。MyBatis在执行SQL时&#xff0c;会把#{}替换成?&#xff0c;然后用参数值自动填充。 优点&#xff1a;可以防止SQL注入&#xff0c;推荐使用。 例子&#xff1a; select * from user wher…