Android 使用 百度地图 测量 多边形面积
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 使用 百度地图 测量 多边形面积相关推荐
- 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...
Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...
- 百度地图android自定义文字,Android SDK | 百度地图API SDK
什么是百度地图Android SDK? 百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口, 您可以通过该接口实现丰富的LBS功能: 地图:提供地图(2D.3 ...
- Android之百度地图集成
Android之百度地图集成 注册和获取密钥 注册百度账号 注册链接:点击进行百度账号注册 创建应用 1.应用名称 2.应用类型(Android SDK) 3.发布版SHA1(详见:) 4.包名 (A ...
- 基于Android的百度地图开发
参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...
- android百度导航实现,Android 集成百度地图实现设备定位
Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...
- android 百度地图闪退,Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法...
使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.xml文件中未在application标签中配置 android:name="com.baidu.lbsapi.A ...
- Android studio 百度地图SDK之地图定位与运动轨迹绘制
百度地图定位与运动轨迹 Android开发的前期准备 地图图层显示与定位 运动轨迹的简单绘制 Android开发的前期准备 Android配置在百度地图SDK官网上有详细的说明.具体可以参考官网的教程 ...
- Android开发——百度地图定位
Android开发--百度地图定位 项目需求 项目内容 注册和获取秘钥 获取项目SHA1码 获取项目AK码 AS依赖配置 AS源码 AndroidManifest文件 布局文件 DemoApplica ...
- Android 集成百度地图之申请TTS授权最新版
Android 集成百度地图之申请TTS授权最新版. 前提:登录百度地图开放平台,且已创建好应用. 开发文档-Android 导航SDK-TTS授权申请. 这里有个坑,简单说下,进入http://yu ...
- Android studio 百度地图开发(5)查询周边服务(加油站)
Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...
最新文章
- 哈希表(等概率下)平均查找长度(转)
- sphinx.conf listen = 9306:mysql41_Sphinx 安装与使用
- python @staticmethod和@classmethod的作用
- Ajax:一种网页开发技术(Asynchronous Javascript + XML)
- 玩转oracle 11g(14):命令学习2
- 内核页表隔离(Kernel page-table isolation,KPTI,简称PTI,旧称KAISER)
- for in for of区别_这个句型中用介词for还是of?来看看解题技巧
- 华人、华侨、华裔之间究竟有什么区别?
- 【渗透测试实战】PHP语言有哪些后门?以及利用方法
- 19春学期《计算机应用基础》123,福师11春学期《计算机应用基础》在线作业一...
- 中国天然饮料市场趋势报告、技术动态创新及市场预测
- 20201016:力扣第210周周赛题解(下)
- Atitit.人力资源管理原理与概论
- 安装了最新版本的java 用友nc打不开_用友NC系统常见问题解决方法
- java软件工程师自我评价_Java工程师自我评价如何写?
- java JDK的下载与安装 JVM JRE JDK区别
- 2018年泰迪杯心得总结--最全的数学建模、数据挖掘的比赛入门
- 读书笔记:《从生活常识的角度看懂财务报表》
- 关于如何用centos7和阿里云服务器去创建一个网站
- ArcGIS水文分析实战教程(4)地形预处理