转载自:http://blog.csdn.net/jianggujin/article/details/72833711 如要转载请写明原创地址

  • Java实现
  • Javascript实现
  • MySQL实现

最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了相关计算方法,供大家参考。

Java实现

首先定义一个用于存储经纬度的类,这里起个名字叫:LngLat

package amap;import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;/*** 存储经纬度坐标值的类,单位角度* * @author jianggujin**/
public final class LngLat implements Cloneable
{/*** 纬度 (垂直方向)*/public final double latitude;/*** 经度 (水平方向)*/public final double longitude;/*** 格式化*/private static DecimalFormat format = new DecimalFormat("0.000000", new DecimalFormatSymbols(Locale.US));/*** 使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点。* * @param longitude*           地点的经度,在-180 与180 之间的double 型数值。* @param latitude*           地点的纬度,在-90 与90 之间的double 型数值。*/public LngLat(double longitude, double latitude){this(longitude, latitude, true);}/*** 使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点* * @param longitude*           地点的经度,在-180 与180 之间的double 型数值。* * @param latitude*           地点的纬度,在-90 与90 之间的double 型数值。* @param isCheck*           是否需要检查经纬度的合理性,建议填写true*/public LngLat(double longitude, double latitude, boolean isCheck){if (isCheck){if ((-180.0D <= longitude) && (longitude < 180.0D))this.longitude = parse(longitude);else{throw new IllegalArgumentException("the longitude range [-180, 180].");// this.longitude = parse(((longitude - 180.0D) % 360.0D + 360.0D) %// 360.0D - 180.0D);}if ((latitude < -90.0D) || (latitude > 90.0D)){throw new IllegalArgumentException("the latitude range [-90, 90].");}this.latitude = latitude;// this.latitude = parse(Math.max(-90.0D, Math.min(90.0D, latitude)));}else{this.latitude = latitude;this.longitude = longitude;}}/*** 解析* * @param d* @return*/private static double parse(double d){return Double.parseDouble(format.format(d));}public LngLat clone(){return new LngLat(this.latitude, this.longitude);}@Overridepublic int hashCode(){final int prime = 31;int result = 1;long temp;temp = Double.doubleToLongBits(latitude);result = prime * result + (int) (temp ^ (temp >>> 32));temp = Double.doubleToLongBits(longitude);result = prime * result + (int) (temp ^ (temp >>> 32));return result;}@Overridepublic boolean equals(Object obj){if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;LngLat other = (LngLat) obj;if (Double.doubleToLongBits(latitude) != Double.doubleToLongBits(other.latitude))return false;if (Double.doubleToLongBits(longitude) != Double.doubleToLongBits(other.longitude))return false;return true;}public String toString(){return "lat/lng: (" + this.latitude + "," + this.longitude + ")";}
}

计算工具类如下:

package amap;/*** 高德地图工具* * @author jianggujin**/
public class AMapUtils
{/*** 根据用户的起点和终点经纬度计算两点间距离,此距离为相对较短的距离,单位米。* * @param start*           起点的坐标* @param end*           终点的坐标* @return*/public static double calculateLineDistance(LngLat start, LngLat end){if ((start == null) || (end == null)){throw new IllegalArgumentException("非法坐标值,不能为null");}double d1 = 0.01745329251994329D;double d2 = start.longitude;double d3 = start.latitude;double d4 = end.longitude;double d5 = end.latitude;d2 *= d1;d3 *= d1;d4 *= d1;d5 *= d1;double d6 = Math.sin(d2);double d7 = Math.sin(d3);double d8 = Math.cos(d2);double d9 = Math.cos(d3);double d10 = Math.sin(d4);double d11 = Math.sin(d5);double d12 = Math.cos(d4);double d13 = Math.cos(d5);double[] arrayOfDouble1 = new double[3];double[] arrayOfDouble2 = new double[3];arrayOfDouble1[0] = (d9 * d8);arrayOfDouble1[1] = (d9 * d6);arrayOfDouble1[2] = d7;arrayOfDouble2[0] = (d13 * d12);arrayOfDouble2[1] = (d13 * d10);arrayOfDouble2[2] = d11;double d14 = Math.sqrt((arrayOfDouble1[0] - arrayOfDouble2[0]) * (arrayOfDouble1[0] - arrayOfDouble2[0])+ (arrayOfDouble1[1] - arrayOfDouble2[1]) * (arrayOfDouble1[1] - arrayOfDouble2[1])+ (arrayOfDouble1[2] - arrayOfDouble2[2]) * (arrayOfDouble1[2] - arrayOfDouble2[2]));return (Math.asin(d14 / 2.0D) * 12742001.579854401D);}
}

最后边写一段测试代码测试一下:

package test;import org.junit.Test;import amap.AMapUtils;
import amap.LngLat;public class AMapTest
{@Testpublic void Test(){LngLat start = new LngLat(116.368904, 39.923423);LngLat end = new LngLat(116.387271, 39.922501);System.err.println(AMapUtils.calculateLineDistance(start, end));}
}

运行结果为:1569.6213922679392,官网的javascript API示例结果如图:

结果虽然有一点误差,但是这hi在可接受范围内的。

Javascript实现

同样的算法,将其转换成JS的写法,完整的代码如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title></title><script type="text/javascript" src="js/ajax.js"></script><script>/*** 存储经纬度* @param {Object} longitude* @param {Object} latitude*/function LngLat(longitude, latitude) {this.longitude = longitude;this.latitude = latitude;}function calculateLineDistance(start, end) {var d1 = 0.01745329251994329;var d2 = start.longitude;var d3 = start.latitude;var d4 = end.longitude;var d5 = end.latitude;d2 *= d1;d3 *= d1;d4 *= d1;d5 *= d1;var d6 = Math.sin(d2);var d7 = Math.sin(d3);var d8 = Math.cos(d2);var d9 = Math.cos(d3);var d10 = Math.sin(d4);var d11 = Math.sin(d5);var d12 = Math.cos(d4);var d13 = Math.cos(d5);var arrayOfDouble1 = [];var arrayOfDouble2 = [];arrayOfDouble1.push(d9 * d8);arrayOfDouble1.push(d9 * d6);arrayOfDouble1.push(d7);arrayOfDouble2.push(d13 * d12);arrayOfDouble2.push(d13 * d10);arrayOfDouble2.push(d11);var d14 = Math.sqrt((arrayOfDouble1[0] - arrayOfDouble2[0]) * (arrayOfDouble1[0] - arrayOfDouble2[0]) +(arrayOfDouble1[1] - arrayOfDouble2[1]) * (arrayOfDouble1[1] - arrayOfDouble2[1]) +(arrayOfDouble1[2] - arrayOfDouble2[2]) * (arrayOfDouble1[2] - arrayOfDouble2[2]));return(Math.asin(d14 / 2.0) * 12742001.579854401);}var start = new LngLat(116.368904, 39.923423);var end = new LngLat(116.387271, 39.922501);</script></head><body><script>document.write(calculateLineDistance(start, end));</script></body>
</html>

MySQL实现

DELIMITER $$
CREATE FUNCTION `calculateLineDistance`(startLng double, startLat double, endLng double, endLat double) RETURNS double
BEGIN
declare d2 DOUBLE;
declare d3 DOUBLE;
declare d4 DOUBLE;
declare d5 DOUBLE;
declare d6 DOUBLE;
declare d7 DOUBLE;
declare d8 DOUBLE;
declare d9 DOUBLE;
declare d10 DOUBLE;
declare d11 DOUBLE;
declare d12 DOUBLE;
declare d13 DOUBLE;
declare d14 DOUBLE;
declare arrayOfDouble10 DOUBLE;
declare arrayOfDouble11 DOUBLE;
declare arrayOfDouble12 DOUBLe;
declare arrayOfDouble20 DOUBLE;
declare arrayOfDouble21 DOUBLE;
declare arrayOfDouble22 DOUBLE;
set d2 = startLng * 0.01745329251994329;
set d3 = startLat * 0.01745329251994329;
set d4 = endLng * 0.01745329251994329;
set d5 = endLat * 0.01745329251994329;
set d6 = sin(d2);
set d7 = sin(d3);
set d8 = cos(d2);
set d9 = cos(d3);
set d10 = sin(d4);
set d11 = sin(d5);
set d12 = cos(d4);
set d13 = cos(d5);
set arrayOfDouble10 = (d9 * d8);
set arrayOfDouble11 = (d9 * d6);
set arrayOfDouble12 = d7;
set arrayOfDouble20 = (d13 * d12);
set arrayOfDouble21 = (d13 * d10);
set arrayOfDouble22 = d11;
set d14 = sqrt((arrayOfDouble10 - arrayOfDouble20) * (arrayOfDouble10 - arrayOfDouble20)+ (arrayOfDouble11 - arrayOfDouble21) * (arrayOfDouble11 - arrayOfDouble21)+ (arrayOfDouble12 - arrayOfDouble22) * (arrayOfDouble12 - arrayOfDouble22));
return (asin(d14 / 2.0) * 12742001.579854401);
END $$
DELIMITER ;  

高德地图计算两坐标之间距离相关推荐

  1. php高德地图计算距离接口,高德地图计算两坐标之间距离

    最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了相关计算方法,供大家参 ...

  2. 高德地图获取坐标距离_利用java、js或mysql计算高德地图中两坐标之间的距离

    前言 因为工作的原因,最近在做与地图相关的应用,使用了高德地图,研究了下高德地图计算两坐标距离的方法,官网上提供的开发包中有相关的方法,但是我的产品中比较特殊,无法直接使用提供的方法,所以就自己封装了 ...

  3. JAVA利用数组求两点距离_利用java、js或mysql计算高德地图中两坐标之间的距离

    利用java.js或mysql计算高德地图中两坐标之间的距离 2019-09-19 编程之家收集整理的这篇文章主要介绍了利用java.js或mysql计算高德地图中两坐标之间的距离,编程之家小编觉得挺 ...

  4. Java对接高德地图计算距离_高德地图计算两点之间的距离java+html

    高德地图现在使用比较多了,但是高德地图计算两点之间的距离有些问题.下面提供一个很好的解决方案. 代码如下: /** * 两点的经纬度获取两点距离米 * @param (121.293986,37.27 ...

  5. JS高德地图计算两地之间的实际距离

    这个是通过导航的方式来获取两地之间的实际距离,和消耗的时间(key值自己去申请哈) <!doctype html> <html> <head><meta ch ...

  6. Java-高德地图根据经纬度计算两坐标之间的直线距离

    Java-高德地图根据经纬度计算两坐标之间的直线距离 最近在做毕设项目,项目打卡需要用到高德地图,看了下高德地图计算两坐标距离的方法,官网上提供的开发包中也有相关的方法. /**** @author ...

  7. php地图距离计算,php百度地图计算两地现实距离

    请自行到百度地图官网申请您的ak <!--前端获取手机经纬度的代码--> <!--<!DOCTYPE html>--> <!--<html lang=& ...

  8. android 百度地图两点之间的距离计算,Android 百度地图 计算两点之间的距离

    注:Location类为自定义的实体类,里面包含latitude和longitude两个属性(Double类型) /** * 计算两点之间距离 * @param start * @param end ...

  9. 百度地图php现实距离,百度地图计算两地现实距离

    请自行到百度地图官网申请您的ak /** * 计算两个地址之间的距离,单位:米 * 地址要尽量详细,减小误差 * @param address * @param $param * @return $p ...

最新文章

  1. 通往安全自动驾驶汽车的艰难道路
  2. 多多客DOODOOKE更新插件模块及下载附件教程
  3. SAP中有关差异的一些概念
  4. nodejs png 转 rgb_90行代码,让微信登录界面的地球转起来
  5. 嵌入式编程与c语言有何区别,有的嵌入式设备也提供C++编译器,那还有理由坚持使用C语言吗?...
  6. 电子书下载:Silverlight 5 in Action
  7. php调用另一个php文件里的变量的值,thinkphp中一个方法调用另一个步骤的变量
  8. 【转】WEB前端调优
  9. python抖音github_使用 Python 下载抖音无水印视频
  10. SMTP连接器的使用
  11. js 和 css动画
  12. 简单html倒计时器代码,js简单倒计时实现代码
  13. 装IDT声卡时总是说检测到的硬件不受此IDT软件程序包支持安装将终止
  14. js基础-点击切换div背景颜色
  15. 免费:轻松实现在微信中直接下载APK
  16. 计算机中的windows任务管理器在哪,window任务管理器在哪,windows7如何重装
  17. 经验贴: 如何选购相机, 电脑, 手机, 电脑配件?
  18. 英语 语义分割_语义分割细度的文化成因与英语词语搭配
  19. 【微服务架构 - 04 - Nexus】01 基于 Docker 安装 Nexus
  20. 【前端学习】Day-16 JS基础、循环、函数、数组、字符串、字典

热门文章

  1. Swift之枚举enum的语法和功能
  2. 很傻计算机的英语,用英语表达笨蛋,除了Stupid,还有其他的表达
  3. 【元宇宙欧米说】众神时代——游戏与区块链结合,重构游戏产业新面貌
  4. Xss Bypass备忘录
  5. 用海信电视后面的同轴输出(母)可以接老功放的两个莲花头(母)吗?
  6. 如何进入UI设计行业 相关学习路线是什么
  7. 解决iOS版抖音破解重签名后无法安装
  8. WIN7 添加本地打印机为灰色怎么办
  9. 尝试Windows桌面平台开发
  10. Python输出斐波那契数列【递归、迭代】