GPS定位,经纬度附近地点查询–C#实现方法
摘要:目前的工作是需要手机查找附近N米以内的商户,功能如下图数据库中记录了商家在百度标注的经纬度(如:116.412007,39.947545),最初想法以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作)上网百度类似的文章有了点眉目大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了经纬度是一个点,半径是一个距离
目前的工作是需要手机查找附近N米以内的商户,功能如下图
数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545),
最初想法 以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作)
上网百度类似的文章有了点眉目
大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了 经纬度是一个点,半径是一个距离,不能直接加减
终于找到想要的文章
http://digdeeply.org/archives/06152067.html
参考原文章 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 * (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();
- }
拿到圆的顶点就好办了
数据库要是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
转载:http://www.cxyclub.cn/n/20556/
GPS定位,经纬度附近地点查询–C#实现方法的更多相关文章
- GPS定位,经纬度附近地点查询–C#实现方法
目前的工作是需要手机查找附近N米以内的商户,功能如下图 数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545), 最初想法 以圆心点为中心点,对半径做循环,半径每增加 ...
- LBS 与 GPS 定位之间的区别
什么是LBS定位? LBS英文全称为Location Based Services, 它包括两层含义:首先是确定移动设备或用户所在的地理位置:其次是提供与位置相关的各类信息服务.意指与定位相关的各 ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法
Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法 LBS 球面距离公式 http://wiki.myoa.info/zh-blog:20 Java,Mysql- ...
- H5结合百度map实现GPS定位
前言 目前我们做m端时都会用到定位,当用户第一次打开h5页面时会启动gps定位,并结合百度map来查找城市.按照我们的逻辑思路就是gps定位获取经纬度,传到后台调用百度的一个接口查找城市名称. 1.查 ...
- 【Android】GPS定位基本原理浅析
位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备(智能手机.掌上电脑等)的标配.而定位导航技术中,目前精度最高.应用最广泛的,自然非GPS莫属了.网络上介绍GPS原理的专业资料很多,而本文 ...
- GPS定位基本原理浅析
位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备(智能手机.掌上电脑等)的标配.而定位导航技术中,目前精度最高.应用最广泛的,自然非GPS莫属了.网络上介绍GPS原理的专业资料很多,而本文 ...
- GPS(2)关于位置的3个示例,实时获取GPS定位数据,求两个经纬点距离,邻近某个区域圆时警告
实时获取GPS定位数据 import android.app.Activity; import android.content.Context; import android.location.Loc ...
- Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)
在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便.定位一般分为三种发方案:即GPS定位.Google网络定位以及基站定位 最简单的手机定位方式当然是通过GP ...
随机推荐
- 【Hadoop故障处理】高可用(HA)环境DataNode问题
[故障背景] NameNode和DataNode进程正常运行,但是网页找不到DataNode,DataNode为空.各个节点机器之间可以ping同主机名. [日志排查] 众多日志中找到如下关键点错误信 ...
- PHPExcel 导入Excel数据 (导出下一篇我们继续讲解)
一:使用composer下载 phpoffice/phpexcel 或者直接下载安装包 composer require phpoffice/phpexcel 二 1:导入数据 原理:读取文件,获取文 ...
- 使用boost.asio实现网络通讯
#include <boost/asio.hpp> #define USING_SSL //是否加密 #ifdef USING_SSL #include <boost/asio/ss ...
- 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 改正: 如果 ...
- Angularjs 自定义指令 (下拉菜单)
为什么要自定义控件?html的select 不是可以用么?以前我就是这么想的,当我接到特殊需求时,需要我自己写一个下拉控件. 这个需求就是将图表横向放大,由于H5不能控制设备转向,所以我将图表通过cs ...
- MongoDB入门---文档查询操作之条件查询&and查询&or查询
经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...
- 安卓app连接CC2541-手机休眠后唤醒,通信不再成功
1. 现在遇到的问题,手机进入休眠状态后唤醒,APP软件和CC2541的通信不正常了,但是CC2541依然检测到时连接状态.如何解决这个问题?手机唤醒之后会重新创建活动? 2.Wakelock 锁机制 ...
- linux下免安装版本mysql5.5 配置
进入/usr/local #cd /usr/local 下载 #wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.39-linux ...
- 解决Entity Framework查询匿名对象后的跨域访问的一种方式
在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递.但是很多时 ...
- Linux命令应用大词典-第7章 字符串、文件和命令查找
7.1 grep:字符串.文件和命令的查找 7.2 egrep:在文件或标准输入中查找模式 7.3 fgrep:在每个文件或是标准输入中查找模式 7.4 find:列出文件系统内符合条件的文件 7.5 ...