用Python计算栅格数据的真实面积

news/2024/11/13 2:08:42/文章来源:https://www.cnblogs.com/skypanxh/p/18539433

用Python计算栅格数据的真实面积

在地理空间分析中,栅格数据的像素值通常代表某种属性,比如土地利用比例、植被覆盖率等。这些数据往往基于经纬度网格表示的比例值,而为了更直观地理解这些数据的空间意义,我们需要将这些比例值转化为实际面积(如平方米或公顷)。

对于高分辨率的大尺寸栅格文件(GeoTIFF),一次性加载整个文件会耗费大量内存,甚至导致处理失败。为了解决这个问题,我们可以通过分块处理 的方式,逐步计算像素的真实面积,确保即使是大文件也能顺利处理。

一. 应用场景

该方法尤其适用于以下场景:

1. 比例值栅格数据:

当栅格像素值表示某个区域的比例(例如森林覆盖率)时,通过面积计算,可以得出真实的覆盖面积。

2. 土地利用分析:

计算农田、草地、建筑用地等各类土地利用类型的真实面积。

3. 遥感影像处理:

在遥感影像中将像素值的属性映射到真实的地理空间。

二.代码实现

import sys
import os
import rasterio
import numpy as np
from glob import globdef haversine(coord1, coord2):"""Calculate the great circle distance in kilometers between two pointson the earth (specified in decimal degrees, with coordinates in the order of longitude, latitude).Arguments:coord1 -- tuple containing the longitude and latitude of the first point (lon1, lat1)coord2 -- tuple containing the longitude and latitude of the second point (lon2, lat2)Returns:distance in kilometers."""# Extract longitude and latitude, then convert from decimal degrees to radianslon1, lat1 = np.radians(coord1)lon2, lat2 = np.radians(coord2)# Haversine formuladlat = abs(lat2 - lat1)dlon = abs(lon2 - lon1)a = np.sin(dlat / 2) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon / 2) ** 2c = 2 * np.arcsin(np.sqrt(a))r = 6371  # Radius of earth in kilometers. Use 3956 for milesreturn c * r# Read geotiff file in data folder
# Calculate area for a single GeoTIFF file
def calculate_area_for_tif(input_tif, chunk_size=1024):# Check if input file existsif not os.path.isfile(input_tif):raise FileNotFoundError(f"Input file '{input_tif}' does not exist.")# Construct output file pathoutput_path = input_tif.split('.')[0] + '_area.tif'# Skip if the area raster already existsif os.path.exists(output_path):print(f"Area of {input_tif} already calculated. Skipping...")return# Open the source rasterwith rasterio.open(input_tif) as src:# Check if the raster is in a geographic coordinate systemif not src.crs.is_geographic:raise ValueError(f"The raster {input_tif} is not in a geographic coordinate system!")# Get raster metadata and sizemeta = src.meta.copy()width, height = src.width, src.heighttransform = src.transform# Update metadata for outputmeta.update(compress='lzw', dtype=rasterio.float32, count=1)# Calculate the total number of chunkstotal_chunks = ((height + chunk_size - 1) // chunk_size) * ((width + chunk_size - 1) // chunk_size)chunk_count = 0  # Track processed chunks# Create the output raster filewith rasterio.open(output_path, 'w', **meta) as dst:print(f"Processing {input_tif} in chunks...")for row_start in range(0, height, chunk_size):row_end = min(row_start + chunk_size, height)for col_start in range(0, width, chunk_size):col_end = min(col_start + chunk_size, width)# Read a chunk of the source rasterwindow = rasterio.windows.Window(col_start, row_start, col_end - col_start, row_end - row_start)chunk_transform = src.window_transform(window)rows, cols = np.meshgrid(np.arange(row_start, row_end),np.arange(col_start, col_end),indexing='ij')# Apply geotransform to get geographical coordinatesx_coords, y_coords = chunk_transform * (cols, rows)x_coords_right, y_coords_right = chunk_transform * (cols + 1, rows)x_coords_bottom, y_coords_bottom = chunk_transform * (cols, rows + 1)xy_coords = np.stack((x_coords, y_coords), axis=0)xy_coords_right = np.stack((x_coords_right, y_coords_right), axis=0)xy_coords_bottom = np.stack((x_coords_bottom, y_coords_bottom), axis=0)# Calculate the area for this chunklength_right = haversine(xy_coords, xy_coords_right)length_bottom = haversine(xy_coords, xy_coords_bottom)area_chunk = length_right * length_bottom# Write the chunk to the output rasterdst.write(area_chunk.astype(np.float32), 1, window=window)# Update progresschunk_count += 1progress = (chunk_count / total_chunks) * 100print(f"Progress: {progress:.2f}% ({chunk_count}/{total_chunks} chunks)")print(f"\nArea of {input_tif} calculated and saved to {output_path}")if __name__ == '__main__':# Specify the input file pathinput_tif = 'path/to/your/input_file.tif'# Run the functioncalculate_area_for_tif(input_tif, chunk_size=1024)print('\nArea calculation complete!')

! 本代码修改自迪肯大学王金柱博士的代码

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

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

相关文章

Rocky9系统安装PostgreSQL

官网 https://www.postgresql.org/环境查看安装 登录官网根据平台选择帮助文档sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disable postgresql sudo dnf install -y po…

【GiraKoo】GLSurfaceView闪现黑屏的问题

Android下GLSurfaceView在显示正式内容之前,会有一个黑屏的过程。本文解释如何解决这个问题。【GiraKoo】GLSurfaceView闪现黑屏的问题 现象在Android平台,多个Activity之间进行切换。 使用GLSurfaceView进行描画,会有短暂的黑屏显示。对策设置GLSurfaceView的Surface的Form…

Mysql高可用架构方案

目录Mysql 介绍高可用结构主从模式主从模式介绍主从复制技术主从模式注意事项MHA(MasterHighAvailability)MHA模式介绍MHA工作流程MMM(Multi-MasterReplicationManagerForMysql)MGR(MysqlGroupReplication)总结 Mysql 介绍 Mysql是典型的开源关系型数据库,是许多网站、应…

postcss-px-to-viewport 移动端适配

以前做移动端项目的时候都是用rem来做适配,现在基本上都是通过viewport单位来做。 postcss-px-to-viewport就是一个将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件,它可以将你CSS中的px单位转化为vw,1vw等于1/100视口宽度。 1.安装 javascript代码解读 复…

支持多语言、多商店的商城,.Net7 + EF7领域驱动设计架构

推荐一个跨平台、模块化、可扩展且超快速的开源一体化电子商务平台。01项目简介 Smartstore 支持桌面和移动平台、多语言、多商店、多货币的商城,并支持SEO优化,支持无限数量的产品和类别、报表、ESD、折扣、优惠券等等。 还有一套全面的 CRM 和 CMS、销售、营销、付款和物流…

连接数据库-mysql

连接前的三个条件:下载好JDK环境、Mysql、数据库驱动jar包 jar包也去MySQL官网上下就可以 然后创建数据库,我是在Navicat上建的数据库然后创建的表。也尝试在小黑框那创建了但总出错。跟着up主改配置改了一通up主是成果了,我也没成功。。。、 然后在eclipse上新建项目,连上…

联影医疗王欢:智能管理驾驶舱推动业务闭环管理

在当今竞争激烈的市场环境下,市场的瞬息万变和客户需求的多样化,使得传统封闭式的经营管理模式难以为继,企业内部管理的复杂性也在不断加剧。许多企业在经营管理中普遍存在着管理效率低下、管理决策滞后、缺少闭环机制、目标缺乏协同、绩效信息黑匣等问题。 面对这些挑战,“…

代码语言模型是如何训练的:Qwen2.5-Coder 技术报告学习

Qwen2.5-Coder 是通义千问最新的代码语言模型,基于 Qwen2.5 的架构继续 pretrain 了 5.5T 的 token。通过细致的数据清洗、可扩展的合成数据生成和平衡的数据混合,Qwen2.5-Coder在展示令人印象深刻的代码生成能力的同时,还保留了通用的多功能性。本文根据官方的技术报告(Qw…

Codigger之配置LunarVim

Lunarvim是一款先进的集成开发环境(IDE),构建于Neovim之上,致力于为用户提供一个高效且个性化的编程平台。该环境融合了Neovim的核心优势,并增添了多项扩展功能,以支持诸如代码高亮、自动补齐、以及语言服务器协议(LSP)等特性,旨在为Codigger用户在Neovim中复现熟悉的…

从源码分析,MySQL优化器如何估算SQL语句的访问行数

本文将从源码角度分析SQL优化器代价估算的基础——行数估算,并总结MySQL当前设计存在的局限性。最后用一个现网问题的定位过程作为例子,给出该类问题的解决方案。本文分享自华为云社区《【华为云MySQL技术专栏】MySQL优化器如何估算SQL语句的访问行数》,作者:GaussDB数据库…

乐维网管平台(六):如何正确管理设备端口

一、什么是端口下联 在网络环境中,端口下联是指网络设备(通常是交换机)的端口与其他设备相连接的一种网络架构关系。交换机作为网络中的核心连接设备,其端口下联可以连接多种类型的终端设备,如计算机、服务器、IP 电话等,也可以连接下级网络设备,如接入层交换机连接到汇…

自动驾驶中的ego states包含的内容

截图来自论文:[2305.10430] Rethinking the Open-Loop Evaluation of End-to-End Autonomous Driving in nuScenes