GPS定位,经纬度附近地点查询–C#实现方法
目前的工作是需要手机查找附近N米以内的商户,功能如下图
数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545),
最初想法 以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作)
上网百度类似的文章有了点眉目
大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了 经纬度是一个点,半径是一个距离,不能直接加减
终于找到想要的文章
http://digdeeply.org/archives/06152067.html
PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
参考原文章 lz改成了C#类
废话不多少直接上代码:
1 /// <summary> 2 /// 经纬度坐标 3 /// </summary> 4 5 public class Degree 6 { 7 public Degree(double x, double y) 8 { 9 X = x; 10 Y = y; 11 } 12 private double x; 13 14 public double X 15 { 16 get { return x; } 17 set { x = value; } 18 } 19 private double y; 20 21 public double Y 22 { 23 get { return y; } 24 set { y = value; } 25 } 26 } 27 28 29 public class CoordDispose 30 { 31 private const double EARTH_RADIUS = 6378137.0;//地球半径(米) 32 33 /// <summary> 34 /// 角度数转换为弧度公式 35 /// </summary> 36 /// <param name="d"></param> 37 /// <returns></returns> 38 private static double radians(double d) 39 { 40 return d * Math.PI / 180.0; 41 } 42 43 /// <summary> 44 /// 弧度转换为角度数公式 45 /// </summary> 46 /// <param name="d"></param> 47 /// <returns></returns> 48 private static double degrees(double d) 49 { 50 return d * (180 / Math.PI); 51 } 52 53 /// <summary> 54 /// 计算两个经纬度之间的直接距离 55 /// </summary> 56 57 public static double GetDistance(Degree Degree1, Degree Degree2) 58 { 59 double radLat1 = radians(Degree1.X); 60 double radLat2 = radians(Degree2.X); 61 double a = radLat1 - radLat2; 62 double b = radians(Degree1.Y) - radians(Degree2.Y); 63 64 double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + 65 Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))); 66 s = s * EARTH_RADIUS; 67 s = Math.Round(s * 10000) / 10000; 68 return s; 69 } 70 71 /// <summary> 72 /// 计算两个经纬度之间的直接距离(google 算法) 73 /// </summary> 74 public static double GetDistanceGoogle(Degree Degree1, Degree Degree2) 75 { 76 double radLat1 = radians(Degree1.X); 77 double radLng1 = radians(Degree1.Y); 78 double radLat2 = radians(Degree2.X); 79 double radLng2 = radians(Degree2.Y); 80 81 double s = Math.Acos(Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Cos(radLng1 - radLng2) + Math.Sin(radLat1) * Math.Sin(radLat2)); 82 s = s * EARTH_RADIUS; 83 s = Math.Round(s * 10000) / 10000; 84 return s; 85 } 86 87 /// <summary> 88 /// 以一个经纬度为中心计算出四个顶点 89 /// </summary> 90 /// <param name="distance">半径(米)</param> 91 /// <returns></returns> 92 public static Degree[] GetDegreeCoordinates(Degree Degree1, double distance) 93 { 94 double dlng = 2 * Math.Asin(Math.Sin(distance / (2 * EARTH_RADIUS)) / Math.Cos(Degree1.X)); 95 dlng = degrees(dlng);//一定转换成角度数 原PHP文章这个地方说的不清楚根本不正确 后来lz又查了很多资料终于搞定了 96 97 double dlat = distance / EARTH_RADIUS; 98 dlat = degrees(dlat);//一定转换成角度数 99 100 return new Degree[] { new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-top 101 new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y - dlng,6)),//left-bottom 102 new Degree(Math.Round(Degree1.X + dlat,6), Math.Round(Degree1.Y + dlng,6)),//right-top 103 new Degree(Math.Round(Degree1.X - dlat,6), Math.Round(Degree1.Y + dlng,6)) //right-bottom 104 }; 105 106 } 107 }
测试方法:
1 static void Main(string[] args) 2 { 3 double a = CoordDispose.GetDistance(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918));//116.416984,39.944959 4 double b = CoordDispose.GetDistanceGoogle(new Degree(116.412007, 39.947545), new Degree(116.412924, 39.947918)); 5 Degree[] dd = CoordDispose.GetDegreeCoordinates(new Degree(116.412007, 39.947545), 102); 6 Console.WriteLine(a+" "+b); 7 Console.WriteLine(dd[0].X + "," + dd[0].Y ); 8 Console.WriteLine(dd[3].X + "," + dd[3].Y); 9 Console.ReadLine(); 10 }
lz试了很多次 误差在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
转载于:https://www.cnblogs.com/cake/p/3240325.html
GPS定位,经纬度附近地点查询–C#实现方法相关推荐
- GPS定位,经纬度附近地点查询–C 实现方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 目前的工 ...
- c语言谷歌坐标转百度坐标,关于GPS定位经纬度到谷歌(google)坐标以及百度(百度)坐标的转换c#源码...
关于GPS定位经纬度到谷歌(google)坐标以及百度(百度)坐标的转换c#源码 2020年08月10日 阅读数:31 这篇文章主要向大家介绍关于GPS定位经纬度到谷歌(google)坐标以及百度(百 ...
- GPS定位经纬度标准转换
最近项目中框架更改,用到高德地图,但是之前项目地图使用的是百度,因此出现位置不太准确现象,经查是由于两个定位使用的算法不太不样导致. 目前在各种web端平台,或者高德.腾讯.百度上取到的坐标,都不是G ...
- IOS将GPS定位经纬度转换为高德地图经纬度
https://github.com/JackZhouCn/JZLocationConverter http://www.eoeandroid.com/forum.php?mod=viewthread ...
- java如何实现实时定位_javaweb实现百度GPS定位接口(经纬度)
百度web GPS定位(经纬度) 注册账号及配置地址 http://lbsyun.baidu.com/apiconsole/key 主类 BaiduWebAPI import java.util.Ma ...
- 微信小程序入门5--查询湖畔云GPS定位信息
本文内容较多,请耐心查阅. 本文分为四个部分进行介绍: 一.在百度地图开发平台申请AK 1. 注册账号 2.创建应用 3.获取密钥(AK) 二.下载API模块 三.获取湖畔云GPS定位经纬度信息 四. ...
- java编程手机gps定位_GPS 获取Gps定位信息的Android源码实例,通过这个JAVA 目,你可能学会GPS在 手机 238万源代码下载- www.pudn.com...
文件名称: GPS下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 59 KB 上传时间: 2013-04-08 下载次数: 22 详细说明:获取Gps定位信息的A ...
- 开源一个安信可A9g小项目微信小程序定位器项目②GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度;
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 如何在windows10上环境搭建,编译烧录代码固件,查看运行 ...
- android 百度坐标 gps,Android中gps定位不返回经纬度的解决方案
定位,算是android应用中一个非常常见的功能了吧,并且大部分的应用里基本也都会用到地图,所以以前的做法基本都是直接接入了百度.高德这些第三方定位,也没遇到过什么问题. 然而,最近的工作基本上都是做 ...
- Unity GPS定位之逆地理编码(获取经纬度并转换成地理位置)
unity定位 前言 最近在做一款手游,然后策划给的需求就是定位到当前用户所在的城市,然后花了一个上午给做了出来,思路大概就是通过手机定位获取到当前位置的经度和纬度,然后通过各个地图(我这里用的是百度 ...
最新文章
- Linux网络包接收过程的监控与调优
- 户外lisp导向牌如何安装_有了激光切割导向牌,妈妈再也不用担心我迷路啦
- NoDrives-显示与隐藏驱动器【盘符的显示与隐藏】
- linux-``反引号
- 【指标统计】标记存量遥控(成功/失败)遥信(正确/错误)
- 单独获取ShopEx商品类型中的扩展参数,如配货时间
- com.alibaba.druid.pool.DruidDataSource.error解决办法
- 在C#中使用Json.Net进行序列化和反序列化及定制化
- 统计/var/log/下有多少文件
- 《java 程序设计教程》:毕
- Java基础continue语句
- 电脑没有显示云服务器地址,电脑里没有服务器地址
- 策略模式探究(二)多个门禁对接使用策略模式
- jbpm5.4 mysql_5.BDF2-JBPM4
- (20)雅思屠鸭第二十天:雅思听力part1中各种场景词的总结
- (邱维声)高等代数课程笔记:数域
- 国科大2019年大数据分析课件作业 考试-程学旗 靳小龙 刘盛华
- 微信公众号基于 baidu API接口的图像识别
- android 浏览器应用商店,百度易揭秘:自带应用商店和浏览器 兼容安卓
- Oracle 19c 新特性:ADG的自动DML重定向增强读写分离--ADG_REDIRECT_DML
热门文章
- 用正则表达式将前后空格用空字符串替代:replace(/(^\s*)|(\s*$)/g, )
- Google Talk Testing(早期版本)
- 运用.NET Framework中的类来创建看上去很专业的报表。
- 二叉树类图_设计模式前言——UML类图
- idea中通过搜索添加maven依赖包
- vue 打印出来但显示未定义_CAD图形能显示却打印不出来如何解决?
- linux上运行tcpserver没反应,linux网络编程/tcp_server中server bind失败原因的调研
- [渝粤教育] 广东-国家-开放大学 21秋期末考试市场营销10256k2
- 应用机器学习(二):k-NN 分类器
- 操作系统原理(六)设备管理