百度地图中多边形覆盖物的面积计算
2016-06-14 09:37
561 查看
面积计算原理
参考古人的定理:球面多边形计算面积的关键在于计算多边形所有角的度数,对于球面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);
如图所示:
相关文章推荐
- C#开发Android百度地图手机应用程序(多地图展示)
- 百度地图给map添加右键菜单(判断是否为marker)
- 基于OL2实现百度地图ABCD marker的效果
- JS中引用百度地图并将百度地图的logo和信息去掉
- js调用百度地图及调用百度地图的搜索功能
- 基于Arcgis for javascript实现百度地图ABCD marker的效果
- 百度地图API提示230 错误app scode码校验失败的解决办法
- 微信企业号开发之微信考勤百度地图定位
- 百度地图自定义控件分享
- 基于Android实现百度地图定位过程详解
- Android百度地图应用之创建显示地图
- Android SDK 百度地图通过poi城市内检索简介接口的使用
- Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡
- 如何调用百度地图API实现手机自动定位
- Android百度定位导航之基于百度地图移动获取位置和自动定位
- Android百度地图poi范围搜索
- Android 百度地图POI搜索功能实例代码
- 百度地图API使用方法详解
- javascript实现百度地图鼠标滑动事件显示、隐藏
- 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)