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

目前的工作是需要手机查找附近N米以内的商户,功能如下图

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

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

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

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

终于找到想要的文章

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

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

  1. /// <summary>
  2. /// 经纬度坐标
  3. /// </summary>
  4.   public class Degree
  5. {
  6. public Degree(double x, double y)
  7. {
  8. X = x;
  9. Y = y;
  10. }
  11. private double x;
  12.  
  13. public double X
  14. {
  15. get { return x; }
  16. set { x = value; }
  17. }
  18. private double y;
  19.  
  20. public double Y
  21. {
  22. get { return y; }
  23. set { y = value; }
  24. }
  25. }
  26.  
  27. public class CoordDispose
  28. {
  29. private const double EARTH_RADIUS = 6378137.0;//地球半径(米)
  30.  
  31. /// <summary>
  32. /// 角度数转换为弧度公式
  33. /// </summary>
  34. /// <param name="d"></param>
  35. /// <returns></returns>
  36. private static double radians(double d)
  37. {
  38. return d * Math.PI / 180.0;
  39. }
  40.  
  41. /// <summary>
  42. /// 弧度转换为角度数公式
  43. /// </summary>
  44. /// <param name="d"></param>
  45. /// <returns></returns>
  46. private static double degrees(double d)
  47. {
  48. return d * (180 / Math.PI);
  49. }
  50.  
  51. /// <summary>
  52. /// 计算两个经纬度之间的直接距离
  53. /// </summary>
  54.  
  55. public static double GetDistance(Degree Degree1, Degree Degree2)
  56. {
  57. double radLat1 = radians(Degree1.X);
  58. double radLat2 = radians(Degree2.X);
  59. double a = radLat1 - radLat2;
  60. double b = radians(Degree1.Y) - radians(Degree2.Y);
  61.  
  62. double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
  63. Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
  64. s = s * EARTH_RADIUS;
  65. s = Math.Round(s * 10000) / 10000;
  66. return s;
  67. }
  68.  
  69. /// <summary>
  70. /// 计算两个经纬度之间的直接距离(google 算法)
  71. /// </summary>
  72. public static double GetDistanceGoogle(Degree Degree1, Degree Degree2)
  73. {
  74. double radLat1 = radians(Degree1.X);
  75. double radLng1 = radians(Degree1.Y);
  76. double radLat2 = radians(Degree2.X);
  77. double radLng2 = radians(Degree2.Y);
  78.  
  79. double s = Math.Acos(Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Cos(radLng1 - radLng2) + Math.Sin(radLat1) * Math.Sin(radLat2));
  80. s = s * EARTH_RADIUS;
  81. s = Math.Round(s * 10000) / 10000;
  82. return s;
  83. }
  84.  
  85. /// <summary>
  86. /// 以一个经纬度为中心计算出四个顶点
  87. /// </summary>
  88. /// <param name="distance">半径(米)</param>
  89. /// <returns></returns>
  90. public static Degree[] GetDegreeCoordinates(Degree Degree1, double distance)
  91. {
  92. double dlng = 2 * Math.Asin(Math.Sin(distance / (2 * EARTH_RADIUS)) / Math.Cos(Degree1.X));
  93. dlng = degrees(dlng);//一定转换成角度数 原PHP文章这个地方说的不清楚根本不正确 后来lz又查了很多资料终于搞定了
  94.  
  95. double dlat = distance / EARTH_RADIUS;
  96. dlat = degrees(dlat);//一定转换成角度数
  97.  
  98. return new Degree[] { new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-top
  99. new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-bottom
  100. new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y + dlng,6)),//right-top
  101. new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y + dlng,6)) //right-bottom
  102. };
  103.  
  104. }
  105. }
  106.  
  107. //调用方法
  108. static void Main(string[] args)
  109. {
  110. double a = CoordDispose.GetDistance(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));//116.416984,39.944959
  111. double b = CoordDispose.GetDistanceGoogle(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));
  112. Degree[] dd = CoordDispose.GetDegreeCoordinates(new Degree(116.412007, 39.947545), 102);
  113. Console.WriteLine(a+" "+b);
  114. Console.WriteLine(dd[0].X + "," + dd[0].Y );
  115. Console.WriteLine(dd[3].X + "," + dd[3].Y);
  116. Console.ReadLine();
  117. }

拿到圆的顶点就好办了

数据库要是sql 2008的可以直接进行空间索引经纬度字段,这样应该性能更好(没有试过)

lz公司数据库还老 2005的 这也没关系,关键是经纬度拆分计算,这个就不用说了 网上多的是 最后上个实现的sql语句

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

转载:http://www.cxyclub.cn/n/20556/

 

GPS定位,经纬度附近地点查询–C#实现方法的更多相关文章

  1. GPS定位,经纬度附近地点查询–C#实现方法

    目前的工作是需要手机查找附近N米以内的商户,功能如下图 数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545), 最初想法  以圆心点为中心点,对半径做循环,半径每增加 ...

  2. LBS 与 GPS 定位之间的区别

    什么是LBS定位?   LBS英文全称为Location Based Services, 它包括两层含义:首先是确定移动设备或用户所在的地理位置:其次是提供与位置相关的各类信息服务.意指与定位相关的各 ...

  3. [置顶] xamarin android使用gps定位获取经纬度

    看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...

  4. Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法

    Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法   LBS 球面距离公式 http://wiki.myoa.info/zh-blog:20 Java,Mysql- ...

  5. H5结合百度map实现GPS定位

    前言 目前我们做m端时都会用到定位,当用户第一次打开h5页面时会启动gps定位,并结合百度map来查找城市.按照我们的逻辑思路就是gps定位获取经纬度,传到后台调用百度的一个接口查找城市名称. 1.查 ...

  6. 【Android】GPS定位基本原理浅析

    位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备(智能手机.掌上电脑等)的标配.而定位导航技术中,目前精度最高.应用最广泛的,自然非GPS莫属了.网络上介绍GPS原理的专业资料很多,而本文 ...

  7. GPS定位基本原理浅析

    位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备(智能手机.掌上电脑等)的标配.而定位导航技术中,目前精度最高.应用最广泛的,自然非GPS莫属了.网络上介绍GPS原理的专业资料很多,而本文 ...

  8. GPS(2)关于位置的3个示例,实时获取GPS定位数据,求两个经纬点距离,邻近某个区域圆时警告

    实时获取GPS定位数据 import android.app.Activity; import android.content.Context; import android.location.Loc ...

  9. Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便.定位一般分为三种发方案:即GPS定位.Google网络定位以及基站定位 最简单的手机定位方式当然是通过GP ...

随机推荐

  1. 【Hadoop故障处理】高可用(HA)环境DataNode问题

    [故障背景] NameNode和DataNode进程正常运行,但是网页找不到DataNode,DataNode为空.各个节点机器之间可以ping同主机名. [日志排查] 众多日志中找到如下关键点错误信 ...

  2. PHPExcel 导入Excel数据 (导出下一篇我们继续讲解)

    一:使用composer下载 phpoffice/phpexcel 或者直接下载安装包 composer require phpoffice/phpexcel 二 1:导入数据 原理:读取文件,获取文 ...

  3. 使用boost.asio实现网络通讯

    #include <boost/asio.hpp> #define USING_SSL //是否加密 #ifdef USING_SSL #include <boost/asio/ss ...

  4. error: command 'aarch64-linux-gnu-gcc' failed with exit status 1

    使用jetson tx2安装tensorpack时报错: error: command 'aarch64-linux-gnu-gcc' failed with exit status 1 改正: 如果 ...

  5. Angularjs 自定义指令 (下拉菜单)

    为什么要自定义控件?html的select 不是可以用么?以前我就是这么想的,当我接到特殊需求时,需要我自己写一个下拉控件. 这个需求就是将图表横向放大,由于H5不能控制设备转向,所以我将图表通过cs ...

  6. MongoDB入门---文档查询操作之条件查询&and查询&or查询

    经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...

  7. 安卓app连接CC2541-手机休眠后唤醒,通信不再成功

    1. 现在遇到的问题,手机进入休眠状态后唤醒,APP软件和CC2541的通信不正常了,但是CC2541依然检测到时连接状态.如何解决这个问题?手机唤醒之后会重新创建活动? 2.Wakelock 锁机制 ...

  8. linux下免安装版本mysql5.5 配置

    进入/usr/local #cd /usr/local 下载 #wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.39-linux ...

  9. 解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...

  10. Linux命令应用大词典-第7章 字符串、文件和命令查找

    7.1 grep:字符串.文件和命令的查找 7.2 egrep:在文件或标准输入中查找模式 7.3 fgrep:在每个文件或是标准输入中查找模式 7.4 find:列出文件系统内符合条件的文件 7.5 ...