`

根据经纬度,计算距离最近的周边商家【转】

    博客分类:
  • C#
阅读更多
摘要:目前的工作是需要手机查找附近N米以内的商户,功能如下图数据库中记录了商家在百度标注的经纬度(如:116.412007,39.947545),最初想法以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作)上网百度类似的文章有了点眉目大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了经纬度是一个点,半径是一个距离



数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545),

最初想法  以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作)

上网百度类似的文章有了点眉目

大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了 经纬度是一个点,半径是一个距离,不能直接加减

终于找到想要的文章

http://digdeeply.org/archives/06152067.html

参考原文章 lz改成了C#类

参考附件11111

以下是代码:
/// <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();
        }



数据库中计算的方式
6371.004  地球半径
6371.004*ACOS(SIN(@GPSLat/180*PI())*SIN(@Lat/180*PI())+COS(@GPSLat/180*PI())*COS(@Lat/180*PI())*COS((@GPSLng-@Lng)/180*PI()))  计算公式 可查球面弧长计算公式的详细解释【弧长也就是两点之间的距离了】
  • 大小: 59.1 KB
分享到:
评论

相关推荐

    百度地图,测量距离+经纬度

    3. 商家在选择店铺位置时,可以分析周边环境,测量到公交站、停车场的距离,以便于客户到达。 4. 旅行者可以规划自驾游路线,通过测量不同景点间的距离来安排行程。 综上所述,百度地图的测量距离和获取经纬度功能...

    LBS位置服务的SQL实现原理以及SQL代码

    接下来,服务器需要根据这些经纬度坐标,在数据库中查找并返回距离用户最近的一系列商家信息。 - **SQL计算经纬度距离的自定义函数**:为了计算两点之间的距离,可以使用SQL中的自定义函数`GetDistance`。这个函数...

    地图定位和线路查询

    例如,O2O服务中用于查找周边商家;物流配送中规划最优路线;旅游应用中显示景点分布;社交软件中分享位置信息等。开发者需了解如何结合业务需求,有效利用地图API来提升用户体验。 在提供的"百度地图线路查询标记...

    基于android的电子商务系统.pdf

    在电子商务系统中,用户的位置信息用于查找附近的商家,通过比较经纬度,展示按距离排序的周边服务。 3.2 SQLite数据库 SQLite是Android内置的关系型数据库,适用于嵌入式设备,占用资源少。SQLiteOpenHelper是...

    安卓软件开发--毕业设计开题报告安卓软件文献翻译(精).docx

    在毕业设计项目中,可以将用户的经纬度发送至服务器,计算出最近的商家,并按照距离排序展示周边环境。 SQLite是Android系统自带的关系型数据库,特别适合嵌入式应用,占用资源少,操作简便。Android提供了...

    自贡市建筑物百度地图.zip

    此外,矢量数据支持复杂的地理分析,如距离计算、缓冲区分析、网络分析等,对于城市规划、交通管理等领域非常有用。 二、自贡市建筑物信息 自贡市,位于中国四川省南部,是一个历史悠久的城市,拥有丰富的文化遗产...

    阿里天池的商场定位比赛.zip

    对于地理位置数据,可能需要考虑经纬度与距离计算、聚类分析等GIS相关特征。 四、地理信息系统(GIS) GIS技术在商场定位中尤为重要,因为它可以处理地理位置数据。参赛者可能需要结合地图数据,计算店铺与居民区、...

    google map应用

    3. **谷歌距离矩阵服务**:计算多点之间的距离和行驶时间,适用于路线规划应用。 四、企业服务 1. **谷歌地图商务版**:为企业提供定制化的地图解决方案,如内部地图、员工导航、资产追踪等。 2. **商家信息管理**...

    吉林诗北师大附中净月校区2016届高三地理上学期限时训练29

    3. 海上航线:从徐州到甲国,最近的海上航线可能会经过苏伊士运河,因为这通常是连接亚洲和非洲最短的航线,而好望角、巴拿马运河、麦哲伦海峡分别位于非洲南部、美洲中部和南美洲南部,距离较远。 4. 雪线高度与...

    电信设备-基于即时通讯社交应用的位置分享及导航方法.zip

    商家可以通过位置信息推送周边优惠活动,用户则能根据当前位置发现附近的餐馆、商场等生活设施,实现O2O(线上到线下)的无缝对接。 总的来说,基于即时通讯社交应用的位置分享及导航方法,是信息技术与日常生活的...

    【全国重点城市POI数据】-上海数据-餐饮.zip

    3. **经纬度**:精确的地理位置坐标,便于在地图上展示和进行距离计算。 4. **类别**:如快餐、正餐、甜品、咖啡馆等,揭示了餐饮业态的多样性。 5. **营业时间**:了解店铺的运营时段,有助于理解消费者的活动模式...

    基于Android手机的地图应用设计与开发

    - **轨迹跟踪**:记录用户的行驶路径并计算行驶距离。 - **资讯查询**:根据用户当前位置查询附近信息,如影院、商家等。 - **好友通信**:显示好友位置并支持聊天通信功能。 - **日志备忘**:具备日志记录功能...

    Google Earth v4.3 中文用户手册

    此外,它还支持查询行车路线和周边商家信息,是出行规划的得力助手。 2. **纵览窗口**:提供当前3D视图的概览,帮助用户了解当前视角下的地理范围和方向,便于调整视角和规划探索路线。 3. **显示/隐藏侧边栏**:...

Global site tag (gtag.js) - Google Analytics