Android下如何计算两经纬点之间距离
节选自百度地图API:
若开发者使用的是百度地图或定位API,且版本在1.3.5以后的,
路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。
如果是计算任意两点的距离,自2.0.0版本开始,Android SDK为开发者提供了计算距离的接口(DistanceUtil),具体使用方法如下:
- GeoPoint p1LL = new GeoPoint(39971802, 116347927);
- GeoPoint p2LL = new GeoPoint(39892131, 116498555);
- double distance = DistanceUtil.getDistance(p1LL, p2LL);
GeoPoint p1LL = new GeoPoint(39971802, 116347927); GeoPoint p2LL = new GeoPoint(39892131, 116498555); double distance = DistanceUtil.getDistance(p1LL, p2LL);
若未使用百度地图或定位SDK,或是地图、定位SDK版本在1.3.5以下的,可以选用以下两种计算方式:
一、利用勾股定理计算,适用于两点距离很近的情况;
二、按标准的球面大圆劣弧长度计算,适用于距离较远的情况;
- static double DEF_PI = 3.14159265359; // PI
- static double DEF_2PI = 6.28318530712; // 2*PI
- static double DEF_PI180 = 0.01745329252; // PI/180.0
- static double DEF_R = 6370693.5; // radius of earth
- /**
- * 第一种方式,按勾股定律求结果
- * @param lon1
- * @param lat1
- * @param lon2
- * @param lat2
- * @return
- * @author kazeik.chen QQ:77132995 2014-4-1下午4:30:09
- * TODO kazeik@163.com
- */
- public double GetShortDistance(double lon1, double lat1, double lon2,
- double lat2) {
- double ew1, ns1, ew2, ns2;
- double dx, dy, dew;
- double distance;
- // 角度转换为弧度
- ew1 = lon1 * DEF_PI180;
- ns1 = lat1 * DEF_PI180;
- ew2 = lon2 * DEF_PI180;
- ns2 = lat2 * DEF_PI180;
- // 经度差
- dew = ew1 - ew2;
- // 若跨东经和西经180 度,进行调整
- if (dew > DEF_PI)
- dew = DEF_2PI - dew;
- else if (dew < -DEF_PI)
- dew = DEF_2PI + dew;
- dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
- dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
- // 勾股定理求斜边长
- distance = Math.sqrt(dx * dx + dy * dy);
- return distance;
- }
- /**
- * 第二种方式,按大圆劣弧求距离
- * @param lon1
- * @param lat1
- * @param lon2
- * @param lat2
- * @return
- * @author kazeik.chen QQ:77132995 2014-4-1下午4:30:30
- * TODO kazeik@163.com
- */
- public double GetLongDistance(double lon1, double lat1, double lon2,
- double lat2) {
- double ew1, ns1, ew2, ns2;
- double distance;
- // 角度转换为弧度
- ew1 = lon1 * DEF_PI180;
- ns1 = lat1 * DEF_PI180;
- ew2 = lon2 * DEF_PI180;
- ns2 = lat2 * DEF_PI180;
- // 求大圆劣弧与球心所夹的角(弧度)
- distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)
- * Math.cos(ns2) * Math.cos(ew1 - ew2);
- // 调整到[-1..1]范围内,避免溢出
- if (distance > 1.0)
- distance = 1.0;
- else if (distance < -1.0)
- distance = -1.0;
- // 求大圆劣弧长度
- distance = DEF_R * Math.acos(distance);
- return distance;
- }
- //以下是测试
- double mLat1 = 39.90923; // point1纬度
- double mLon1 = 116.357428; // point1经度
- double mLat2 = 39.90923;// point2纬度
- double mLon2 = 116.397428;// point2经度
- double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);
Android下如何计算两经纬点之间距离的更多相关文章
- java如何计算两个日期之间相差多少天?
java如何计算两个日期之间相差多少天? public static void main(String [] args) { Date now = new Date(); Calendar cal = ...
- java如何计算两个经纬度之间的距离?
/*计算两个经纬度之间的距离 结果单位:米 */public static double getDistance(String lat1Str, String lng1Str, String lat2 ...
- php如何计算两个时间戳之间相差的日时分秒
/功能:计算两个时间戳之间相差的日时分秒//$begin_time 开始时间戳//$end_time 结束时间戳function timediff($begin_time,$end_time){ if ...
- windows server/windows同一系统下建立两个目录之间的映射关系
应用场景,如下: 当两个不同的项目共享同一个资源目录.同一个数据库时,由于两项目根目录不一样,再加上部分项目可能有入口重写规则限制了用户的访问权限. 因此,我们可以利用window 服务器给我们提供的 ...
- 在excel中如何计算两个时间之间的差[转]
因为时间是由序列号所代表的,用户可以用较晚的时间减去较早的时间以得到间隔.例如,单元格A3含有5:30,单元格B3含有14:00,下面的公式返回8:30(间隔8小时30分). =B3-A3 然而,如果 ...
- CentOS 下实现两台服务器之间的共享NFS
NFS的安装配置:centos 5 :yum install nfs-utils portmapcentos 6 :yum install nfs-utils rpcbind yum install ...
- fmt标签如何计算两个日期之间相隔的天数
<h2>start -- ${start}</h2><h2>end -- ${end}</h2><fmt:formatDate var=" ...
- Android下如何计算要显示的字符串所占的宽度和高度
Rect bounds = new Rect(); String text = "Hello World"; TextPaint paint; paint = findViewBy ...
- c#(asp.net) 如何计算两个日期之间相隔天数
1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...
随机推荐
- Spring多种注入方式及注解实现DI
一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...
- Python黑客编程ARP欺骗
Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...
- ASM, AAM
名称 下载网址 am_tools http://www.isbe.man.ac.uk/~bim/software/am_tools_doc/index.html VOSM http://sourcef ...
- 学习SAP HANA SQL
学习SAP HANA SQL 语句(创建 EMP,DEPT,BONUS 和 SALGRADE测试表)--像学Oracle一样学习SAP HANA 标签: sap测试oraclesqltableda ...
- 跟我从零基础学习Unity3D开发--U3d脚本注意事项及两个基本函数的简单介绍
经过上一篇的学习,我相信开发环境您已经搭好了,如果还没有搭好可以百度一下. 今天主要讲的有以下几点: 第一:Unity3D中的C#脚本与.net中的C#写法的区别 1.Unity3D C#脚本不支持命 ...
- 分形之概率学下的green tree
今天做的是分形之随机概率,可以和以前做的那个抛色子的做法非常相似,抛色子是用随机点数控制图形,今天做的树叶图形只是用概率的做法去控制图形而已,做法是如出一辙的: //图形界面 package ...
- 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)
转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍 相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...
- Sublime Text 中文乱码
STEP1: 安装package control tool 先设置好fq,系统代理设置为fq代理 按Crtl + ~调出控制台,输入如下代码: import urllib2,os; pf='Packa ...
- 《CSS权威指南》基础复习+查漏补缺
前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...
- Angular.js内置的63个指令