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

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

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

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

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

终于找到想要的文章

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

PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍

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

废话不多少直接上代码:

 /// <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 * ( / 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 = * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / ), ) +
Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / ), )));
s = s * EARTH_RADIUS;
s = Math.Round(s * ) / ;
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 * ) / ;
return s;
} /// <summary>
/// 以一个经纬度为中心计算出四个顶点
/// </summary>
/// <param name="distance">半径(米)</param>
/// <returns></returns>
public static Degree[] GetDegreeCoordinates(Degree Degree1, double distance)
{
double dlng = * Math.Asin(Math.Sin(distance / ( * 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,), Math.Round(Degree1.Y - dlng,)),//left-top
new Degree(Math.Round(Degree1.X - dlat,), Math.Round(Degree1.Y - dlng,)),//left-bottom
new Degree(Math.Round(Degree1.X + dlat,), Math.Round(Degree1.Y + dlng,)),//right-top
new Degree(Math.Round(Degree1.X - dlat,), Math.Round(Degree1.Y + dlng,)) //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), );
Console.WriteLine(a+" "+b);
Console.WriteLine(dd[].X + "," + dd[].Y );
Console.WriteLine(dd[].X + "," + dd[].Y);
Console.ReadLine();
}

lz试了很多次 误差在1米左右

拿到圆的顶点就好办了

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

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

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

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. 【HDOJ】2721 Persistent Bits

    题目有点长,但是题意说的很清楚.位操作. #include <stdio.h> ]; int main() { int a, b, c, s; int i, j, k, n, tmp, m ...

  2. bzoj1023

    研究了一下仙人掌首先,仙人掌虽然不是树,但却有很强的树的既视感如果把每个环都看做一个点,那么他就是一棵树当然这不能直接缩环,因为环和环可以有一个交点如果是树,求直径都会做,令f[i]表示i到子树的最长 ...

  3. 微软开放技术发布针对 Mac 和 Linux 的更新版 Azure Node.JS SDK 和命令行工具

    发布于 2013-12-04 作者 Eduard Koller 这次为我们使用Linux 的朋友带来了更多关于部署云上虚拟机的消息.今天,微软开放技术有限公司 (MS Open Tech),想与大家分 ...

  4. IIS出现Server Error in '/' Application.CS0016的解决办法

    这两天一直在弄IIS的事,全都是报错,网上找了好多资料,也尝试了很多,终于在几分钟之前把困扰了我一周的麻烦给解决了,现整理出来,希望对大家有用,闲话少说,直接上图了 Server Error in ' ...

  5. 迷宫城堡--HDOJ 1269

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. LR使用

    1.协议的选择 Loadrunner的协议选择众多,想正确的选择脚本协议,首先要从Loadrunner的工作原理上深入的理解协议的作用和意义, Loadrunner启动后,在任务栏上有一个loadru ...

  7. ReadingNotes@02-12-2013

    ReadingNotes@02-12-2013 */--> pre { background-color: #2f4f4f;line-height: 1.6; FONT: 10.5pt Cons ...

  8. 【解决】Internet访问看似正常(无叹号受限)却打不开网页

    嘛╮(╯▽╰)╭ 可能是前几天中了一等奖败了人品 .. 今天果断受点小挫折 事情是这样的:昨晚电脑在不插电的情况下打了一小时“剑灵”,有点烫,电量剩30%,关机睡觉,今早发现上不去网页了! 桌面右下角 ...

  9. sublime text 2 运行 python时返回EOFError: EOF when reading a line错误

    其主要原因是sublime text 2中python没有与 stdin(标准输入)连接所致,解决方法也很简单,那就是安装sublimeREPL插件,然后 Tools->sublimerepl- ...

  10. 依据linux Oops信息准确定位错误代码所在行

    在linux下调tvp5150am1的过程中,遇到了一kernel oops,内容如下: [   66.714603] Unable to handle kernel paging request a ...