日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2023/12/31 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高德地图获取坐标距离_利用java、js或mysql计算高德地图中两坐标之间的距离 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

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

Java實(shí)現(xiàn)

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

package amap;

import java.text.DecimalFormat;

import java.text.DecimalFormatSymbols;

import java.util.Locale;

/**

* 存儲經(jīng)緯度坐標(biāo)值的類,單位角度

*

* @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)緯度值代表地球上一個(gè)地點(diǎn)。

*

* @param longitude

* 地點(diǎn)的經(jīng)度,在-180 與180 之間的double 型數(shù)值。

* @param latitude

* 地點(diǎn)的緯度,在-90 與90 之間的double 型數(shù)值。

*/

public LngLat(double longitude, double latitude)

{

this(longitude, latitude, true);

}

/**

* 使用傳入的經(jīng)緯度構(gòu)造LatLng 對象,一對經(jīng)緯度值代表地球上一個(gè)地點(diǎn)

*

* @param longitude

* 地點(diǎn)的經(jīng)度,在-180 與180 之間的double 型數(shù)值。

*

* @param latitude

* 地點(diǎn)的緯度,在-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 + ")";

}

}

計(jì)算工具類如下:

package amap;

/**

* 高德地圖工具

*

* @author jianggujin

*

*/

public class AMapUtils

{

/**

* 根據(jù)用戶的起點(diǎn)和終點(diǎn)經(jīng)緯度計(jì)算兩點(diǎn)間距離,此距離為相對較短的距離,單位米。

*

* @param start

* 起點(diǎn)的坐標(biāo)

* @param end

* 終點(diǎn)的坐標(biāo)

* @return

*/

public static double calculateLineDistance(LngLat start, LngLat end)

{

if ((start == null) || (end == null))

{

throw new IllegalArgumentException("非法坐標(biāo)值,不能為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));

}

}

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

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

Javascript實(shí)現(xiàn)

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

/**

* 存儲經(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);

document.write(calculateLineDistance(start, end));

MySQL實(shí)現(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í)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

總結(jié)

以上是生活随笔為你收集整理的高德地图获取坐标距离_利用java、js或mysql计算高德地图中两坐标之间的距离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: avxx| 精品国产乱码久久久久久1区2区 | 国产另类ts人妖一区二区 | 一区二区三区免费在线视频 | 五级黄高潮片90分钟视频 | 依依成人在线视频 | 一级绝黄 | 国产精品一区二区免费在线观看 | 中文字幕乱码免费 | 女王脚交玉足榨精调教 | 亚洲久久天堂 | 日本美女动态图 | 成人免费短视频 | 亚洲成av人片在线观看无 | 在线观看污污视频 | 麻豆影视在线 | 国产在线精品成人欧美 | 日韩一区二区久久 | 亚洲一区中文字幕在线 | 落日余晖 | 污污视频网站在线免费观看 | 最新国产三级 | 黑人巨大精品欧美一区二区免费 | 午夜亚洲国产 | 在线麻豆av| 国产欧美精品 | 黄黄的网站 | 久久精品午夜福利 | 青青在线免费观看 | 特黄aaaaaaaaa毛片免费视频 | 视频精品一区二区 | 中文字幕日韩国产 | 欧美性猛交xxxx乱大交俱乐部 | 亚洲播放器 | 亚洲激情一区二区三区 | 成人在线视频一区二区三区 | 黄色小说网站在线观看 | 国产精品美女久久久久图片 | 在线观看你懂得 | 中文字幕第15页 | 久视频在线观看 | 日本黄色一区二区三区 | 国产成人免费视频 | 欧美极品少妇无套实战 | 影音先锋 日韩 | 91成人精品国产刺激国语对白 | 亚洲在线电影 | 亚洲经典自拍 | 国产色片在线观看 | 无码精品在线视频 | 国产女人18水真多毛片18精品 | 国产在线播放一区二区三区 | 成人交性视频免费看 | 第一宅男av导航入口 | 国产盗摄一区二区三区在线 | 国产精品99久久免费黑人人妻 | 国产成a人亚洲精v品在线观看 | 精品国产乱码久久久久久88av | 在线看片成人 | 免费看一级一片 | 生活片一级片 | 日韩av在线看 | 在线观看国产麻豆 | 一吻定情2013日剧 | 不用播放器的av网站 | 一本久| 一区二区毛片 | 国产男女猛烈无遮挡免费视频动漫 | 日韩精品一区二区三区在线 | 四虎最新网址在线观看 | 欧美日韩aa| 中文字字幕第183页 欧美特级一级片 | 欧美三级午夜理伦 | 男人的天堂av女优 | 正在播放超嫩在线播放 | 成人毛片在线免费观看 | 3d动漫精品啪啪一区二区免费 | 一区二区在线观看免费视频 | 娇妻之欲海泛舟无弹窗笔趣阁 | 放荡的少妇2欧美版 | 深田咏美中文字幕 | 国产视频久久久 | 综合性色| a级性生活视频 | 一本色道久久88亚洲精品综合 | 午夜片在线观看 | 伊人网免费视频 | 亚洲第一成年网 | 日韩欧美一区二 | 婷婷色中文网 | 日韩人妻无码一区二区三区 | 性生活免费网站 | 色偷偷综合 | 欧美精品一区二区三区久久久 | 在线国产网站 | 春色校园激情 | 毛片基地在线播放 | 人妻 校园 激情 另类 | 日韩欧洲亚洲AV无码精品 |