最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用java、js或mysql計算高德地圖中兩坐標之間的距離

 更新時間:2017年10月16日 09:14:44   作者:蔣固金  
最近因為工作的需求,需要計算出高德地圖中兩個坐標的距離,通過查找相關(guān)資料發(fā)現(xiàn)了多種實現(xiàn)的方法,下面這篇文章主要給大家介紹了關(guān)于利用java、js或mysql計算高德地圖中兩坐標之間距離的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。

前言

因為工作的原因,最近在做與地圖相關(guān)的應(yīng)用,使用了高德地圖,研究了下高德地圖計算兩坐標距離的方法,官網(wǎng)上提供的開發(fā)包中有相關(guān)的方法,但是我的產(chǎn)品中比較特殊,無法直接使用提供的方法,所以就自己封裝了相關(guān)計算方法,供大家參考,下面話不多說了,來一起看看詳細的介紹吧。

Java實現(xiàn)

首先定義一個用于存儲經(jīng)緯度的類,這里起個名字叫:LngLat

package amap;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;

/**
 * 存儲經(jīng)緯度坐標值的類,單位角度
 * 
 * @author jianggujin
 *
 */
public final class LngLat implements Cloneable
{
 /**
 * 緯度 (垂直方向)
 */
 public final double latitude;
 /**
 * 經(jīng)度 (水平方向)
 */
 public final double longitude;
 /**
 * 格式化
 */
 private static DecimalFormat format = new DecimalFormat("0.000000", new DecimalFormatSymbols(Locale.US));

 /**
 * 使用傳入的經(jīng)緯度構(gòu)造LatLng 對象,一對經(jīng)緯度值代表地球上一個地點。
 * 
 * @param longitude
 *  地點的經(jīng)度,在-180 與180 之間的double 型數(shù)值。
 * @param latitude
 *  地點的緯度,在-90 與90 之間的double 型數(shù)值。
 */
 public LngLat(double longitude, double latitude)
 {
 this(longitude, latitude, true);
 }

 /**
 * 使用傳入的經(jīng)緯度構(gòu)造LatLng 對象,一對經(jīng)緯度值代表地球上一個地點
 * 
 * @param longitude
 *  地點的經(jīng)度,在-180 與180 之間的double 型數(shù)值。
 * 
 * @param latitude
 *  地點的緯度,在-90 與90 之間的double 型數(shù)值。
 * @param isCheck
 *  是否需要檢查經(jīng)緯度的合理性,建議填寫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
{
 /**
 * 根據(jù)用戶的起點和終點經(jīng)緯度計算兩點間距離,此距離為相對較短的距離,單位米。
 * 
 * @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));
 }
}

運行結(jié)果為:1569.6213922679392,官網(wǎng)的javascript API示例結(jié)果如圖:

結(jié)果雖然有一點誤差,但是這hi在可接受范圍內(nèi)的。

Javascript實現(xiàn)

同樣的算法,將其轉(zhuǎn)換成JS的寫法,完整的代碼如下:

<!DOCTYPE html>
<html>

 <head>
  <meta charset="utf-8" />
  <title></title>
  <script type="text/javascript" src="js/ajax.js"></script>
  <script>
   /**
    * 存儲經(jīng)緯度
    * @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實現(xiàn)

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 ; 

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • java構(gòu)造器 默認構(gòu)造方法及參數(shù)化構(gòu)造方法

    java構(gòu)造器 默認構(gòu)造方法及參數(shù)化構(gòu)造方法

    構(gòu)造器也叫構(gòu)造方法、構(gòu)造函數(shù),是一種特殊類型的方法,負責(zé)類中成員變量(域)的初始化。構(gòu)造器的用處是在創(chuàng)建對象時執(zhí)行初始化,當(dāng)創(chuàng)建一個對象時,系統(tǒng)會為這個對象的實例進行默認的初始化,下面文章將進入講解,需要的朋友可以參考下
    2021-10-10
  • SpringCloud整合Activiti過程中的踩坑記錄

    SpringCloud整合Activiti過程中的踩坑記錄

    由于項目需要,最近開始在項目Spring boot中集成工作流引擎Activiti,由于第一次集成,一路上步步都是坑,所以這篇文章主要給大家介紹了關(guān)于SpringCloud整合Activiti過程中所遇到的踩坑記錄,需要的朋友可以參考下
    2021-09-09
  • SpringMVC中Controller層獲取前端請求參數(shù)的方式匯總

    SpringMVC中Controller層獲取前端請求參數(shù)的方式匯總

    這篇文章主要介紹了SpringMVC中Controller層獲取前端請求參數(shù)的幾種方式,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 深入分析JAVA流程控制語句

    深入分析JAVA流程控制語句

    這篇文章主要介紹了JAVA流程控制語句的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • spring中使用mybatis plus連接sqlserver的方法實現(xiàn)

    spring中使用mybatis plus連接sqlserver的方法實現(xiàn)

    這篇文章主要介紹了spring中使用mybatis plus連接sqlserver的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring中@Transactional用法詳細介紹

    Spring中@Transactional用法詳細介紹

    這篇文章主要介紹了Spring中@Transactional用法詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java在linux本地執(zhí)行shell命令的實現(xiàn)方法

    java在linux本地執(zhí)行shell命令的實現(xiàn)方法

    本文主要介紹了java在linux本地執(zhí)行shell命令的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • springboot連接不同數(shù)據(jù)庫的寫法詳解

    springboot連接不同數(shù)據(jù)庫的寫法詳解

    這篇文章主要介紹了springboot連接不同數(shù)據(jù)庫的寫法?,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • websocket在springboot+vue中的使用教程

    websocket在springboot+vue中的使用教程

    這篇文章主要介紹了websocket在springboot+vue中的使用教程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • java動態(tài)添加外部jar包到classpath的實例詳解

    java動態(tài)添加外部jar包到classpath的實例詳解

    這篇文章主要介紹了java動態(tài)添加外部jar包到classpath的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論

山东| 鹤山市| 普兰县| 蒙城县| 阿图什市| 加查县| 长白| 斗六市| 旅游| 昭通市| 凤城市| 华安县| 五莲县| 米易县| 青龙| 延吉市| 荥经县| 桐城市| 安新县| 衡水市| 阿尔山市| 辽阳县| 黔南| 广东省| 休宁县| 嘉荫县| 灌阳县| 临颍县| 阳江市| 海原县| 光泽县| 剑川县| 峨山| 西城区| 天门市| 巴林右旗| 沙湾县| 鄂州市| 区。| 湟中县| 如皋市|