经纬度坐标下的球面多边形面积计算公式

绝世美人儿
937次浏览
2021年02月10日 06:14
最佳经验
本文由作者推荐

-

2021年2月10日发(作者:陈店实验学校)



经纬度坐标下的球面多边形面积计算公式




前段时间,想做一个根据地球经纬度坐标计算地球表面面积的 软件,


查阅大量资料,找到如下方法,仅供参考。


< p>
一般说来,


经纬度坐标多边形面积指的是


球面多边 形面积


。


我曾经在


作

< br>ArcIMS


项目时写了一个


Javascript


函数,


特贴出来,


大家需要时


可以参考。为方便大家直接调用,我做了简单修改,如果有问题,请


批评指正 。还需要注意的是,该函数不适用于


自交叉多边形


。

< p>



不太好注释,具体原理请参考前人的定理:


< br>球面多边形计算面积的


关键在于计算多边形所有角的度数


.



对于球面


n


边形,所有角的和为


S


,球的半径为


R


,那么其


面积就是



球面面积


=R^2*(S-(n-2)*Pi)



----------------------------------------- --------------------------------------


- -------------------------------------------------< /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);

























































-


-


-


-


-


-


-


-