• <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
            數(shù)據(jù)加載中……

            通過兩個點的經(jīng)緯度計算距離

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

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




            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))     '沒有反正弦函數(shù),網(wǎng)上找了個
            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)兩點之間,此段代碼和我用余弦定理算出來的結(jié)果很一致。
            余弦定理的步驟是:1、算A、B弦長:地球半徑R*cos(經(jīng)度差60)=R/2;
            2、算角AOB,O為地球圓心,利用余弦定理,
            cosAOB=(2R*R-(R/2)^2) /2*R*R=7/8;
            3、弧AB的長為:R*arc cos(7/8);求畢



            原理:

            地球赤道上環(huán)繞地球一周走一圈共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點經(jīng)度,緯度分別為λA和ΦA,B點的經(jīng)度、緯度分別為λB和ΦB,d為距離。


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

            評論

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

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

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

            沒對
            2008-08-05 21:42 |

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

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

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

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

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

            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: 通過兩個點的經(jīng)緯度計算距離  回復  更多評論   

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

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

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

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

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

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

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

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

            @香香


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

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

            你好 ,我看過可以用兩個標志物計算經(jīng)緯度的
            2011-10-12 23:26 | 洛麗塔
            激情综合色综合久久综合| 久久精品男人影院| 国内精品综合久久久40p| 久久久久亚洲精品日久生情 | 久久AAAA片一区二区| 久久国产热这里只有精品| 无码精品久久一区二区三区 | 亚洲AV无码久久寂寞少妇| 99re久久精品国产首页2020| 成人a毛片久久免费播放| 欧美色综合久久久久久| 亚洲αv久久久噜噜噜噜噜| 青草影院天堂男人久久| 久久久高清免费视频| 国产精品久久久久久福利漫画| 久久精品无码一区二区三区免费| 久久久久亚洲精品日久生情| 色综合久久最新中文字幕| 狠狠色丁香久久婷婷综合_中 | 亚洲国产小视频精品久久久三级| 久久婷婷五月综合色高清| 久久国产成人精品国产成人亚洲| 亚洲精品无码久久久久去q| 国产精品午夜久久| 亚洲AV日韩AV永久无码久久| 精品无码久久久久久国产| 色欲综合久久躁天天躁蜜桃| 久久国产精品一区| 国产精品美女久久久| 久久久无码精品亚洲日韩京东传媒 | 99久久夜色精品国产网站| 99久久精品国产毛片| 久久人爽人人爽人人片AV| 久久人妻少妇嫩草AV蜜桃| 久久香蕉国产线看观看乱码| AV无码久久久久不卡蜜桃| 久久午夜福利电影| 91精品国产色综久久| 蜜臀av性久久久久蜜臀aⅴ| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲午夜久久久久久久久久|