百度地图中多边形覆盖物的面积计算
来源:互联网 发布:系统数据保密协议 编辑:程序博客网 时间:2024/06/06 04:32
面积计算原理
参考古人的定理:球面多边形计算面积的关键在于计算多边形所有角的度数,对于球面N变形,所有角的和为S,球的半径为R,面积计算公式:
(S−(N−2)∗Pi)∗R∗R
直接在地图上显示一个多边形覆盖物:
<html><head><title></title><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=秘钥"></script><body> <div id="allmap" style="width:100%;height:100%"></div> <script type="text/javascript"> var map = new BMap.Map("allmap"); map.centerAndZoom(new BMap.Point(121.329178,31.184047), 14); map.enableScrollWheelZoom(); //添加固定范围 var polygon = new BMap.Polygon([ new BMap.Point(121.309056,31.22383), new BMap.Point(121.309918,31.207647), new BMap.Point(121.322998,31.185036), new BMap.Point(121.331046,31.171689), new BMap.Point(121.331621,31.170082), new BMap.Point(121.353324,31.177868), new BMap.Point(121.363673,31.187755), new BMap.Point(121.35548,31.229018), new BMap.Point(121.335646,31.229141), new BMap.Point(121.317967,31.224201) ], {strokeColor:"red", strokeWeight:2, strokeOpacity:0.8}); //创建多边形 map.addOverlay(polygon); //增加多边形 </script></body></html>
计算面积逻辑代码如下::
//参数是一个百度类型的多边形覆盖物 function getArea(polygon){ // 检查类型:既不是百度类型的范围又不是数组类型的数据,直接返回0 if (!(polygon instanceof BMap.Polygon) && !(polygon instanceof Array)) { return 0; } //如果是百度类型的,得到点集合,不是的话,另说。 var pts = new Array(); if (polygon instanceof BMap.Polygon) { pts = polygon.getPath(); } //判断数组的长度,如果是小于3的话,不构成面,无法计算面积 if (pts.length < 3) { return 0; } var totalArea = 0;// 初始化总面积 var LowX = 0.0; var LowY = 0.0; var MiddleX = 0.0; var MiddleY = 0.0; var HighX = 0.0; var HighY = 0.0; var AM = 0.0; var BM = 0.0; var CM = 0.0; var AL = 0.0; var BL = 0.0; var CL = 0.0; var AH = 0.0; var BH = 0.0; var CH = 0.0; var CoefficientL = 0.0; var CoefficientH = 0.0; var ALtangent = 0.0; var BLtangent = 0.0; var CLtangent = 0.0; var AHtangent = 0.0; var BHtangent = 0.0; var CHtangent = 0.0; var ANormalLine = 0.0; var BNormalLine = 0.0; var CNormalLine = 0.0; var OrientationValue = 0.0; var AngleCos = 0.0; var Sum1 = 0.0; var Sum2 = 0.0; var Count2 = 0; var Count1 = 0; var Sum = 0.0; var Radius = 6378137.0;// ,WGS84椭球半径 var Count = pts.length; for ( var i = 0; i < Count; i++) { if (i == 0) { LowX = pts[Count - 1].lng * Math.PI / 180; LowY = pts[Count - 1].lat * Math.PI / 180; MiddleX = pts[0].lng * Math.PI / 180; MiddleY = pts[0].lat * Math.PI / 180; HighX = pts[1].lng * Math.PI / 180; HighY = pts[1].lat * Math.PI / 180; } else if (i == Count - 1) { LowX = pts[Count - 2].lng * Math.PI / 180; LowY = pts[Count - 2].lat * Math.PI / 180; MiddleX = pts[Count - 1].lng * Math.PI / 180; MiddleY = pts[Count - 1].lat * Math.PI / 180; HighX = pts[0].lng * Math.PI / 180; HighY = pts[0].lat * Math.PI / 180; } else { LowX = pts[i - 1].lng * Math.PI / 180; LowY = pts[i - 1].lat * Math.PI / 180; MiddleX = pts[i].lng * Math.PI / 180; MiddleY = pts[i].lat * Math.PI / 180; HighX = pts[i + 1].lng * Math.PI / 180; HighY = pts[i + 1].lat * Math.PI / 180; } AM = Math.cos(MiddleY) * Math.cos(MiddleX); BM = Math.cos(MiddleY) * Math.sin(MiddleX); CM = Math.sin(MiddleY); AL = Math.cos(LowY) * Math.cos(LowX); BL = Math.cos(LowY) * Math.sin(LowX); CL = Math.sin(LowY); AH = Math.cos(HighY) * Math.cos(HighX); BH = Math.cos(HighY) * Math.sin(HighX); CH = Math.sin(HighY); CoefficientL = (AM * AM + BM * BM + CM * CM)/ (AM * AL + BM * BL + CM * CL); CoefficientH = (AM * AM + BM * BM + CM * CM)/ (AM * AH + BM * BH + CM * CH); ALtangent = CoefficientL * AL - AM; BLtangent = CoefficientL * BL - BM; CLtangent = CoefficientL * CL - CM; AHtangent = CoefficientH * AH - AM; BHtangent = CoefficientH * BH - BM; CHtangent = CoefficientH * CH - CM; AngleCos = (AHtangent * ALtangent + BHtangent * BLtangent + CHtangent* CLtangent)/ (Math.sqrt(AHtangent * AHtangent + BHtangent* BHtangent + CHtangent * CHtangent) * Math.sqrt(ALtangent * ALtangent + BLtangent* BLtangent + CLtangent * CLtangent)); AngleCos = Math.acos(AngleCos); ANormalLine = BHtangent * CLtangent - CHtangent * BLtangent; BNormalLine = 0 - (AHtangent * CLtangent - CHtangent* ALtangent); CNormalLine = AHtangent * BLtangent - BHtangent * ALtangent; if (AM != 0) OrientationValue = ANormalLine / AM; else if (BM != 0) OrientationValue = BNormalLine / BM; else OrientationValue = CNormalLine / CM; if (OrientationValue > 0) { Sum1 += AngleCos; Count1++; } else { Sum2 += AngleCos; Count2++; } } var tempSum1, tempSum2; tempSum1 = Sum1 + (2 * Math.PI * Count2 - Sum2); tempSum2 = (2 * Math.PI * Count1 - Sum1) + Sum2; if (Sum1 > Sum2) { if ((tempSum1 - (Count - 2) * Math.PI) < 1) Sum = tempSum1; else Sum = tempSum2; } else { if ((tempSum2 - (Count - 2) * Math.PI) < 1) Sum = tempSum2; else Sum = tempSum1; } totalArea = (Sum - (Count - 2) * Math.PI) * Radius * Radius; return totalArea; // 返回总面积}
调用计算面积的方法:
//1秒后弹出面积值,单位:米 setTimeout(function(){ alert(getArea(polygon)); },1000);
如图所示:
3 0
- 百度地图中多边形覆盖物的面积计算
- android中计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- Android 使用 百度地图 测量 多边形面积
- 百度地图开发:多边形覆盖物的背景颜色等样式设置
- hdu2036 (计算多边形的面积)
- 计算任意多边形的面积
- 任意多边形面积的计算
- 任意多边形的面积计算
- 计算任意多边形的面积
- 任意多边形的面积计算
- 百度地图:普通覆盖物,以及多边形覆盖物,及他们的描述信息的添加,修改,删除,查看功能,还有多边形根据名称查询功能;
- 计算不规则多边形的面积、中心、重心(计算地图围栏中心点)
- 计算几何--多边形面积的计算
- View.requestLayout()
- OI流
- 有用的忠告与建议
- char *和string的字符串处理常用接口函数
- 排序算法之冒泡排序
- 百度地图中多边形覆盖物的面积计算
- Hibernate源码分析
- Bean配置形式:
- 微信企业号开发总结
- VS使用指南
- Linux环境下使用定时器通过sqlldr向oracle数据库导入数据
- 确定项目的目的和目标
- Problem C
- Android Eclipse上传svn时,不传的内容