基于1x1度坐标计算网格面积 实现排放数据转通量kg·m−2·s−1
网格面积计算与排放通量单位转换方案
计算错误核心原因
你之前的计算结果异常主要来自4个问题:
- 三角函数默认接收弧度值,直接输入角度值会导致sin计算结果完全错误
- 等面积地球半径取值误用了公里单位,需转换为米才能匹配通量的平方米单位要求
- 经纬度差值直接用角度计算,需先转换为弧度代入公式
- 经度差计算逻辑错误,1°经度差对应的弧度值固定为
π/180,无需按跨180°经线的错误逻辑计算
一、Excel实现方案
前提说明
1x1度网格的面积仅和纬度相关,你只需要拿到每个网格的南边界纬度lat_lower和北边界纬度lat_upper即可计算,比如最南侧网格的lat_lower=-90.5、lat_upper=-89.5。
计算公式
- 网格面积(单位:平方米):
=(SIN(RADIANS(lat_upper)) - SIN(RADIANS(lat_lower))) * RADIANS(1) * POWER(6371000,2)
其中RADIANS()是Excel内置的角度转弧度函数,POWER(6371000,2)是等面积地球半径(单位米)的平方。
2. 通量单位转换(单位:kg·m⁻²·s⁻¹):
已知排放值Out_tonnes_per_year_by_cell单位为吨/年/格,1吨=1000kg,一年按365天计算共31536000秒,公式为:
=Out_tonnes_per_year_by_cell * 1000 / (网格面积单元格 * 31536000)
二、Python实现方案
使用pandas批量处理csv格式的排放清单效率更高,代码示例如下:
import math import pandas as pd # 常量定义 AUTHALIC_RADIUS = 6371000 # 等面积地球半径,单位:米 SECONDS_PER_YEAR = 365 * 24 * 3600 # 平年总秒数 DELTA_LON_RAD = math.radians(1) # 1度经度差对应的弧度值 def calc_grid_area(lat_lower: float, lat_upper: float) -> float: """计算1x1度网格的面积,返回值单位:平方米""" sin_diff = math.sin(math.radians(lat_upper)) - math.sin(math.radians(lat_lower)) return abs(sin_diff * DELTA_LON_RAD * (AUTHALIC_RADIUS ** 2)) # 读取原始排放数据 df = pd.read_csv("你的排放清单文件路径.csv") # 批量计算网格面积,假设你的csv中已包含lat_lower、lat_upper两列 df["grid_area_m2"] = df.apply(lambda x: calc_grid_area(x["lat_lower"], x["lat_upper"]), axis=1) # 计算通量 df["flux_kg_m2_s"] = df["Out_tonnes_per_year_by_cell"] * 1000 / (df["grid_area_m2"] * SECONDS_PER_YEAR) # 保存结果 df.to_csv("带通量计算结果的排放数据.csv", index=False, encoding="utf-8-sig")
内容的提问来源于stack exchange,提问作者Jordan-Yousef Jbour
相关产品推荐
相关产品推荐

