根據經緯度計算兩點距離

来源:http://www.cnblogs.com/zhanjun/archive/2016/05/26/5531469.html
-Advertisement-
Play Games

根據兩點經緯度計算距離 這些經緯線是怎樣定出來的呢?地球是在不停地繞地軸旋轉(地軸是一根通過地球南北兩極和地球中心的假想線),在地球中腰畫一個與地軸垂直的大圓圈,使圈上的每一點都和南北兩極的距離相等,這個圓圈就叫作“赤道”。在赤道的南北兩邊,畫出許多和赤道平行的圓圈,就是“緯圈”;構成這些圓圈的線段 ...


根據兩點經緯度計算距離

這些經緯線是怎樣定出來的呢?地球是在不停地繞地軸旋轉(地軸是一根通過地球南北兩極和地球中心的
假想線),在地球中腰畫一個與地軸垂直的大圓圈,使圈上的每一點都和南北兩極的距離相等,這個圓圈
就叫作“赤道”。在赤道的南北兩邊,畫出許多和赤道平行的圓圈,就是“緯圈”;構成這些圓圈的線段,
叫做緯線。我們把赤道定為緯度零度,向南向北各為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.90593*60=54.3558,取整數位54(分),0.3558*60=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;
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者QQ:1095737364 Intellij 是Java開發人員最喜歡的編程工具.預設情況只能打開一個視窗一個項目,本文就是教大家打開多個視窗,實現同時打開多個項目 第一步:打開Intellij,找到FIle >Setting,打開Settings: 第二步:找到IDE Settings下的Ge ...
  • 做項目的時候遇到一個問題: 上傳文件以後,相同的地址,第一次載入沒有問題,當你操作次數過快,上傳次數過多時,後面的圖片會出現載入不到的情況,瀏覽器載入依舊是上一個,或者更早之前的圖片。 此問題出現原因: 這涉及到瀏覽器緩存規則的問題。當你第二次或多次請求同一地址時,瀏覽器會加一個If-Modifie ...
  • tomcat記憶體溢出設置JAVA_OPTS 答案1設置Tomcat啟動的初始記憶體 其初始空間(即-Xms)是物理記憶體的1/64,最大空間(-Xmx)是物理記憶體的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可 進行設置 三、實例,以下給出1G記憶體環境下java jvm 的參數設置參考 ...
  • 1 簡單簡介 1.1 Hibernate 框架 Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,建立對象與資料庫表的映射。是一個全自動的、完全面向對象的持久層框架。 1.2 Mybatis框架 Mybatis是一個開源對象關係映射框架,原名:ibatis ...
  • 近期 yvivid 使用 Python 進行科學計算類應用(如matlab部分應用場景) 比較好的 發行版本為 Anaconda: A free distribution for the SciPy stack. Supports Linux, Windows and Mac. Enthought ...
  • 列印sql語句,直接在你執行SQL語句後輸出 方法一: $queries = DB::getQueryLog(); $a = end($queries); $tmp = str_replace('?', '"'.'%s'.'"', $a["query"]); echo vsprintf($tmp, ...
  • 相信對於很多剛接觸打包程式的同志來說,關於x86,x64,Any CPU這三個項目平臺,以及解決方案配置Debug和Release有什麼區別?這個問題一定有許多的困惑,甚至不乏一些已經工作了很久的老程式猿來說都是一個模棱兩可的問題。當然,我也是搗騰了好久,才漸漸搞明白它們的區別,以此作個總結: 一 ...
  • 網上很多例子,各種套路,就是沒有測試過。 WPF 將DLL嵌入EXE文件的套路是這樣的 1.將要引用的dll源文件添加到wpf 項目中,dll 的屬性-》生成操作為【嵌入的資源】。 2.監聽 AppDomain.CurrentDomain.AssemblyResolve 事件 監聽的事件的位置很重要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...