【轉載】根據兩點經緯度計算距離!

這些經緯線是怎樣定出來的呢?地球是在不停地繞地軸旋轉(地軸是一根通過地球南北兩極和地球中心的
假想線),在地球中腰畫一個與地軸垂直的大圓圈,使圈上的每一點都和南北兩極的距離相等,這個圓圈
就叫作“赤道”。在赤道的南北兩邊,畫出許多和赤道平行的圓圈,就是“緯圈”;構成這些圓圈的線段,
叫做緯線。我們把赤道定為緯度零度,向南向北各為90度,在赤道以南的叫南緯,在赤道以北的叫北緯。
北極就是北緯90度,南極就是南緯90度。緯度的高低也標志著氣候的冷熱,如赤道和低緯度地地區無冬,
兩極和高緯度地區無夏,中緯度地區四季分明。
其次,從北極點到南極點,可以畫出許多南北方向的與地球赤道垂直的大圓圈,這叫作“經圈”;構成這
些圓圈的線段,就叫經線。公元1884平面坐標圖年,國際上規定以通過英國倫敦近郊的格林尼治天文臺的
經線作為計算經度的起點,即經度零度零分零秒,也稱“本初子午線”。在它東面的為東經,共180度;
在它西面的為西經,共180度。因為地球是圓的,所以東經180度和西經180度的經線是同一條經線。各國
公定180度經線為“國際日期變更線”。為了避免同一地區使用兩個不同的日期,國際日期變線在遇陸地時
略有偏離。
每一經度和緯度還可以再細分為60分,每一分再分為60秒以及秒的小數。利用經緯線,我們就可以確定
地球上每一個地方的具體位置,并且把它在地圖或地球儀上表示出來。例如問北京的經緯度是多少?我們
很容易從地圖上查出來是東經116度24分,北緯39度54分。在大海中航行的船只,只要把所在地的經度測
出來,就可以確定船在海洋中的位置和前進方向。 緯度共有90度。赤道為0度,向兩極排列,圈子越小,
度數越大。
橫線是緯度,豎線是經度。
當然可以計算,四元二次方程。
經度和緯度都是一種角度。經度是個兩面角,是兩個經線平面的夾角。因所有經線都是一樣長,為了度量
經度選取一個起點面,經1884年國際會議協商,決定以通過英國倫敦近郊、泰晤士河南岸的格林尼治皇家
天文臺(舊址)的一臺主要子午儀十字絲的那條經線為起始經線,稱為本初子午線。本初子午線平面是起
點面,終點面是本地經線平面。某一點的經度,就是該點所在的經線平面與本初子午線平面間的夾角。在
赤道上度量,自本初子午線平面作為起點面,分別往東往西度量,往東量值稱為東經度,往西量值稱為西
經度。由此可見,一地的經度是該地對于本初子午線的方向和角距離。本初子午線是0°經度,東經度的最
大值為180°,西經度的最大值為180°,東、西經180°經線是同一根經線,因此不分東經或西經,而統稱
180°經線。
緯度是個線面角。起點面是赤道平面,線是本地的地面法線。所謂法線,即垂直于參考扁球體表面的線。
某地的緯度就是該地的法線與赤道平面之間的夾角。緯度在本地經線上度量,由赤道向南、北度量,向北
量值稱為北緯度,向南量值稱為南緯度。由此可見,一地的緯度是該地對于赤道的方向和角距離。赤道是
0°緯線,北緯度的最大值為90°,即北極點;南緯度的最大值為90°,即南極點。
經緯度互換

度(DDD):E 108.90593度 N 34.21630度

如何將度(DDD):: 108.90593度換算成度分秒(DMS)東經E 108度54分22.2秒?轉換方法是將108.90593整數位不變取108(度),用0.9059360=54.3558,取整數位54(分),0.355860=21.348再取整數位21(秒),故轉化為108度54分21秒.

同樣將度分秒(DMS):東經E 108度54分22.2秒 換算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度

因為計算時小數位保留的原因,導致正反計算存在一定誤差,但誤差影響不是很大。1秒的誤差就是幾米的樣子。GPS車友可以用上述方法換算成自己需要的單位坐標。

經緯度換算成米

緯度分為60分,每一分再分為60秒以及秒的小數。

緯度線投射在圖上看似水平的平行線,但實際上是不同半徑的圓。有相同特定緯度的所有位置都在同一個緯線上。
赤道的緯度為0°,將行星平分為南半球和北半球。
緯度是指某點與地球球心的連線和地球赤道面所成的線面角,其數值在0至90度之間。位于赤道以北的點的緯度叫北緯,記為N,位于赤道以南的點的緯度稱南緯,記為S。
緯度數值在0至30度之間的地區稱為低緯地區,緯度數值在30至60度之間的地區稱為中緯地區,緯度數值在60至90度之間的地區稱為高緯地區。
赤道、南回歸線、北回歸線、南極圈和北極圈是特殊的緯線。
緯度1秒的長度
地球的子午線總長度大約40008km。平均:
緯度1度 = 大約111km
緯度1分 = 大約1.85km
緯度1秒 = 大約30.9m

根據地球上任意兩點的經緯度計算兩點間的距離

地球是一個近乎標準的橢球體,它的赤道半徑為6378.140千米,極半徑為 6356.755千米,平均半徑6371.004千米。如果我們假設地球是一個完美的球體,那么它的半徑就是地球的平均半徑,記為R。如果以0度經線為基 準,那么根據地球表面任意兩點的經緯度就可以計算出這兩點間的地表距離(這里忽略地球表面地形對計算帶來的誤差,僅僅是理論上的估算值)。設第一點A的經 緯度為(LonA, LatA),第二點B的經緯度為(LonB, LatB),按照0度經線的基準,東經取經度的正值(Longitude),西經取經度負值(-Longitude),北緯取90-緯度值(90- Latitude),南緯取90+緯度值(90+Latitude),則經過上述處理過后的兩點被計為(MLonA, MLatA)和(MLonB, MLatB)。那么根據三角推導,可以得到計算兩點距離的如下公式:

C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180

這里,R和Distance單位是相同,如果是采用6371.004千米作為半徑,那么Distance就是千米為單位,如果要使用其他單位,比如mile,還需要做單位換算,1千米=0.621371192mile

如果僅對經度作正負的處理,而不對緯度作90-Latitude(假設都是北半球,南半球只有澳洲具有應用意義)的處理,那么公式將是:

C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)

Distance = R*Arccos(C)*Pi/180

以上通過簡單的三角變換就可以推出。

如果三角函數的輸入和輸出都采用弧度值,那么公式還可以寫作:

C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)

Distance = R*Arccos(C)*Pi/180

也就是:

C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)

Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer 
= 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile

在實際應用當中,一般是通過一個個體的郵政編碼來查找該郵政編碼對應的地區中心的經緯度,然 后再根據這些經緯度來計算彼此的距離,從而估算出某些群體之間的大致距離范圍(比如酒店旅客的分布范圍-各個旅客的郵政編碼對應的經緯度和酒店的經緯度所 計算的距離范圍-等等),所以,通過郵政編碼查詢經緯度這樣一個數據庫是一個很有用的資源。
附:C#代碼:

private const double EARTH_RADIUS = 6378.137;//地球半徑
private static double rad(double d)
{
 return d * Math.PI / 180.0;
} 

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
 double radLat1 = rad(lat1);
 double radLat2 = rad(lat2);
 double a = radLat1 - radLat2;
 double b = rad(lng1) - rad(lng2);

double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
 Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
 s = s * EARTH_RADIUS;
 s = Math.Round(s * 10000) / 10000;
 return s;
}

最近用到了geohash(參考《geohash:用字符串實現附近地點搜索》)來實現附近搜索的功能,在《微信、陌陌架構方案分析》文中提供了一個php的geohash類直接能對經緯地址編碼成字符串, 而其中包含一個getDistance方法獲取兩點間的距離,但在sphinx中使用過濾附近地標的方法SetGeoAnchor發現返回的距離值有誤,遂google出以下方法,經測試可用。。

/*** @desc 根據兩點間的經緯度計算距離*
 @param float $lat 緯度值* @param float $lng 經度值*/ 
    /**
     *  @desc 根據兩點間的經緯度計算距離
     *  @param float $lat 緯度值
     *  @param float $lng 經度值
     * @return $result 單位為千米(km)
     */
     public function getDistance($lat1, $lng1, $lat2, $lng2){

        $earthRadius = 6367000; //approximate radius of earth in meters
        //  Convert these degrees to radians       to work with the formula
        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;
        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($lng2 * pi() ) / 180;
        // Using the       Haversine formula       http://en.wikipedia.org/wiki/Haversine_formula       calculate the distance
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);  $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        return round($calculatedDistance);
    }

作者:DragonersLi
鏈接:http://www.lxweimin.com/p/85c273d75213
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容