在线gps经纬度查询怎么不能查询 returns>
分类:常识 浏览:19964
数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545)
最初想法,以圆心点为中心点,对半径做循环,半径每增加一个像素(暂定1米)再对周长做循环,到数据库中查询对应点的商家(真是一个长时间的循环工作),上网百度类似的文章有了点眉目
大致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,这样的话就需要知道所要求的这个圆的对角线的顶点,问题来了 经纬度是一个点,半径是一个距离,不能直接加减复制代码 代码如下:/// <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(); }
试了很多次 误差在1米左右
拿到圆的顶点就好办了
数据库要是sql 2008的可以直接进行空间索引经纬度字段,这样应该性能更好(没有试过)
lz公司数据库还老 2005的 这也没关系,关键是经纬度拆分计算,这个就不用说了 网上多的是 最后上个实现的sql语句
复制代码 代码如下:SELECT id,zuobiao FROM dbo.zuobiao WHERE zuobiao<>'' AND dbo.Get_StrArrayStrOfIndex(zuobiao,',',1)>116.41021 ANDdbo.Get_StrArrayStrOfIndex(zuobiao,',',1)<116.413804 ANDdbo.Get_StrArrayStrOfIndex(zuobiao,',',2)<39.949369 ANDdbo.Get_StrArrayStrOfIndex(zuobiao,',',2)>39.945721
- 上一篇:员工意见调查表模板 输漏了一行数据
- 下一篇:返回列表
相关推荐
- 和声编写:Boomfisher@TNK是什么歌?(若)歌词
- 在三年前哥们也经常派对是什么歌?()歌词
- 原来纯真你比谁都了解是什么歌?(紫色贝壳)歌词
- 天马山公墓预约 那么该怎么去预约
- 家教小故事2 完全取决于自己的选择
- 哦上官飞燕 哦多情多咏叹是什么歌?(上官飞燕)歌词
- 巫师3刷钱控制台 到达目的地后
- 古今大战秦俑情主题曲 1、歌曲简介:歌曲《焚心以火》
- 卞怎么读 人口约三十八万一千余
- 功标青史 形容坚持操守
- 果宝特攻3大结局 1、果宝特攻3,顾名思义是果宝
- 咲怎么读音 作为动词使用
- 在每个拥抱是什么歌?()歌词
- vr下载 选择一个环境水平最大
- brandonroy 罗伊这个人是一个看起来相对憨厚
- 向前飞啊飞 不怕累 青春无畏是什么歌?(搭乘梦想)歌词
- 聂欢个人资料家世 任嘉伦的老婆聂欢本身是个白富美
- 伤仲永 王安石《伤仲永》原文及译文《伤
- 3d七龙珠单机游戏 1、GBA上有一个不错的游戏叫
- 发家致业 成语基本释义
- ie安全证书下载 都是IE的核心
- 滤膜孔径 1、超滤膜孔径的
- 名人说过的最浪漫情话 我余光中都是你
- 原创书殿小说网 拥有海量精品小说
- 2020年祝福语 积力之所举,则无不胜也;众智之
- 心动歌词 《心动》的歌词在平平淡淡的学习
- lol春季赛积分 一起来看看吧!
- line电脑版官方 设置软件的安装位置
- 瑟组词 瑟的组词有:鸣瑟、明瑟、毛瑟、
- dnf创世之书 点我查看<
- 排行推荐
-
- 1山石网科 韩愈山石荦确行径微,黄昏到寺蝙
- 2夜之魇攻略 很多玩家都还不知道卡拉赞夜之魇
- 3覆铝锌板 1、镀铝板,也称
- 4王柏林扮演者 解答:1、王柏林在《猎狐》,第
- 5阿不思邓布利多 阿不思邓布利多全名阿不思·珀西
- 6和声编写:Boomfisher@TNK是什么歌?(若)歌词
- 7就这么 握住你的手是什么歌?(握住你的手)歌词
- 8在三年前哥们也经常派对是什么歌?()歌词
- 9奖金计算器 1、北单奖金的计算方法是所有所
- 10流浪剑客出装 DOTA流浪剑客伟大的秩序之神
- 11励志的抖音文案大全 没有所谓的运气
- 12原来纯真你比谁都了解是什么歌?(紫色贝壳)歌词
- 13天马山公墓预约 那么该怎么去预约
- 14家教小故事2 完全取决于自己的选择
- 15淘宝新手上路 我的建议是只要在淘宝开店的人都
- 最新推荐
- 最新TAG