节选自百度地图API:

若开发者使用的是百度地图或定位API,且版本在1.3.5以后的,

路线规划提供了获取路线距离的方法,见MKRoutePlan 类的 getDistance 方法。

如果是计算任意两点的距离,自2.0.0版本开始,Android SDK为开发者提供了计算距离的接口(DistanceUtil),具体使用方法如下:

  1. GeoPoint p1LL = new GeoPoint(39971802, 116347927);
  2. GeoPoint p2LL = new GeoPoint(39892131, 116498555);
  3. 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以下的,可以选用以下两种计算方式:

一、利用勾股定理计算,适用于两点距离很近的情况;

二、按标准的球面大圆劣弧长度计算,适用于距离较远的情况;

  1. static double DEF_PI = 3.14159265359; // PI
  2. static double DEF_2PI = 6.28318530712; // 2*PI
  3. static double DEF_PI180 = 0.01745329252; // PI/180.0
  4. static double DEF_R = 6370693.5; // radius of earth
  5. /**
  6. * 第一种方式,按勾股定律求结果
  7. * @param lon1
  8. * @param lat1
  9. * @param lon2
  10. * @param lat2
  11. * @return
  12. * @author kazeik.chen QQ:77132995  2014-4-1下午4:30:09
  13. * TODO kazeik@163.com
  14. */
  15. public double GetShortDistance(double lon1, double lat1, double lon2,
  16. double lat2) {
  17. double ew1, ns1, ew2, ns2;
  18. double dx, dy, dew;
  19. double distance;
  20. // 角度转换为弧度
  21. ew1 = lon1 * DEF_PI180;
  22. ns1 = lat1 * DEF_PI180;
  23. ew2 = lon2 * DEF_PI180;
  24. ns2 = lat2 * DEF_PI180;
  25. // 经度差
  26. dew = ew1 - ew2;
  27. // 若跨东经和西经180 度,进行调整
  28. if (dew > DEF_PI)
  29. dew = DEF_2PI - dew;
  30. else if (dew < -DEF_PI)
  31. dew = DEF_2PI + dew;
  32. dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
  33. dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
  34. // 勾股定理求斜边长
  35. distance = Math.sqrt(dx * dx + dy * dy);
  36. return distance;
  37. }
  38. /**
  39. * 第二种方式,按大圆劣弧求距离
  40. * @param lon1
  41. * @param lat1
  42. * @param lon2
  43. * @param lat2
  44. * @return
  45. * @author kazeik.chen QQ:77132995  2014-4-1下午4:30:30
  46. * TODO kazeik@163.com
  47. */
  48. public double GetLongDistance(double lon1, double lat1, double lon2,
  49. double lat2) {
  50. double ew1, ns1, ew2, ns2;
  51. double distance;
  52. // 角度转换为弧度
  53. ew1 = lon1 * DEF_PI180;
  54. ns1 = lat1 * DEF_PI180;
  55. ew2 = lon2 * DEF_PI180;
  56. ns2 = lat2 * DEF_PI180;
  57. // 求大圆劣弧与球心所夹的角(弧度)
  58. distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)
  59. * Math.cos(ns2) * Math.cos(ew1 - ew2);
  60. // 调整到[-1..1]范围内,避免溢出
  61. if (distance > 1.0)
  62. distance = 1.0;
  63. else if (distance < -1.0)
  64. distance = -1.0;
  65. // 求大圆劣弧长度
  66. distance = DEF_R * Math.acos(distance);
  67. return distance;
  68. }
  69. //以下是测试
  70. double mLat1 = 39.90923; // point1纬度
  71. double mLon1 = 116.357428; // point1经度
  72. double mLat2 = 39.90923;// point2纬度
  73. double mLon2 = 116.397428;// point2经度
  74. double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);

Android下如何计算两经纬点之间距离的更多相关文章

  1. java如何计算两个日期之间相差多少天?

    java如何计算两个日期之间相差多少天? public static void main(String [] args) { Date now = new Date(); Calendar cal = ...

  2. java如何计算两个经纬度之间的距离?

    /*计算两个经纬度之间的距离 结果单位:米 */public static double getDistance(String lat1Str, String lng1Str, String lat2 ...

  3. php如何计算两个时间戳之间相差的日时分秒

    /功能:计算两个时间戳之间相差的日时分秒//$begin_time 开始时间戳//$end_time 结束时间戳function timediff($begin_time,$end_time){ if ...

  4. windows server/windows同一系统下建立两个目录之间的映射关系

    应用场景,如下: 当两个不同的项目共享同一个资源目录.同一个数据库时,由于两项目根目录不一样,再加上部分项目可能有入口重写规则限制了用户的访问权限. 因此,我们可以利用window 服务器给我们提供的 ...

  5. 在excel中如何计算两个时间之间的差[转]

    因为时间是由序列号所代表的,用户可以用较晚的时间减去较早的时间以得到间隔.例如,单元格A3含有5:30,单元格B3含有14:00,下面的公式返回8:30(间隔8小时30分). =B3-A3 然而,如果 ...

  6. CentOS 下实现两台服务器之间的共享NFS

    NFS的安装配置:centos 5 :yum install nfs-utils portmapcentos 6 :yum install nfs-utils rpcbind yum install ...

  7. fmt标签如何计算两个日期之间相隔的天数

    <h2>start -- ${start}</h2><h2>end -- ${end}</h2><fmt:formatDate var=" ...

  8. Android下如何计算要显示的字符串所占的宽度和高度

    Rect bounds = new Rect(); String text = "Hello World"; TextPaint paint; paint = findViewBy ...

  9. c#(asp.net) 如何计算两个日期之间相隔天数

    1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("200 ...

随机推荐

  1. POJ2167Irrelevant Elements[唯一分解定理 组合数 杨辉三角]

    Irrelevant Elements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2407   Accepted: 59 ...

  2. 当Python在appium中使用if……else语句不好使怎么办

    前几天写自动化脚本的时候,有个地方需要用if--else判断获得的ID和name是哪个,从而决定点击哪个按钮,我用if--else去判断,可是总是提示我找不到对应的元素, 在网上爬了好久,最终终于找到 ...

  3. Linux操作系统启动流程梳理

    接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下 ...

  4. WPF Popup 控件导致被遮挡内容不刷新的原因

    WPF Popup 控件导致被遮挡内容不刷新的原因 周银辉 今天在写一个WPF控件时用到了Popup控件,很郁闷的情况是:当popup关闭时,原来被popup挡住的界面部分不刷新,非要手动刷新一下(比 ...

  5. IO(四)----对象的序列化

    对象的序列化:   将内存中的对象直接写入到文件设备中. 对象的反序列化: 将文件设备中持久化的数据转换为内存对象. 自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行 ...

  6. EF7 使用 K EF 异常

    在使用EF 7 Code first功能时. k ef 报如下错误: 解决办法: 在project.json 同级目录下新建k.cmd,内容如下: "%~dp0approot\runtime ...

  7. 测试工作的疑难杂症bugs

    一. 平台:安卓app 代码:重写onresume事件时,没有重新获取sessionId导致记录一下bug重现过程:1.登陆2.退出用户(不退出app)3.重新登录4.home键或者息屏5.再进入ap ...

  8. 使用CocoaPods开发并打包静态库

    Cocoapods作为OS X和iOS开发平台的类库管理工具,已经非常完善和强大.通常我们用pod来管理第三方开源类库,但我们也极有可能会开发一个用pod管理依赖关系的静态类库给其他人使用,而又不愿意 ...

  9. 关于Deprecated: mysql_result: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

    require_once('connect.php'); $sql = "select * from introduce"; \(query = mysql_query(\)sql ...

  10. Android只能动态注册的广播Action

    只能动态注册的广播(部分): android.intent.action.SCREEN_ON android.intent.action.SCREEN_OFF android.intent.actio ...