• <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 閱讀(16262) 評論(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 | 洛麗塔
            国内精品人妻无码久久久影院导航 | 97精品国产97久久久久久免费| 亚洲精品国精品久久99热| 久久国产欧美日韩精品免费| 夜夜亚洲天天久久| 亚洲一级Av无码毛片久久精品| 新狼窝色AV性久久久久久| 51久久夜色精品国产| 久久久国产打桩机| 久久天堂电影网| 久久婷婷五月综合成人D啪| 久久er热视频在这里精品| 免费精品国产日韩热久久| 国产精品久久网| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲国产精品婷婷久久| 99久久99久久精品国产片果冻| 人人狠狠综合久久亚洲88| 国产成人精品久久| 精品99久久aaa一级毛片| 九九久久99综合一区二区| 97精品依人久久久大香线蕉97| 久久久免费观成人影院| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久久久人妻精品一区| 伊人伊成久久人综合网777| 久久婷婷人人澡人人| 久久精品中文字幕第23页| 久久久久久亚洲精品不卡| 久久er国产精品免费观看2| 成人久久久观看免费毛片| 国产精品久久久久久吹潮| 人妻精品久久久久中文字幕一冢本| 伊人热热久久原色播放www| 久久亚洲中文字幕精品一区| 欧美精品国产综合久久| 久久人人添人人爽添人人片牛牛| 亚洲日韩欧美一区久久久久我 | 亚洲国产成人精品91久久久 | 久久噜噜电影你懂的| 日本精品久久久久中文字幕8|