C#通過經(jīng)緯度計(jì)算2個(gè)點(diǎn)之間距離的實(shí)現(xiàn)代碼
根據(jù)兩點(diǎn)經(jīng)緯度計(jì)算距離
這些經(jīng)緯線是怎樣定出來的呢?地球是在不停地繞地軸旋轉(zhuǎn)(地軸是一根通過地球南北兩極和地球中心的假想線),在地球中腰畫一個(gè)與地軸垂直的大圓圈,使圈上的每一點(diǎn)都和南北兩極的距離相等,這個(gè)圓圈就叫作“赤道”。在赤道的南北兩邊,畫出許多和赤道平行的圓圈,就是“緯圈”;構(gòu)成這些圓圈的線段,叫做緯線。我們把赤道定為緯度零度,向南向北各為90度,在赤道以南的叫南緯,在赤道以北的叫北緯。
北極就是北緯90度,南極就是南緯90度。緯度的高低也標(biāo)志著氣候的冷熱,如赤道和低緯度地地區(qū)無冬,兩極和高緯度地區(qū)無夏,中緯度地區(qū)四季分明。
其次,從北極點(diǎn)到南極點(diǎn),可以畫出許多南北方向的與地球赤道垂直的大圓圈,這叫作“經(jīng)圈”;構(gòu)成這些圓圈的線段,就叫經(jīng)線。公元1884平面坐標(biāo)圖年,國際上規(guī)定以通過英國倫敦近郊的格林尼治天文臺(tái)的經(jīng)線作為計(jì)算經(jīng)度的起點(diǎn),即經(jīng)度零度零分零秒,也稱“本初子午線”。在它東面的為東經(jīng),共180度;
在它西面的為西經(jīng),共180度。因?yàn)榈厍蚴菆A的,所以東經(jīng)180度和西經(jīng)180度的經(jīng)線是同一條經(jīng)線。各國公定180度經(jīng)線為“國際日期變更線”。為了避免同一地區(qū)使用兩個(gè)不同的日期,國際日期變線在遇陸地時(shí)略有偏離。
每一經(jīng)度和緯度還可以再細(xì)分為60分,每一分再分為60秒以及秒的小數(shù)。利用經(jīng)緯線,我們就可以確定地球上每一個(gè)地方的具體位置,并且把它在地圖或地球儀上表示出來。例如問北京的經(jīng)緯度是多少?我們很容易從地圖上查出來是東經(jīng)116度24分,北緯39度54分。在大海中航行的船只,只要把所在地的經(jīng)度測
出來,就可以確定船在海洋中的位置和前進(jìn)方向。 緯度共有90度。赤道為0度,向兩極排列,圈子越小,度數(shù)越大。
橫線是緯度,豎線是經(jīng)度。
當(dāng)然可以計(jì)算,四元二次方程。
經(jīng)度和緯度都是一種角度。經(jīng)度是個(gè)兩面角,是兩個(gè)經(jīng)線平面的夾角。因所有經(jīng)線都是一樣長,為了度量經(jīng)度選取一個(gè)起點(diǎn)面,經(jīng)1884年國際會(huì)議協(xié)商,決定以通過英國倫敦近郊、泰晤士河南岸的格林尼治皇家天文臺(tái)(舊址)的一臺(tái)主要子午儀十字絲的那條經(jīng)線為起始經(jīng)線,稱為本初子午線。本初子午線平面是起點(diǎn)面,終點(diǎn)面是本地經(jīng)線平面。某一點(diǎn)的經(jīng)度,就是該點(diǎn)所在的經(jīng)線平面與本初子午線平面間的夾角。在赤道上度量,自本初子午線平面作為起點(diǎn)面,分別往東往西度量,往東量值稱為東經(jīng)度,往西量值稱為西經(jīng)度。由此可見,一地的經(jīng)度是該地對(duì)于本初子午線的方向和角距離。本初子午線是0°經(jīng)度,東經(jīng)度的最
大值為180°,西經(jīng)度的最大值為180°,東、西經(jīng)180°經(jīng)線是同一根經(jīng)線,因此不分東經(jīng)或西經(jīng),而統(tǒng)稱180°經(jīng)線。
緯度是個(gè)線面角。起點(diǎn)面是赤道平面,線是本地的地面法線。所謂法線,即垂直于參考扁球體表面的線。
某地的緯度就是該地的法線與赤道平面之間的夾角。緯度在本地經(jīng)線上度量,由赤道向南、北度量,向北量值稱為北緯度,向南量值稱為南緯度。由此可見,一地的緯度是該地對(duì)于赤道的方向和角距離。赤道是0°緯線,北緯度的最大值為90°,即北極點(diǎn);南緯度的最大值為90°,即南極點(diǎn)。經(jīng)緯度互換
度(DDD):E 108.90593度 N 34.21630度
如何將度(DDD):: 108.90593度換算成度分秒(DMS)東經(jīng)E 108度54分22.2秒?轉(zhuǎn)換方法是將108.90593整數(shù)位不變?nèi)?08(度),用0.90593*60=54.3558,取整數(shù)位 54(分),0.3558*60=21.348再取整數(shù)位21(秒),故轉(zhuǎn)化為108度54分21秒.
同樣將度分秒(DMS):東經(jīng)E 108度54分22.2秒 換算成度(DDD)的方法如下:108度54分22.2秒=108+(54/60)+(22.2/3600)=108.90616度
因?yàn)橛?jì)算時(shí)小數(shù)位保留的原因,導(dǎo)致正反計(jì)算存在一定誤差,但誤差影響不是很大。1秒的誤差就是幾米的樣子。GPS車友可以用上述方法換算成自己需要的單位坐標(biāo)。
經(jīng)緯度換算成米
緯度分為60分,每一分再分為60秒以及秒的小數(shù)。
緯度線投射在圖上看似水平的平行線,但實(shí)際上是不同半徑的圓。有相同特定緯度的所有位置都在同一個(gè)緯線上。 赤道的緯度為0°,將行星平分為南半球和北半球。 緯度是指某點(diǎn)與地球球心的連線和地球赤道面所成的線面角,其數(shù)值在0至90度之間。位于赤道以北的點(diǎn)的緯度叫北緯,記為N,位于赤道以南的點(diǎn)的緯度稱南緯,記為S。
緯度數(shù)值在0至30度之間的地區(qū)稱為低緯地區(qū),緯度數(shù)值在30至60度之間的地區(qū)稱為中緯地區(qū),緯度數(shù)值在60至90度之間的地區(qū)稱為高緯地區(qū)。
赤道、南回歸線、北回歸線、南極圈和北極圈是特殊的緯線。
緯度1秒的長度
地球的子午線總長度大約40008km。平均:
緯度1度 = 大約111km
緯度1分 = 大約1.85km
緯度1秒 = 大約30.9m
WGS84坐標(biāo)系統(tǒng)下(通常我們采用的GPS內(nèi)的坐標(biāo)系統(tǒng))
如果是中國常用的WGS1984的經(jīng)緯度坐標(biāo),1秒相當(dāng)于33米。具體如下:
經(jīng)度1度=85.39km
經(jīng)度1分 = 1.42km
經(jīng)度1秒 = 23.6m
根據(jù)地球上任意兩點(diǎn)的經(jīng)緯度計(jì)算兩點(diǎn)間的距離
地球是一個(gè)近乎標(biāo)準(zhǔn)的橢球體,它的赤道半徑為6378.140千米,極半徑為 6356.755千米,平均半徑6371.004千米。如果我們假設(shè)地球是一個(gè)完美的球體,那么它的半徑就是地球的平均半徑,記為R。如果以0度經(jīng)線為基 準(zhǔn),那么根據(jù)地球表面任意兩點(diǎn)的經(jīng)緯度就可以計(jì)算出這兩點(diǎn)間的地表距離(這里忽略地球表面地形對(duì)計(jì)算帶來的誤差,僅僅是理論上的估算值)。設(shè)第一點(diǎn)A的經(jīng) 緯度為(LonA, LatA),第二點(diǎn)B的經(jīng)緯度為(LonB, LatB),按照0度經(jīng)線的基準(zhǔn),東經(jīng)取經(jīng)度的正值(Longitude),西經(jīng)取經(jīng)度負(fù)值(-Longitude),北緯取90-緯度值(90- Latitude),南緯取90+緯度值(90+Latitude),則經(jīng)過上述處理過后的兩點(diǎn)被計(jì)為(MLonA, MLatA)和(MLonB, MLatB)。那么根據(jù)三角推導(dǎo),可以得到計(jì)算兩點(diǎn)距離的如下公式:
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
如果僅對(duì)經(jīng)度作正負(fù)的處理,而不對(duì)緯度作90-Latitude(假設(shè)都是北半球,南半球只有澳洲具有應(yīng)用意義)的處理,那么公式將是:
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以上通過簡單的三角變換就可以推出。
如果三角函數(shù)的輸入和輸出都采用弧度值,那么公式還可以寫作:
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
在實(shí)際應(yīng)用當(dāng)中,一般是通過一個(gè)個(gè)體的郵政編碼來查找該郵政編碼對(duì)應(yīng)的地區(qū)中心的經(jīng)緯度,然 后再根據(jù)這些經(jīng)緯度來計(jì)算彼此的距離,從而估算出某些群體之間的大致距離范圍(比如酒店旅客的分布范圍-各個(gè)旅客的郵政編碼對(duì)應(yīng)的經(jīng)緯度和酒店的經(jīng)緯度所 計(jì)算的距離范圍-等等),所以,通過郵政編碼查詢經(jīng)緯度這樣一個(gè)數(shù)據(jù)庫是一個(gè)很有用的資源。
附: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;
}
原理:地球赤道上環(huán)繞地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的長度計(jì)算如下:
40075.04km/360°=111.31955km
111.31955km/60=1.8553258km=1855.3m
而每一分又有60秒,每一秒就代表1855.3m/60=30.92m
任意兩點(diǎn)距離計(jì)算公式為
d=111.12cos{1/[sinΦA(chǔ)sinΦB十cosΦA(chǔ)cosΦBcos(λB—λA)]}
其中A點(diǎn)經(jīng)度,緯度分別為λA和ΦA(chǔ),B點(diǎn)的經(jīng)度、緯度分別為λB和ΦB,d為距離。
- C#編寫的windows計(jì)算器的實(shí)例代碼
- C#計(jì)算兩個(gè)時(shí)間差的方法代碼分享
- C#獲取計(jì)算機(jī)名,IP,MAC信息實(shí)現(xiàn)代碼
- C#由當(dāng)前日期計(jì)算相應(yīng)的周一和周日的實(shí)例代碼
- C#實(shí)現(xiàn)計(jì)算年齡的簡單方法匯總
- C#遞歸實(shí)現(xiàn)顯示文件夾及所有文件并計(jì)算其大小的方法
- C#計(jì)算文件MD5校驗(yàn)的方法
- C#和SQL實(shí)現(xiàn)的字符串相似度計(jì)算代碼分享
- C#根據(jù)年月日計(jì)算星期幾的函數(shù)小例子
- C#計(jì)算汽車行駛方向的方法分析
相關(guān)文章
C# 靜態(tài)構(gòu)造函數(shù)使用總結(jié)
今天花了一些時(shí)間把靜態(tài)構(gòu)造函數(shù)的用法總結(jié)了一下,希望高手們指點(diǎn)。謝謝2013-03-03C#實(shí)現(xiàn)把指定數(shù)據(jù)寫入串口
這篇文章主要介紹了C#實(shí)現(xiàn)把指定數(shù)據(jù)寫入串口,直接給出示例代碼,需要的朋友可以參考下2015-06-06C#與PHP的md5計(jì)算結(jié)果不同的解決方法
今天在用C#接入我的登錄api發(fā)現(xiàn)了一個(gè)問題,登陸的時(shí)候無論如何都會(huì)出現(xiàn)用戶名和密碼錯(cuò)誤的問題,后來通過查找排除找的了問題的原因是因?yàn)镃#與PHP的md5計(jì)算結(jié)果不同導(dǎo)致的,下面就來看看如何解決這個(gè)問題吧。2016-12-12C# AE之返回上一級(jí)和下一級(jí)的實(shí)戰(zhàn)操作
這篇文章主要介紹了C# AE之返回上一級(jí)和下一級(jí)的實(shí)戰(zhàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01C#實(shí)現(xiàn)DataSet內(nèi)數(shù)據(jù)轉(zhuǎn)化為Excel和Word文件的通用類完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)DataSet內(nèi)數(shù)據(jù)轉(zhuǎn)化為Excel和Word文件的通用類,涉及C#中DataSet控件的使用及Excel和Word文件的相關(guān)操作技巧,需要的朋友可以參考下2016-06-06