球面多边形面积计算原理与实现
在土地测量、农业地块估算、城市规划等场景中,常需根据一组经纬度顶点计算多边形面积。直接套用平面几何的 shoelace(鞋带)公式会因忽略地球曲率而产生明显误差,尤其在大范围地块上。本文介绍球面多边形面积的计算原理。
为什么不能用平面 shoelace 公式
平面 shoelace 公式假设坐标是笛卡尔坐标,而经纬度是球面坐标——单位经度对应的实际距离随纬度升高而减小,直接相乘会扭曲形状。对于面积较大的地块,平面公式误差会显著累积。
球面过剩角算法
球面多边形的一个核心性质是:其内角和大于平面多边形的内角和,超出部分称为球面过剩角(Spherical Excess)。
- 平面 n 边形内角和为
(n-2)π。 - 球面 n 边形内角和为
ΣA,其中 A 为各顶点内角。 - 球面过剩角
E = ΣA - (n-2)π。
球面多边形面积公式为:
面积 = E × R²其中 R 为地球半径。该公式的几何含义是:面积与球面过剩角成正比,过剩角越大,多边形覆盖的球面区域越大。
球面梯形法
实际工程实现中,更常用的是球面梯形法(也称球面鞋带法)。其思路是将多边形按相邻顶点分成若干边段,每个边段与赤道构成一个球面梯形,再根据顶点顺序累加各梯形的有符号面积:
function sphericalArea(points) {
const R = 6371008.8; // 地球平均半径(米)
let sum = 0;
for (let i = 0; i < n; i++) {
const p1 = coords[i];
const p2 = coords[(i + 1) % n];
sum += (p2.lng - p1.lng) * (2 + Math.sin(p1.lat) + Math.sin(p2.lat));
}
return Math.abs((sum * R * R) / 2);
}这种方法避免了显式计算各顶点内角,实现更简洁,数值稳定性也更好。
单位换算
GIS 中面积单位多样,常用换算关系如下:
- 平方米 → 亩:
÷ 666.67 - 平方米 → 公顷:
÷ 10000 - 平方米 → 平方千米:
÷ 1000000 - 平方米 → 英亩:
÷ 4046.86
其中"亩"是中国农业常用单位,1 亩约等于 666.67 平方米(15 亩 = 1 公顷)。
应用场景
- 土地测量:根据宗地界址点计算地块面积,用于确权登记。
- 农业估算:测算农田、林地面积,辅助产量预估与补贴核算。
- 城市规划:统计地块、绿地、水体面积,支持用地分析。
注意事项
- 顶点顺序:顺时针与逆时针会导致面积符号相反,计算结果需取绝对值,但自交检测依赖符号,不可忽略。
- 自交多边形:若多边形边段相交,球面梯形法的累加结果可能不等于视觉面积,需先做自交检测或拆分。
- 闭合处理:首尾顶点不必相同,算法会自动闭合,但仍需保证至少 3 个顶点。
如需在线计算多边形面积,可使用 多边形面积计算工具,支持多种单位输出。