搜索
首页Javajava教程Java+js或mysql计算高德地图中两坐标之间的距离

最近因为工作的需求,需要计算出高德地图中两个坐标的距离,通过查找相关资料发现了多种实现的方法,下面这篇文章主要给大家介绍了关于利用java、js或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);
 }

 @Override
 public 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;
 }

 @Override
 public 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
{
 @Test
 public 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 ;

总结

以上是Java+js或mysql计算高德地图中两坐标之间的距离的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java平台是否独立,如果如何?Java平台是否独立,如果如何?May 09, 2025 am 12:11 AM

Java是平台独立的,因为其"一次编写,到处运行"的设计理念,依赖于Java虚拟机(JVM)和字节码。1)Java代码编译成字节码,由JVM解释或即时编译在本地运行。2)需要注意库依赖、性能差异和环境配置。3)使用标准库、跨平台测试和版本管理是确保平台独立性的最佳实践。

关于Java平台独立性的真相:真的那么简单吗?关于Java平台独立性的真相:真的那么简单吗?May 09, 2025 am 12:10 AM

Java'splatFormIndenceIsnotsimple; itinvolvesComplexities.1)jvmCompatiblemustbeiblemustbeensurecensuredAcrospPlatForms.2)nativelibrariesandsycallsneedcarefulhandling.3)

Java平台独立性:Web应用程序的优势Java平台独立性:Web应用程序的优势May 09, 2025 am 12:08 AM

Java'splatformindependencebenefitswebapplicationsbyallowingcodetorunonanysystemwithaJVM,simplifyingdeploymentandscaling.Itenables:1)easydeploymentacrossdifferentservers,2)seamlessscalingacrosscloudplatforms,and3)consistentdevelopmenttodeploymentproce

JVM解释:Java虚拟机的综合指南JVM解释:Java虚拟机的综合指南May 09, 2025 am 12:04 AM

thejvmistheruntimeenvorment forexecutingjavabytecode,Cocucialforjava的“ WriteOnce,RunanyWhere”能力

Java的主要功能:为什么它仍然是顶级编程语言Java的主要功能:为什么它仍然是顶级编程语言May 09, 2025 am 12:04 AM

JavaremainsatopchoicefordevelopersduetoitsplatFormentence,对象与方向设计,强度,自动化的MememoryManagement和ComprechensivestAndArdArdArdLibrary

Java平台独立性:这对开发人员意味着什么?Java平台独立性:这对开发人员意味着什么?May 08, 2025 am 12:27 AM

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允许univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

如何为第一次使用设置JVM?如何为第一次使用设置JVM?May 08, 2025 am 12:21 AM

要设置JVM,需按以下步骤进行:1)下载并安装JDK,2)设置环境变量,3)验证安装,4)设置IDE,5)测试运行程序。设置JVM不仅仅是让其工作,还包括优化内存分配、垃圾收集、性能调优和错误处理,以确保最佳运行效果。

如何查看产品的Java平台独立性?如何查看产品的Java平台独立性?May 08, 2025 am 12:12 AM

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境