最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用GPS經(jīng)緯度定位附近地點(某一點范圍內(nèi)查詢)

 更新時間:2013年12月30日 09:49:19   作者:  
目前的工作是需要手機查找附近N米以內(nèi)的商戶,致想法是已知一個中心點,一個半徑,求圓包含于圓拋物線里所有的點,經(jīng)緯度是一個點,半徑是一個距離,不能直接加減,下面提供C#的解決方法

數(shù)據(jù)庫中記錄了商家在百度標(biāo)注的經(jīng)緯度(如:116.412007, 39.947545)

最初想法,以圓心點為中心點,對半徑做循環(huán),半徑每增加一個像素(暫定1米)再對周長做循環(huán),到數(shù)據(jù)庫中查詢對應(yīng)點的商家(真是一個長時間的循環(huán)工作),上網(wǎng)百度類似的文章有了點眉目

大致想法是已知一個中心點,一個半徑,求圓包含于圓拋物線里所有的點,這樣的話就需要知道所要求的這個圓的對角線的頂點,問題來了 經(jīng)緯度是一個點,半徑是一個距離,不能直接加減

復(fù)制代碼 代碼如下:

/// <summary>
    /// 經(jīng)緯度坐標(biāo)
    /// </summary>   

  public class Degree
    {
        public Degree(double x, double y)
        {
            X = x;
            Y = y;
        }
        private double x;

        public double X
        {
            get { return x; }
            set { x = value; }
        }
        private double y;

        public double Y
        {
            get { return y; }
            set { y = value; }
        }
    }


    public class CoordDispose
    {
        private const double EARTH_RADIUS = 6378137.0;//地球半徑(米)

        /// <summary>
        /// 角度數(shù)轉(zhuǎn)換為弧度公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double radians(double d)
        {
            return d * Math.PI / 180.0;
        }

        /// <summary>
        /// 弧度轉(zhuǎn)換為角度數(shù)公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double degrees(double d)
        {
            return d * (180 / Math.PI);
        }

        /// <summary>
        /// 計算兩個經(jīng)緯度之間的直接距離
        /// </summary>

        public static double GetDistance(Degree Degree1, Degree Degree2)
        {
            double radLat1 = radians(Degree1.X);
            double radLat2 = radians(Degree2.X);
            double a = radLat1 - radLat2;
            double b = radians(Degree1.Y) - radians(Degree2.Y);

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

        /// <summary>
        /// 計算兩個經(jīng)緯度之間的直接距離(google 算法)
        /// </summary>
        public static double GetDistanceGoogle(Degree Degree1, Degree Degree2)
        {
            double radLat1 = radians(Degree1.X);
            double radLng1 = radians(Degree1.Y);
            double radLat2 = radians(Degree2.X);
            double radLng2 = radians(Degree2.Y);

            double s = Math.Acos(Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Cos(radLng1 - radLng2) + Math.Sin(radLat1) * Math.Sin(radLat2));
            s = s * EARTH_RADIUS;
            s = Math.Round(s * 10000) / 10000;
            return s;
        }

        /// <summary>
        /// 以一個經(jīng)緯度為中心計算出四個頂點
        /// </summary>
        /// <param name="distance">半徑(米)</param>
        /// <returns></returns>
        public static Degree[] GetDegreeCoordinates(Degree Degree1, double distance)
        {
            double dlng = 2 * Math.Asin(Math.Sin(distance / (2 * EARTH_RADIUS)) / Math.Cos(Degree1.X));
            dlng = degrees(dlng);//一定轉(zhuǎn)換成角度數(shù)  原PHP文章這個地方說的不清楚根本不正確 后來lz又查了很多資料終于搞定了

            double dlat = distance / EARTH_RADIUS;
            dlat = degrees(dlat);//一定轉(zhuǎn)換成角度數(shù)

            return new Degree[] { new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-top
                                  new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-bottom
                                  new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y + dlng,6)),//right-top
                                  new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y + dlng,6)) //right-bottom
            };

        }
    }

測試方法:

復(fù)制代碼 代碼如下:

static void Main(string[] args)
        {
            double a = CoordDispose.GetDistance(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));//116.416984,39.944959
            double b = CoordDispose.GetDistanceGoogle(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));
            Degree[] dd = CoordDispose.GetDegreeCoordinates(new Degree(116.412007, 39.947545), 102);
            Console.WriteLine(a+" "+b);
            Console.WriteLine(dd[0].X + "," + dd[0].Y );
            Console.WriteLine(dd[3].X + "," + dd[3].Y);
            Console.ReadLine();
        }

試了很多次 誤差在1米左右

拿到圓的頂點就好辦了

數(shù)據(jù)庫要是sql 2008的可以直接進(jìn)行空間索引經(jīng)緯度字段,這樣應(yīng)該性能更好(沒有試過)

lz公司數(shù)據(jù)庫還老 2005的 這也沒關(guān)系,關(guān)鍵是經(jīng)緯度拆分計算,這個就不用說了 網(wǎng)上多的是 最后上個實現(xiàn)的sql語句

復(fù)制代碼 代碼如下:

SELECT id,zuobiao FROM dbo.zuobiao WHERE zuobiao<>'' AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)>116.41021 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)<116.413804 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',2)<39.949369 AND
dbo.Get_StrArrayStrOfIndex(zuobiao,',',2)>39.945721

相關(guān)文章

  • C# 使用modbus 讀取PLC 寄存器地址的方法

    C# 使用modbus 讀取PLC 寄存器地址的方法

    今天通過本文給大家介紹C# 使用modbus 讀取PLC 寄存器地址的方法,使用的組件Nmodbus,文中通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-10-10
  • C#連接SQLite數(shù)據(jù)庫并實現(xiàn)基本操作

    C#連接SQLite數(shù)據(jù)庫并實現(xiàn)基本操作

    本文介紹了SQLite,一個輕量級的跨平臺數(shù)據(jù)庫管理系統(tǒng),以及如何在C#中使用System.Data.SQLite庫進(jìn)行操作,包括創(chuàng)建、修改和查詢數(shù)據(jù)庫,以及使用SQLiteHelper類簡化SQL使用,此外,還提到了DB文件查看工具SQLiteSpy的應(yīng)用,需要的朋友可以參考下
    2024-12-12
  • C# WindowsForm程序同時啟動多個窗口類

    C# WindowsForm程序同時啟動多個窗口類

    這篇文章主要為大家詳細(xì)介紹了C# WindowsForm程序同時啟動多個窗口類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 使用Linq注意事項避免報錯的方法

    使用Linq注意事項避免報錯的方法

    這篇文章主要介紹了使用Linq注意事項避免報錯的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C# 大數(shù)據(jù)導(dǎo)出word的假死報錯的處理方法

    C# 大數(shù)據(jù)導(dǎo)出word的假死報錯的處理方法

    C# 大數(shù)據(jù)導(dǎo)出word的假死報錯的處理方法,需要的朋友可以參考一下
    2013-03-03
  • C#計算兩個文件的相對目錄算法的實例代碼

    C#計算兩個文件的相對目錄算法的實例代碼

    現(xiàn)在已知兩個文件相對于網(wǎng)站根目錄的路徑,如何計算相對路徑呢,有需要的朋友可以參考一下
    2013-09-09
  • C#圖片處理類分享

    C#圖片處理類分享

    這篇文章主要為大家分享了C#圖片處理類的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#中new的用法及與override的區(qū)別分析

    C#中new的用法及與override的區(qū)別分析

    這篇文章主要介紹了C#中new的用法,及與override的區(qū)別,需要的朋友可以參考下
    2017-05-05
  • C#基于正則去掉注釋的方法示例

    C#基于正則去掉注釋的方法示例

    這篇文章主要介紹了C#基于正則去掉注釋的方法,結(jié)合簡單實例形式分析了C#針對注釋符號的正則匹配相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C# linq查詢之動態(tài)OrderBy用法實例

    C# linq查詢之動態(tài)OrderBy用法實例

    這篇文章主要介紹了C# linq查詢之動態(tài)OrderBy用法,實例分析了C#采用linq方式查詢時動態(tài)排序的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評論

横山县| 奎屯市| 周宁县| 阳西县| 泌阳县| 梅河口市| 惠安县| 五寨县| 北流市| 壤塘县| 新平| 乐清市| 汕尾市| 台中县| 万年县| 洱源县| 星座| 太原市| 周宁县| 四子王旗| 米林县| 阿勒泰市| 正镶白旗| 密山市| 甘孜| 陵水| 开阳县| 舞阳县| 沧源| 普定县| 西峡县| 景东| 桓仁| 漯河市| 凌源市| 双桥区| 灵台县| 宝坻区| 巴彦淖尔市| 翼城县| 大丰市|