经纬度坐标下的球面多边形面积计算公式
-
经纬度坐标下的球面多边形面积计算公式
前段时间,想做一个根据地球经纬度坐标计算地球表面面积的
软件,
查阅大量资料,找到如下方法,仅供参考。
一般说来,
经纬度坐标多边形面积指的是
球面多边
形面积
。
我曾经在
作
< br>ArcIMS
项目时写了一个
Javascript
p>
函数,
特贴出来,
大家需要时
可以参考。为方便大家直接调用,我做了简单修改,如果有问题,请
批评指正
。还需要注意的是,该函数不适用于
自交叉多边形
。
不太好注释,具体原理请参考前人的定理:
< br>球面多边形计算面积的
关键在于计算多边形所有角的度数
.
对于球面
n
边形,所有角的和为
S
,球的半径为
R
,那么其
面积就是
球面面积
=R^2*(S-(n-2)*Pi)
p>
-----------------------------------------
--------------------------------------
-
-------------------------------------------------<
/p>
CODE:
// calculate Area
function
calcArea(PointX,PointY,MapUnits) {
var Count =
if (Count>3) {
//
< br>至少
3
个点
var mtotalArea = 0;
if((PointX[0]!=PointX[Count-1])
||(PointY[0]!=PointY[Count-1]))
//
第
1
个点与最后
1
个点不重合
{
return;
}
if
(MapUnits==
//
经纬度坐标下的球面多边形
//////////////////degrees
度数
{
var
LowX=;
var
LowY=;
var
MiddleX=;
var
MiddleY=;
var HighX=;
var
HighY=;
var AM =
var BM =
var CM =
var AL =
var BL =
var CL =
var
AH =
var BH =
var CH =
var CoefficientL =
;
//Coefficient
系数
var CoefficientH =
var
ALtangent =
//tangent
切线
var BLtangent =
;
var
CLtangent =
var AHtangent =
var BHtangent =
;
var
CHtangent =
var ANormalLine =
//NormalLine
法线
var BNormalLine =
var CNormalLine =
var OrientationValue =
//Orientation
Value
方向
值
var
AngleCos =
//
余弦角
var Sum1 =
var Sum2 =
var Count2 = 0;
var Count1 = 0;
var Sum =
;
var Radius =
6378000;
//
半径
for(i=0;i
{
if(i==0)
{
LowX =
PointX[Count-1] * /
180;
//
换算成弧度
LowY =
PointY[Count-1] * / 180;
MiddleX = PointX[0]
* / 180;
MiddleY = PointY[0] * / 180;
HighX = PointX[1] *
/ 180;
HighY = PointY[1] * / 180;
}
else
if(i==Count-1)
{
LowX =
PointX[Count-2] * / 180;
LowY = PointY[Count-2] * / 180;
MiddleX =
PointX[Count-1] * / 180;
MiddleY = PointY[Count-1] * / 180;
HighX =
PointX[0] * / 180;
HighY = PointY[0] * / 180;
}
else
{
LowX =
PointX[i-1] * / 180;
LowY = PointY[i-1] * / 180;
MiddleX = PointX[i]
* / 180;
MiddleY = PointY[i] * / 180;
HighX =
PointX[i+1] * / 180;
HighY = PointY[i+1] * / 180;
}
AM = (MiddleY) * (MiddleX);
BM = (MiddleY) * (MiddleX);
CM = (MiddleY);
AL = (LowY) * (LowX);
BL = (LowY) * (LowX);
CL = (LowY);
AH = (HighY) * (HighX);
BH = (HighY) * (HighX);
CH = (HighY);
-