• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長修遠,我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
            數據加載中……

            通過兩個點的經緯度計算距離

            最近開始做一個類似gis的東西. 需要求一些經緯度相關的值..

            看了通過兩個點的經緯度計算距離這篇,據說是Google里扒來的算法,于是決定驗證一下。
            通過計算發現非常正確。
            用30,120和31,121兩個坐標點進行驗證,同Mapinfo中計算的結果非常的相近。
            后來又把坐標系直接當成直角坐標系來計算,發現誤差很大。
            于是仍然用直角坐標系方法來計算,給緯度加上了個0.86的參數,這樣計算下來和結果相近。




            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;
            }


            vb代碼

            Const EARTH_RADIUS = 6378.137
            Const Pi = 3.1415926535898

            Function rad(ByVal d As Double) As Double
            rad = d * Pi / 180
            End Function

            Function GetDistance(lat1 As Double, lng1 As Double, lat2 As Double, lng2 As Double) As Double
            Dim radlat1 As Double, radlat2 As Double
            Dim a As Double, b As Double, s As Double, Temp As Double
            radlat1 = rad(lat1)
            radlat2 = rad(lat2)
            a = radlat1 - radlat2
            b = rad(lng1) - rad(lng2)
            Temp = Sqr(Sin(a / 2) ^ 2 + Cos(radlat1) * Cos(radlat2) * Sin(b / 2) ^ 2)
            s = 2 * Atn(Temp / Sqr(-Temp * Temp + 1))     '沒有反正弦函數,網上找了個
            s = s * EARTH_RADIUS
            GetDistance = s
            End Function

            Private Sub Command1_Click()
            Text5.Text = Str(GetDistance(Val(Text1.Text), Val(Text2.Text), Val(Text3.Text), Val(Text4.Text)))
            End Sub

            Private Sub Command2_Click()
            Text5.Text = Str((Sqr((Val(Text3.Text) - Val(Text1.Text)) ^ 2 + (Val(Text4.Text) - Val(Text2.Text)) ^ 2)) * 111.3199338)
            End Sub

            Private Sub Command3_Click()
            Text5.Text = Str((Sqr((Val(Text3.Text) * 0.86 - Val(Text1.Text) * 0.86) ^ 2 + (Val(Text4.Text) - Val(Text2.Text)) ^ 2)) * 111.3199338)
            End Sub



            同緯度計算比較簡單

            A(60,30),B(60,90)兩點之間,此段代碼和我用余弦定理算出來的結果很一致。
            余弦定理的步驟是:1、算A、B弦長:地球半徑R*cos(經度差60)=R/2;
            2、算角AOB,O為地球圓心,利用余弦定理,
            cosAOB=(2R*R-(R/2)^2) /2*R*R=7/8;
            3、弧AB的長為:R*arc cos(7/8);求畢



            原理:

            地球赤道上環繞地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的長度計算如下:

              40075.04km/360°=111.31955km

              111.31955km/60=1.8553258km=1855.3m

              而每一分又有60秒,每一秒就代表1855.3m/60=30.92m

              任意兩點距離計算公式為

              d=111.12cos{1/[sinΦAsinΦB十cosΦAcosΦBcos(λB—λA)]}

              其中A點經度,緯度分別為λA和ΦA,B點的經度、緯度分別為λB和ΦB,d為距離。


            posted on 2008-02-28 15:18 Khan 閱讀(16261) 評論(11)  編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺開發Java 、周邊技術

            評論

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            公式不準
            2008-07-10 09:51 | Mr.Fan

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            沒對
            2008-08-05 21:42 |

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            公式 d=111.12cos{1/[sinΦAsinΦB十cosΦAcosΦBcos(λB—λA)]} 肯定是錯的:cos 的值在-1 到 1 之間,111.12cos{...} 其絕對值不超過111.12.
            這個公式算出的結果意味著任意兩點之間的距離小于111.12.
            2008-09-23 22:58 | huang

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            沒有參考價值
            2009-08-27 15:28 | guoke

            # re: 通過兩個點的經緯度計算距離[未登錄]  回復  更多評論   

            public static void main(String args[]) {
            double latA=rad(36.6),lngA=rad(116.4);
            double latB=rad(36.7),lngB=rad(116.4);
            //double d=111.12*Math.cos(1/(Math.sin(latA)*Math.sin(latB)+Math.cos(latA)*Math.cos(latB)*Math.cos(lngB-lngA)));
            double d=2*Math.asin(Math.sqrt(Math.pow(Math.sin((latA-latB)/2), 2)+Math.cos(latA)*Math.cos(latB)*Math.pow(Math.sin((lngA-lngB)/2), 2)))*6378.137;
            System.out.println(d);


            }

            private static double rad(double d){
            return d * Math.PI / 180.0;
            }
            2009-12-18 10:32 | bo

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            請問返回的是千米嗎?
            2011-08-17 12:02 | 香香

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            這個是我的QQ 等樓主有空了 能告訴我一下嗎
            2011-08-17 12:03 | 香香

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            1608036033
            2011-08-17 12:03 | 香香

            # re: 通過兩個點的經緯度計算距離[未登錄]  回復  更多評論   

            @huang
            那個貌似是Asin 吧,怎么可能會只在在-1~1
            2011-08-27 16:22 | 1

            # re: 通過兩個點的經緯度計算距離[未登錄]  回復  更多評論   

            @香香


            最后經過一個 round 應該是千米 吧
            2011-08-27 16:23 | 1

            # re: 通過兩個點的經緯度計算距離  回復  更多評論   

            你好 ,我看過可以用兩個標志物計算經緯度的
            2011-10-12 23:26 | 洛麗塔
            青青青国产精品国产精品久久久久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 亚洲va久久久噜噜噜久久男同 | 77777亚洲午夜久久多喷| 亚洲国产另类久久久精品小说| 久久99久久99精品免视看动漫| 国色天香久久久久久久小说 | 国产精品久久久久9999高清| 国产高潮国产高潮久久久| 91精品国产综合久久香蕉| 婷婷久久综合| 亚洲国产精品无码久久九九| 国产精品99久久久精品无码 | 三级三级久久三级久久| 亚洲国产精品无码久久久不卡| 狠狠色丁香久久婷婷综合五月 | 亚洲AV无码久久寂寞少妇| 成人妇女免费播放久久久| 久久午夜综合久久| 人妻丰满AV无码久久不卡| 国产精品美女久久久网AV| 无码人妻久久一区二区三区免费| 91精品国产色综久久| 色妞色综合久久夜夜| 久久久久国产成人精品亚洲午夜| 亚洲综合伊人久久综合| 精品久久久无码中文字幕天天| 香蕉久久久久久狠狠色| 国产L精品国产亚洲区久久 | 婷婷国产天堂久久综合五月| 99久久国产综合精品麻豆| 无码任你躁久久久久久老妇App| 国产精品久久久久久| 久久亚洲精品国产精品| 99久久做夜夜爱天天做精品| 国内精品久久久久国产盗摄| 国产精品久久久久jk制服| 无码人妻久久一区二区三区免费丨 | 伊人久久综合精品无码AV专区| 久久国产精品免费一区二区三区| 99久久国产热无码精品免费|