一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 利用java、js或mysql計算高德地圖中兩坐標之間的距離

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

2021-01-19 10:10蔣固金 Java教程

最近因為工作的需求,需要計算出高德地圖中兩個坐標的距離,通過查找相關(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

java" id="highlighter_754950">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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 + ")";
 }
}

計算工具類如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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);
 }
}

最后邊寫一段測試代碼測試一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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é)果如圖:

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

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

Javascript實現(xiàn)

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<!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)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:http://blog.csdn.net/jianggujin/article/details/72833711

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品香蕉夜间视频免费播放 | 无遮18禁在线永久免费观看挡 | 无限观看社区在线视频 | 波多野结衣女老师 | 日本高清中文字幕一区二区三区 | 免费一区在线观看 | 特a级片| 九九热这里只有精品视频免费 | 免费又爽又黄禁片视频在线播放 | 日日操美女 | 日本妇人成熟免费不卡片 | 国产精品资源站 | 国产嘿咻 | 6080欧美一区二区三区四区 | 日本免费全黄一级裸片视频 | 思思久久精品在热线热 | 消息称老熟妇乱视频一区二区 | 黑帮大佬与我的365天2标清中文 | 国产主播精品在线 | 婷婷色天使在线视频观看 | 色综合中文字幕天天在线 | 日本嫩模 | 操爽| 日本一区二区三区国产 | pppd在线播放| 久久免费看少妇级毛片蜜臀 | 加勒比久草 | 99成人国产精品视频 | 菠萝视频在线完整版 | 四虎影视在线影院在线观看观看 | 本土自拍| 国产亚洲福利一区二区免费看 | 久久re视频精品538在线 | 王淑兰李思雨李铁柱乡村小说免费 | bt天堂午夜国产精品 | 九九99热久久精品在线6 | 国产成人精品高清免费 | 视频一区久久 | 国产视频91在线 | 日本不卡在线一区二区三区视频 | 国产成人yy精品1024在线 |