九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
根據(jù)2個(gè)經(jīng)緯度點(diǎn),計(jì)算這2個(gè)經(jīng)緯度點(diǎn)之間的距離

 


 


根據(jù)2個(gè)經(jīng)緯度點(diǎn),計(jì)算這2個(gè)經(jīng)緯度點(diǎn)之間的距離


 


 


球面上任意兩點(diǎn)之間的距離計(jì)算公式可以參考維基百科上的下述文章。



值得一提的是,維基百科推薦使用Haversine公式,理由是Great-circle distance公式用到了大量余弦函數(shù), 而兩點(diǎn)間距離很短時(shí)(比如地球表面上相距幾百米的兩點(diǎn)),余弦函數(shù)會(huì)得出0.999...的結(jié)果, 會(huì)導(dǎo)致較大的舍入誤差。而Haversine公式采用了正弦函數(shù),即使距離很小,也能保持足夠的有效數(shù)字。 以前采用三角函數(shù)表計(jì)算時(shí)的確會(huì)有這個(gè)問題,但經(jīng)過實(shí)際驗(yàn)證,采用計(jì)算機(jī)來計(jì)算時(shí),兩個(gè)公式的區(qū)別不大。 穩(wěn)妥起見,這里還是采用Haversine公式。


 


其中


 



  • R為地球半徑,可取平均值 6371km;

  • φ1, φ2 表示兩點(diǎn)的緯度;

  • Δλ 表示兩點(diǎn)經(jīng)度的差值。


根據(jù)2個(gè)經(jīng)緯度坐標(biāo),距離計(jì)算函數(shù)


下面就是計(jì)算球面間兩點(diǎn)(lat1, lon1) - (lat2, lon2)之間距離的函數(shù)。



using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace HarvenSin{    class Program    {        /// <summary>        /// 根據(jù)經(jīng)緯度,計(jì)算2個(gè)點(diǎn)之間的距離。        /// </summary>        /// <param name="args"></param>        static void Main(string[] args)        {            //39.94607,116.32793  31.24063,121.42575            Console.WriteLine(Distance(39.94607, 116.32793, 31.24063, 121.42575));        }        public static double HaverSin(double theta)        {            var v = Math.Sin(theta / 2);            return v * v;        }        static double EARTH_RADIUS = 6371.0;//km 地球半徑 平均值,千米        /// <summary>        /// 給定的經(jīng)度1,緯度1;經(jīng)度2,緯度2. 計(jì)算2個(gè)經(jīng)緯度之間的距離。        /// </summary>        /// <param name="lat1">經(jīng)度1</param>        /// <param name="lon1">緯度1</param>        /// <param name="lat2">經(jīng)度2</param>        /// <param name="lon2">緯度2</param>        /// <returns>距離(公里、千米)</returns>        public static double Distance(double lat1,double lon1, double lat2,double lon2)        {            //用haversine公式計(jì)算球面兩點(diǎn)間的距離。            //經(jīng)緯度轉(zhuǎn)換成弧度            lat1 = ConvertDegreesToRadians(lat1);            lon1 = ConvertDegreesToRadians(lon1);            lat2 = ConvertDegreesToRadians(lat2);            lon2 = ConvertDegreesToRadians(lon2);            //差值            var vLon = Math.Abs(lon1 - lon2);            var vLat = Math.Abs(lat1 - lat2);            //h is the great circle distance in radians, great circle就是一個(gè)球體上的切面,它的圓心即是球心的一個(gè)周長(zhǎng)最大的圓。            var h = HaverSin(vLat) + Math.Cos(lat1) * Math.Cos(lat2) * HaverSin(vLon);            var distance = 2 * EARTH_RADIUS * Math.Asin(Math.Sqrt(h));            return distance;        }        /// <summary>        /// 將角度換算為弧度。        /// </summary>        /// <param name="degrees">角度</param>        /// <returns>弧度</returns>        public static double ConvertDegreesToRadians(double degrees)        {            return degrees * Math.PI / 180;        }        public static double ConvertRadiansToDegrees(double radian)        {            return radian * 180.0 / Math.PI;        }    }}


 


 


公式來歷:


VERSINE(F)=1-cos(F)


 


 


Haversine名字來歷是Ha-VERSINE,即Half-Versine ,表示sin的一半的意思。


 


hav(A) = (1-cos(A))/2 = sin(A/2)* sin(A/2)


 


推倒過程:


 


如下一個(gè)半徑為1 的圓,O是圓心,A、B是弦(chord)。角度AOB=theta。則角度AOC=theta/2。OC是垂直于AB的垂線(perpendicular)。AC長(zhǎng)度是sin(theta/2),AB長(zhǎng)度是2*sin(theta/2)。


 


(圖1)


如下地球圖所示,假設(shè)半徑R為1,O是球心,A (lat1,lon1) 和 B (lat2,lon2) 是我們感興趣的2個(gè)點(diǎn)。2跟經(jīng)度線 lon1,lon2相交于北極(north pole)N。EF所在的線是赤道(equator)。ACBD是平面上的等腰梯形的四個(gè)頂點(diǎn)(vertice)。AC和DB的弦(直線)在圖上沒有畫出。CD的位置是:C (lat2,lon1) and D (lat1,lon2)。角度AOC是A點(diǎn)與C點(diǎn)的緯度差 dlat。角度EOF是經(jīng)度E點(diǎn)和經(jīng)度F點(diǎn)的差dlon。


 


 


 


(圖2)


弦AC的長(zhǎng)度,參照?qǐng)D1的方式,那么是AC=2*sin(dlat/2),弦BD也是一樣的長(zhǎng)度。


E、F 2個(gè)點(diǎn)是赤道上的2個(gè)點(diǎn),它們的緯度是0。EF的距離是EF=2*sin(dlon/2)


A、D2個(gè)點(diǎn)所在的緯度是lat1。AD所在緯度的圓平面的半徑是cos(lat1)。從A作一條垂線(perpendicular)到OE為AG,AO是球半徑,則OG=cos(lat1),即A、D所在緯度圓圈的半徑(AO`)。


這時(shí)候,AD的弦長(zhǎng)AD= 2*sin(dlon/2)*cos(lat1),類似的可以推出CB的長(zhǎng)度= CB=2*sin(dlon/2)*cos(lat2)


 


下面看一下如何求AB的長(zhǎng)度,回到平面等腰梯形,如下圖:


 


 


(圖3)


AH是到CB的垂線(perpendicular),CH= (CB-AD)/2。


根據(jù)勾股定理(Pythagorean theorem): 【^2表示2的平方】


AH^2 = AC^2 - CH^2


       = AC^2 - (CB-AD)^2/4


 


HB 的長(zhǎng)度是HB=AD+CH = AD+(CB-AD)/2 = (CB+AD)/2,根據(jù)勾股定理得到:


  AB^2 = AH^2 + HB^2


       = AC^2 - (CB-AD)^2/4 + (CB+AD)^2/4


       = AC^2 + CB*AD


根據(jù)前面球面上的求經(jīng)緯距離的方式,我們已經(jīng)得到 AC、AD和CB的長(zhǎng)度,代入公式得到:


 


  AB^2 = 4*(sin^2(dlat/2) + 4*cos(lat1)*cos(lat2)*sin^2(dlon/2))


 


假設(shè)中間值h 是AB長(zhǎng)度一半的平方,如下


 


  h = (AB/2)^2


    = (sin^2(dlat/2)) + cos(lat1) * cos(lat2) * sin^2(dlon/2)


  (請(qǐng)參看代碼里的h)


最后一步,是求得代表AB長(zhǎng)度的角度AOB。參照?qǐng)D1的方式,我們可以知道


 


(圖4)


設(shè)AC=

,根據(jù)勾股定理(Pythagorean theorem)得到:


OC= 

= sqrt(OA^2 - AC^2)


         = 

= sqrt(1-a)   // sqrt表示開根號(hào)


 


如果設(shè)c是角AOB的度數(shù)值。


tan(<AOC) = tan(c)= AC/OC = sqrt(a)/sqrt(1-a)


則:


  c = 2 * arctan(sqrt(a)/sqrt(1-a)),


最后的AB真實(shí)距離,把地球半徑帶上就可以了。


distance = 2 * EARTH_RADIUS * c。


 


結(jié)束。


參考資料:


http://mathforum.org/library/drmath/view/51879.html


http://blog.charlee.li/location-search/


 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
根據(jù)兩點(diǎn)經(jīng)緯度計(jì)算距離
java gps distance
地球坐標(biāo),火星坐標(biāo),百度坐標(biāo)轉(zhuǎn)換
經(jīng)緯度坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)
利用Python中的的pyproj庫實(shí)現(xiàn)地理坐標(biāo)向投影坐標(biāo)轉(zhuǎn)換
百度坐標(biāo)坐標(biāo)系之間的轉(zhuǎn)換(JS版代碼)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服