高德地图计算两坐标之间距离

article/2025/9/18 15:17:27

  • 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 ;  

http://chatgpt.dhexx.cn/article/HSmrQaXt.shtml

相关文章

google地图测距原码

http://hi.baidu.com/shirdrn/blog/item/a7204afc716641fbfc037f85.html Google Maps自带实例多点测距尺实现的功能就是可以根据用户标出的任意多点&#xff0c;从而返回计算得到的各个点之间的距离。也就是说&#xff0c;计算出了一条折线的长度——是在地理上的实际距离。 实…

ArcGIS API For Javascript 4.15 绘制地图:在地图上测距离、测面积和在不同图层上搜索

1、HTML 页面 ## index.html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>第七讲-小部件</tit…

百度离线地图示例之二:测距

前言介绍&#xff1a; 主要是基于v3.0的API版本进行的离线&#xff0c;纯内网可操作&#xff0c;基本上实现了现有90%以上的功能点&#xff0c;能兼容jpg和png格式的瓦片图层&#xff0c;实现了原生和基于Vue两个版本&#xff08;包含常用的55个示例&#xff09;&#xff0c;文…

距离测度

欧氏距离测度&#xff08;EuclideanDistanceMeasure&#xff09; 也称欧几里得距离&#xff0c;在一个N维度的空间里&#xff0c;求两个点的距离&#xff0c;这个距离肯定是一个大于等于零的数字&#xff0c;那么这个距离需要用两个点在各自维度上的坐标相减&#xff0c;平方后…

测量地图距离

1&#xff1a;首先新建矢量图层&#xff0c;用来显示坐标点等&#xff1a; lineLayer new SuperMap.Layer.Vector(“lineLayer”); polygonLayer newSuperMap.Layer.Vector(“polygonLayer”); Jia_markers new SuperMap.Layer.Markers(“Jia_markers”); 然后设置一下图层…

高德地图(第二篇)测量距离小工具

实现如下图一样的小工具 操作说明&#xff1a; 1.在地图上长按选点&#xff0c;第一个点添加起点marker,底部导航点为红色表示正在编辑 2.连续选点会弹出气泡计算总距离&#xff0c;底部导航点为红色表示正在编辑 3.点击气泡内垃圾桶会删除当前点,回退到上次内容. 4.点击红…

谷歌地图怎么测距

您可以使用“距离测量工具”轻松计算从 Google 地图上的一个地点到另一地点的距离。 要完成此操作&#xff0c;请执行以下步骤&#xff1a; 访问 maps.google.com。 点击左侧面板底部的 Google 地图实验室链接。 启用距离测量工具。 点击保存更改。 点击地图左下角…

GIS 测距离操作

开发工具与关键技术: SuperMap iDesktop 9D GIS 作者:杨泽平 撰写时间:2020、5、20GIS测距离是通过调用发布在isever服务器上的地图进行的基础操作,他主要是根据地图比例尺在地图中取一个点绘制一条线再通过计算得出他的实际距离,这主要方便得出两地之间的实际距离。 详细…

Win11安装及部署hexo

1、 在本地安装hexo框架 1.1 安装git 下载链接&#xff1a;Git - Downloads (git-scm.com) 安装教程&#xff1a;Git 安装配置 | 菜鸟教程 (runoob.com) 1.2 安装Nodejs 下载链接&#xff1a;下载 | Node.js 中文网 (nodejs.cn) 安装教程&#xff1a;Node.js 安装配置 | …

win10 mbr下装linux,(MBR模式)Win10下安装Ubuntu18.04双系统

1.制作U盘启动工具。 2.删除一个磁盘&#xff0c;不格式化(我删除了200G的磁盘)。 3.启动电脑&#xff0c;按F12进入启动选项&#xff0c;选择U盘启动&#xff0c;安装Ubuntu18.04系统。 4.进入启动界面&#xff0c;选择try ubuntu试用&#xff0c;不要选择立即安装。因为试用时…

win10安装torch

最近由于搞风格迁移&#xff0c;于是去https://github.com/FlyingGoblin/CartoonGAN下载了工程&#xff0c;结果一看&#xff0c;需要安装torch 从作者提供的链接https://github.com/torch/distro进去 把工程clone下来&#xff0c;我放到了D:\torch&#xff0c; 同时注意到在wi…

win2008服务器虚拟内存设置,电脑虚拟内存设置(Win 7/8/10、Windows Server 2003 - 2019)...

一般来说&#xff0c;个人电脑不用设置虚拟内存&#xff0c;现在内存都比较大(一般的 4G、稍微好点的 8G&#xff0c;更好的 16G以上)&#xff0c;这么高的内存已经足够使用。服务器不一样&#xff0c;一方面服务器会随着内存的升高&#xff0c;价格明显升高&#xff1b;另一方…

win10 jungo windriver

目录 前言 1、安装windriver 1.1、disable Secure Boot 1.2、digital driver signing enforcement 2、FPGA 逻辑下载及PCIE驱动安装 2、PCIE PIO通信测试 3、PCIE DMA通信测试 3.1、vs打开BMD工程 3.2、流程演示 3.3、VS2015 PCIE DMA驱动调试程序 3.4、DMA板卡测试…

win10 安装 Phoenix

文章目录 一、前置要求二、安装 Phoenix 一、前置要求 需要 Erlang 18 或更高版本需要 Elixir 1.5 或更高版本需要 Node.js 5.0.0 或更高版本 注意&#xff1a;Phoenix 默认使用 PostgreSQL 作为数据库 &#xff0c;可以在创建新应用时通过参数 --database mysql 来切换到 MyS…

运行win7计算机需要多长时间,WIN7电脑运行太慢怎么解决

windows系统使用时间越长,系统越臃肿,速度也越来越慢&#xff0c;那么WIN7电脑运行太慢怎么解决呢?今天学习啦小编与大家分享下解决WIN7电脑运行太慢的具体操作步骤&#xff0c;有需要的朋友不妨了解下。 WIN7电脑运行太慢解决方法一 win7系统运行太慢一般有以下几个原因&…

win7硬件要求_九代酷睿平台装Win7的方法!2019年九代i5-9400F配B365装机配置单

九代酷睿平台可以装win7吗?理论上九代平台的主板都是不能安装Win7系统的,当然有九代酷睿平台装Win7的方法,不过需要特定的主板可以安装的,就在近期intel发布了B365主板,支持Win7系统,不过需要搭载独立显卡才可以支持,支持核显装机平台。下面装机之家分享一套针对2019年的…

win10安装Ubuntu16.04

第一次安装双系统&#xff0c;踩了不少坑&#xff0c;花了两三天才装好&#xff0c;因为电脑的不同&#xff08;本人电脑联想小新i5&#xff09;&#xff0c;网上那些安装过程有些不适用&#xff0c;所以花了好长时间&#xff0c;甚至差点决定去重装系统了&#xff0c;为了以后…

HD2500显卡驱动linux,Intel发布HD Graphics 2500/4000显卡Win10驱动下载

IT之家讯 Intel发布了用于第三代CPU核心显卡HD Graphics 2500/4000的新版Win7/Win8.1/Win10驱动程序&#xff0c;版本号为15.33.39.4276&#xff0c;本次更新最大特点就是加入了对Win10的支持。但需要注意的是&#xff0c;Windows10系统安装该驱动过程中会提示“驱动程序未签名…

华硕u4000u 重装window7 重装win7 重装window10 重装win10 重装系统 戴尔 联想 鸿基 重装系统远程协助

很多人都会遇到华硕U4000或者U4000&#xff0c;window10降级成window7&#xff0c;各种ghost原版镜像都无法安装的问题。 下面就是解决步骤。 可以先参考博客&#xff1a;https://blog.csdn.net/jessical1020/article/details/64906925 boot设置 1&#xff0e;F2进入boot&a…

福利来了!手把手教你Python爬取女神套图

疲惫的生活里总要有些温柔梦想吧 目标URL&#xff1a;http://www.win4000.com/meinvtag4_1.html 爬取美桌网某个标签下的美女壁纸&#xff0c;点进详情页可以发现&#xff0c;里面是一组套图 一、网页分析 翻页查看 URL 变化规律&#xff1a; http://www.win4000.com/meinvt…