亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

使用GPS經緯度定位附近地點(某一點范圍內查詢)

2020-01-24 02:57:36
字體:
來源:轉載
供稿:網友

數據庫中記錄了商家在百度標注的經緯度(如:116.412007, 39.947545)

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

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

復制代碼 代碼如下:

/// <summary>
    /// 經緯度坐標
    /// </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>
        /// 角度數轉換為弧度公式
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        private static double radians(double d)
        {
            return d * Math.PI / 180.0;
        }

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

        /// <summary>
        /// 計算兩個經緯度之間的直接距離
        /// </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>
        /// 計算兩個經緯度之間的直接距離(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>
        /// 以一個經緯度為中心計算出四個頂點
        /// </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);//一定轉換成角度數  原PHP文章這個地方說的不清楚根本不正確 后來lz又查了很多資料終于搞定了

            double dlat = distance / EARTH_RADIUS;
            dlat = degrees(dlat);//一定轉換成角度數

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

        }
    }

測試方法:

復制代碼 代碼如下:

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米左右

拿到圓的頂點就好辦了

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

lz公司數據庫還老 2005的 這也沒關系,關鍵是經緯度拆分計算,這個就不用說了 網上多的是 最后上個實現的sql語句

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产精品自产a区红杏吧| 欧美亚洲一级片| 中文字幕久热精品视频在线| 亚洲天堂av在线免费| 国产精品jizz在线观看麻豆| 国内精品久久久久久久久| 亚洲最大的av网站| 久久久久久久一区二区| 日韩精品中文字幕有码专区| 亚洲欧美变态国产另类| 国产成人鲁鲁免费视频a| 久久久久久久久久国产精品| 中文字幕av日韩| 亚洲欧美日韩成人| 久热精品视频在线观看| 亚洲成色777777在线观看影院| 日韩欧美在线免费| 日韩美女毛茸茸| 日韩在线观看免费全| 国内精品视频在线| 亚洲国产精品网站| 欧美最猛性xxxxx(亚洲精品)| 黑人巨大精品欧美一区二区| 日韩网站在线观看| 国模私拍视频一区| 日韩在线视频观看| 日韩精品亚洲精品| 2024亚洲男人天堂| 欧美在线日韩在线| 亚洲国产精品99| 日韩在线播放视频| 成人看片人aa| 91精品视频免费| 日韩电影免费在线观看| 日韩经典第一页| 亚洲欧洲高清在线| 久久视频在线观看免费| 日韩视频―中文字幕| 日韩在线观看你懂的| 亚洲精品日韩欧美| 久久国产精品网站| 国产精品吹潮在线观看| 亚洲图中文字幕| 欧美激情精品久久久| 国产精品欧美在线| 国产丝袜视频一区| 国产精品999999| 久久97精品久久久久久久不卡| 日韩电影在线观看永久视频免费网站| 国产精品久久中文| 欧美成人激情在线| 亚洲欧美日韩天堂| 97在线视频免费观看| 欧美专区国产专区| 欧美xxxx做受欧美.88| 欧美洲成人男女午夜视频| 激情亚洲一区二区三区四区| 亚洲午夜精品久久久久久性色| 亚洲图片欧洲图片av| 日韩网站免费观看| www国产亚洲精品久久网站| 日韩电视剧免费观看网站| 亚洲免费影视第一页| 久久精视频免费在线久久完整在线看| 国产香蕉一区二区三区在线视频| 韩国福利视频一区| 欧美激情精品久久久久久免费印度| 亚洲成人性视频| 国产精品亚发布| 欧美激情免费视频| 国产精品久久久久久亚洲调教| 欧美日韩国产中文字幕| 国产精品自产拍高潮在线观看| 亚洲韩国日本中文字幕| 国产一区二区日韩精品欧美精品| 国产大片精品免费永久看nba| 色视频www在线播放国产成人| 91国内免费在线视频| 俺去啦;欧美日韩| 欧美亚洲成人网| 91精品免费视频| 国产日韩欧美自拍| 欧美福利视频在线| 久久中文字幕视频| 夜色77av精品影院| 国产精品久久婷婷六月丁香| 日韩专区中文字幕| 国产极品jizzhd欧美| 91av在线不卡| 欧美日韩中文字幕| 国产丝袜一区二区三区| 黑人狂躁日本妞一区二区三区| 91啪国产在线| 日本一区二区三区在线播放| 91精品综合视频| 麻豆国产va免费精品高清在线| 97精品国产aⅴ7777| 色综合久久天天综线观看| 国产欧美精品日韩精品| 91精品国产91久久久久久不卡| 丝袜亚洲另类欧美重口| 国产精品香蕉国产| 欧美一性一乱一交一视频| 国产一区二区三区在线播放免费观看| 日韩av手机在线观看| 国产精品女主播| 欧美精品在线第一页| 欧美激情综合亚洲一二区| 久久91亚洲人成电影网站| 日韩在线观看网址| 色综合久综合久久综合久鬼88| 亚洲色图五月天| 91国产精品视频在线| 国产日韩精品电影| 国产精品一区=区| 日韩美女主播视频| 久久色免费在线视频| 亚洲码在线观看| 欧美成人黑人xx视频免费观看| 秋霞午夜一区二区| 欧美激情xxxx性bbbb| 亚洲成人精品av| 欧美黑人又粗大| 国产精品精品久久久久久| 日韩视频欧美视频| 国产精品v片在线观看不卡| 欧美激情va永久在线播放| 97在线免费观看| 精品av在线播放| 97人人模人人爽人人喊中文字| 久久久在线视频| 久久久久久久久久久人体| 亚洲成人激情图| 一区二区av在线| 国产成人在线一区| 国产精品视频男人的天堂| 亚洲一级免费视频| 亚洲精品日韩欧美| 97精品一区二区视频在线观看| 国产精品久久久久久亚洲调教| 久久精品免费电影| 91精品国产91久久久| 欧美福利视频在线| 国产91精品久久久久久久| 97成人精品视频在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 91免费看国产| 日韩久久精品成人| 久久久精品2019中文字幕神马| 欧美黑人xxxx| 在线电影av不卡网址| 亚洲视频999| 国产午夜精品美女视频明星a级| 亚洲视频在线免费看| 精品中文字幕久久久久久| 亚洲国产古装精品网站| 国产成人91久久精品| 91久久在线观看| 亚洲欧美福利视频| 九九久久国产精品| 国产一区二区三区网站| 国产精品久久久久久av| 一区二区三区视频在线| 美女av一区二区三区|