使用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
英文地址,請注明出處:http://en.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…