btn_clear = (Button)findViewById(R.id.btn_clear);
btn_jisuan = (Button)findViewById(R.id.btn_jisuan);
// 地图初始化
mMapView = (MapView) findViewById(R.id.mapView);
mBaiduMap = mMapView.getMap();
//地图单击事件监听
mBaiduMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublic boolean onMapPoiClick(MapPoi arg0) {return false;}@Overridepublic void onMapClick(final LatLng latLng) {//获取经纬度  latitude = latLng.latitude;  longitude = latLng.longitude; // 定义Maker坐标点  LatLng point = new LatLng(latitude, longitude);  MarkerOptions options = new MarkerOptions().position(point).icon(icon_muasure); pts.add(latLng);// 在地图上添加Marker,并显示  mBaiduMap.addOverlay(options);}});//计算按钮点击事件
btn_jisuan.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String area = getArea(pts);//在地图上添加文字OverlayOptions ooText = new TextOptions().bgColor(0xAAFFFF00).fontSize(48).fontColor(0xFFFF00FF).text("面积:" + area + " m²").position(pts.get(0));mBaiduMap.addOverlay(ooText);}
});
//清除按钮点击事件
btn_jisuan.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {pts.clear();mBaiduMap.clear();}
});/*** 计算多边形面积* @return */protected String getArea(List<LatLng> pts) {double totalArea = 0;// 初始化总面积double LowX = 0.0; double LowY = 0.0; double MiddleX = 0.0;double MiddleY = 0.0;double HighX = 0.0;double HighY = 0.0;double AM = 0.0;double BM = 0.0;double CM = 0.0;double AL = 0.0;double BL = 0.0;double CL = 0.0;double AH = 0.0;double BH = 0.0;double CH = 0.0;double CoefficientL = 0.0;double CoefficientH = 0.0;double ALtangent = 0.0;double BLtangent = 0.0;double CLtangent = 0.0;double AHtangent = 0.0;double BHtangent = 0.0;double CHtangent = 0.0;double ANormalLine = 0.0;double BNormalLine = 0.0;double CNormalLine = 0.0;double OrientationValue = 0.0;double AngleCos = 0.0;double Sum1 = 0.0;double Sum2 = 0.0;double Count2 = 0;double Count1 = 0;double Sum = 0.0;double Radius = 6378137.0;// WGS84椭球半径int Count = pts.size();//最少3个点if (Count  < 3) {return;}for ( int i = 0; i < Count; i++) {if (i == 0) {LowX = pts.get(Count - 1).longitude * Math.PI / 180;LowY = pts.get(Count - 1).latitude * Math.PI / 180;MiddleX = pts.get(0).longitude * Math.PI / 180;MiddleY = pts.get(0).latitude * Math.PI / 180;HighX = pts.get(1).longitude * Math.PI / 180;HighY = pts.get(1).latitude * Math.PI / 180;} else if (i == Count - 1) {LowX = pts.get(Count - 2).longitude * Math.PI / 180;LowY = pts.get(Count - 2).latitude * Math.PI / 180;MiddleX = pts.get(Count - 1).longitude * Math.PI / 180;MiddleY = pts.get(Count - 1).latitude * Math.PI / 180;HighX = pts.get(0).longitude * Math.PI / 180;HighY = pts.get(0).latitude * Math.PI / 180;} else {LowX = pts.get(i - 1).longitude * Math.PI / 180;LowY = pts.get(i - 1).latitude * Math.PI / 180;MiddleX = pts.get(i).longitude * Math.PI / 180;MiddleY = pts.get(i).latitude * Math.PI / 180;HighX = pts.get(i + 1).longitude * Math.PI / 180;HighY = pts.get(i + 1).latitude * 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;elseOrientationValue = CNormalLine / CM;if (OrientationValue > 0) {Sum1 += AngleCos;Count1++;} else {Sum2 += AngleCos;Count2++;}}double 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;elseSum = tempSum2;} else {if ((tempSum2 - (Count - 2) * Math.PI) < 1)Sum = tempSum2;elseSum = tempSum1;}totalArea = (Sum - (Count - 2) * Math.PI) * Radius * Radius;return String.valueOf(Math.floor(totalArea)); // 返回总面积}

效果图:

注:这个算法偶尔会有 面积为负值 的情况出现,暂未解决

参考文章:http://blog.csdn.net/chenguang79/article/details/40506469

Android 使用 百度地图 测量 多边形面积相关推荐

  1. 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...

    Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...

  2. 百度地图android自定义文字,Android SDK | 百度地图API SDK

    什么是百度地图Android SDK? 百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口, 您可以通过该接口实现丰富的LBS功能: 地图:提供地图(2D.3 ...

  3. Android之百度地图集成

    Android之百度地图集成 注册和获取密钥 注册百度账号 注册链接:点击进行百度账号注册 创建应用 1.应用名称 2.应用类型(Android SDK) 3.发布版SHA1(详见:) 4.包名 (A ...

  4. 基于Android的百度地图开发

    参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...

  5. android百度导航实现,Android 集成百度地图实现设备定位

    Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...

  6. android 百度地图闪退,Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法...

    使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.xml文件中未在application标签中配置 android:name="com.baidu.lbsapi.A ...

  7. Android studio 百度地图SDK之地图定位与运动轨迹绘制

    百度地图定位与运动轨迹 Android开发的前期准备 地图图层显示与定位 运动轨迹的简单绘制 Android开发的前期准备 Android配置在百度地图SDK官网上有详细的说明.具体可以参考官网的教程 ...

  8. Android开发——百度地图定位

    Android开发--百度地图定位 项目需求 项目内容 注册和获取秘钥 获取项目SHA1码 获取项目AK码 AS依赖配置 AS源码 AndroidManifest文件 布局文件 DemoApplica ...

  9. Android 集成百度地图之申请TTS授权最新版

    Android 集成百度地图之申请TTS授权最新版. 前提:登录百度地图开放平台,且已创建好应用. 开发文档-Android 导航SDK-TTS授权申请. 这里有个坑,简单说下,进入http://yu ...

  10. Android studio 百度地图开发(5)查询周边服务(加油站)

    Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...

最新文章

  1. 哈希表(等概率下)平均查找长度(转)
  2. sphinx.conf listen = 9306:mysql41_Sphinx 安装与使用
  3. python @staticmethod和@classmethod的作用
  4. Ajax:一种网页开发技术(Asynchronous Javascript + XML)
  5. 玩转oracle 11g(14):命令学习2
  6. 内核页表隔离(Kernel page-table isolation,KPTI,简称PTI,旧称KAISER)
  7. for in for of区别_这个句型中用介词for还是of?来看看解题技巧
  8. 华人、华侨、华裔之间究竟有什么区别?
  9. 【渗透测试实战】PHP语言有哪些后门?以及利用方法
  10. 19春学期《计算机应用基础》123,福师11春学期《计算机应用基础》在线作业一...
  11. 中国天然饮料市场趋势报告、技术动态创新及市场预测
  12. 20201016:力扣第210周周赛题解(下)
  13. Atitit.人力资源管理原理与概论
  14. 安装了最新版本的java 用友nc打不开_用友NC系统常见问题解决方法
  15. java软件工程师自我评价_Java工程师自我评价如何写?
  16. java JDK的下载与安装 JVM JRE JDK区别
  17. 2018年泰迪杯心得总结--最全的数学建模、数据挖掘的比赛入门
  18. 读书笔记:《从生活常识的角度看懂财务报表》
  19. 关于如何用centos7和阿里云服务器去创建一个网站
  20. ArcGIS水文分析实战教程(4)地形预处理

热门文章

  1. python operator用法,Python operator.eq()函数与示例
  2. 新手入门吉他买什么好?十年吉他老司机教你如何远离烧火棍,附上靠谱吉他品牌推荐!
  3. Sql中 update select结合更新
  4. 程序员,你准备好回家过年了吗?
  5. 【运营】产品推广计划书
  6. 对于超前,滞后,超前滞后使用范围
  7. 贝尔维尤游戏巨头融资2亿美元!
  8. Nginx-反向代理
  9. ubuntu 18.04快捷显示桌面
  10. 骨骼动画详解-Spine