摘要:計(jì)算精度與谷歌地圖的距離精度差不多,相差范圍在米以下。以上代碼大部分來(lái)自網(wǎng)上收集,經(jīng)過(guò)驗(yàn)證過(guò)的,可以使用
根據(jù)經(jīng)緯度計(jì)算距離公式
圖片來(lái)自互聯(lián)網(wǎng)
對(duì)上面的公式解釋如下:
Lung1 Lat1表示A點(diǎn)經(jīng)緯度, Lung2 Lat2表示B點(diǎn)經(jīng)緯度;
a=Lat1 – Lat2 為兩點(diǎn)緯度之差 b=Lung1 -Lung2 為兩點(diǎn)經(jīng)度之差;
6378.137為地球半徑,單位為千米;
計(jì)算出來(lái)的結(jié)果單位為千米,若將半徑改為米為單位則計(jì)算的結(jié)果單位為米。
計(jì)算精度與谷歌地圖的距離精度差不多,相差范圍在0.2米以下。
參數(shù)說(shuō)明lng:經(jīng)度
lat:緯度
地球半徑:6378.137(千米)
一般地圖上顯示的坐標(biāo)順序?yàn)椋暥仍谇埃ǚ秶?90 ~ 90),經(jīng)度在后(范圍-180 ~ 180)
各種語(yǔ)言計(jì)算距離的代碼這種計(jì)算方式一般都是直線距離
sql語(yǔ)句
SELECT *, 6378.138 * 2 * ASIN( SQRT( POW( SIN( ( ".$lat." * PI() / 180 - lat * PI() / 180 ) / 2 ), 2 ) + COS(".$lat." * PI() / 180) * COS(lat * PI() / 180) * POW( SIN( ( ".$lng." * PI() / 180 - lng * PI() / 180 ) / 2 ), 2 ) ) ) *1000 AS distance FROM distance ORDER BY distance ASC
php計(jì)算距離
/** * 根據(jù)兩點(diǎn)間的經(jīng)緯度計(jì)算距離 * @param $lng1 * @param $lat1 * @param $lng2 * @param $lat2 * @return int */ public static function getDistance($lng1, $lat1, $lng2, $lat2) { //將角度轉(zhuǎn)為狐度 $radLat1 = deg2rad($lat1);//deg2rad()函數(shù)將角度轉(zhuǎn)換為弧度 $radLat2 = deg2rad($lat2); $radLng1 = deg2rad($lng1); $radLng2 = deg2rad($lng2); $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000; return $s; }
js求距離的方法
/** * 轉(zhuǎn)換弧度 * @param d * @returns {number} */ function getRad(d){ var PI = Math.PI; return d*PI/180.0; } /** * 根據(jù)經(jīng)緯度計(jì)算兩點(diǎn)間距離 * @param lng1 * @param lat1 * @param lng2 * @param lat2 * @returns {number|*} * @constructor */ function CoolWPDistance(lng1,lat1,lng2,lat2){ var f = getRad((lat1 + lat2)/2); var g = getRad((lat1 - lat2)/2); var l = getRad((lng1 - lng2)/2); var sg = Math.sin(g); var sl = Math.sin(l); var sf = Math.sin(f); var s,c,w,r,d,h1,h2; var a = 6378137.0;//The Radius of eath in meter. var fl = 1/298.257; sg = sg*sg; sl = sl*sl; sf = sf*sf; s = sg*(1-sl) + (1-sf)*sl; c = (1-sg)*(1-sl) + sf*sl; w = Math.atan(Math.sqrt(s/c)); r = Math.sqrt(s*c)/w; d = 2*w*a; h1 = (3*r -1)/2/c; h2 = (3*r +1)/2/s; s = d*(1 + fl*(h1*sf*(1-sg) - h2*(1-sf)*sg)); if(s >= 1000 && s <= 99000){ var kilometer = s/1000; s = kilometer.toFixed(1) + "km"; }else if(s > 99000){ s = ">99km"; }else{ s = Math.round(s) + "m"; } // s = s/1000; // s = s.toFixed(2);//指定小數(shù)點(diǎn)后的位數(shù)。 return s; }
以上代碼大部分來(lái)自網(wǎng)上收集,經(jīng)過(guò)驗(yàn)證過(guò)的,可以使用
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28453.html
摘要:計(jì)算精度與谷歌地圖的距離精度差不多,相差范圍在米以下。以上代碼大部分來(lái)自網(wǎng)上收集,經(jīng)過(guò)驗(yàn)證過(guò)的,可以使用 根據(jù)經(jīng)緯度計(jì)算距離公式 showImg(https://segmentfault.com/img/bV6zX2?w=437&h=76); 圖片來(lái)自互聯(lián)網(wǎng) 對(duì)上面的公式解釋如下: Lung1 Lat1表示A點(diǎn)經(jīng)緯度, Lung2 Lat2表示B點(diǎn)經(jīng)緯度; a=Lat1 – Lat2...
參考網(wǎng)址 redis命令 php操作redis 環(huán)境要求 首先確保已經(jīng)安裝redis 并且已經(jīng)啟動(dòng) showImg(https://segmentfault.com/img/bVbtIfe?w=1140&h=730); 確保PHP已經(jīng)安裝redis擴(kuò)展 php -m | grep redisshowImg(https://segmentfault.com/img/bVbtIfT?w=...
閱讀 3215·2021-09-30 09:48
閱讀 3489·2021-09-22 16:00
閱讀 1066·2019-08-30 13:08
閱讀 3106·2019-08-30 10:53
閱讀 2416·2019-08-29 18:33
閱讀 1589·2019-08-29 12:47
閱讀 900·2019-08-29 12:16
閱讀 1933·2019-08-26 12:02