• <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

            路漫漫,長(zhǎng)修遠(yuǎn),我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離

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

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



            同緯度計(jì)算比較簡(jiǎn)單

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



            原理:

            地球赤道上環(huán)繞地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的長(zhǎng)度計(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ΦAsinΦB十cosΦAcosΦBcos(λB—λA)]}

              其中A點(diǎn)經(jīng)度,緯度分別為λA和ΦA,B點(diǎn)的經(jīng)度、緯度分別為λB和ΦB,d為距離。


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

            評(píng)論

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

            公式不準(zhǔn)
            2008-07-10 09:51 | Mr.Fan

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

            沒對(duì)
            2008-08-05 21:42 |

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

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

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

            沒有參考價(jià)值
            2009-08-27 15:28 | guoke

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離[未登錄]  回復(fù)  更多評(pí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: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

            請(qǐng)問返回的是千米嗎?
            2011-08-17 12:02 | 香香

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

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

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

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

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離[未登錄]  回復(fù)  更多評(píng)論   

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

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離[未登錄]  回復(fù)  更多評(píng)論   

            @香香


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

            # re: 通過兩個(gè)點(diǎn)的經(jīng)緯度計(jì)算距離  回復(fù)  更多評(píng)論   

            你好 ,我看過可以用兩個(gè)標(biāo)志物計(jì)算經(jīng)緯度的
            2011-10-12 23:26 | 洛麗塔
            久久精品这里热有精品| 久久天天躁狠狠躁夜夜2020 | 久久免费看黄a级毛片| 伊人久久大香线蕉亚洲五月天| 人妻少妇久久中文字幕一区二区 | 天天躁日日躁狠狠久久| 久久精品国产99国产电影网| 久久久精品久久久久久 | 999久久久无码国产精品| 久久精品亚洲男人的天堂| 久久久久高潮综合影院| www亚洲欲色成人久久精品| 日产精品久久久久久久| 久久精品国产一区二区三区日韩| 久久久久人妻精品一区三寸蜜桃| 亚洲国产另类久久久精品黑人| 国产精品内射久久久久欢欢| 伊人久久大香线蕉亚洲五月天 | 亚洲精品97久久中文字幕无码| 久久青青草原亚洲av无码app | 久久亚洲欧洲国产综合| 99久久这里只有精品| 久久午夜无码鲁丝片秋霞| 国产精品激情综合久久| 久久99热只有频精品8| 77777亚洲午夜久久多喷| 久久久久无码精品国产app| 99久久婷婷免费国产综合精品| 国产A三级久久精品| 中文字幕精品无码久久久久久3D日动漫 | 久久国产成人午夜aⅴ影院| 亚洲精品乱码久久久久久| 亚洲精品WWW久久久久久| 国产精品嫩草影院久久| a级毛片无码兔费真人久久| 欧美精品一本久久男人的天堂| 亚洲狠狠婷婷综合久久蜜芽| 国产A级毛片久久久精品毛片| 久久夜色精品国产亚洲| 久久亚洲国产成人影院| 久久久久久久91精品免费观看|