坐标距离算法

  经过这两天的研究,我想有些东西有必要写一下,同时也帮助需要的人

  这是一个查找附近的人的一个算法,在网上找了这篇文章 http://blog.csdn.net/dyllove98/article/details/9795815,他的算最小正方形的四个顶点有点问题。

  第一步 ,我们试想一下,如果我们要查找附近五公里的人,是不是最先想到根据自己的经纬度(如果连经纬度都不知道怎么回事,我想你应该知道度娘),再往数据库里面获取其他人的经纬度,根据两个经纬度获取他们的距离,

如果距离小于5公里的话,那就符合条件。

  获取距离用两种情况,第一种就是全部查出来在代码里面进行算,第二种情况就是在sql 里面写个函数,在数据库里面算

     代码算距离算法:

 

    public static double GetDistance(Degree Degree1, Degree Degree2)
         {
             double radLat1 = radians(Degree1.Y);
             double radLat2 = radians(Degree2.Y);
             double a = radLat1 - radLat2;
             double b = radians(Degree1.X) - radians(Degree2.X);

             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;
         }

     radians是个角度转弧度的算法

     private static double degrees(double d)
         {
             return d * (180 / Math.PI);
         }

     如果不知道里面的算法是个怎样的原理,你可以百度相关的三角函数公式

      sql 距离算法

  

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[fnGetDistance](@LatBegin float, @LngBegin float, @LatEnd float, @LngEnd float) returns float
as
begin
  --距离(千米)
  declare @Distance float;
  declare @EARTH_RADIUS float;
  set @EARTH_RADIUS = 6378.137;

  declare @RadLatBegin float,
          @RadLatEnd float,
          @RadLatDiff float,
          @RadLngDiff float;
  set @RadLatBegin = @LatBegin * pi()/180.0;
  set @RadLatEnd = @LatEnd * pi()/180.;
  set @RadLatDiff = @RadLatBegin - @RadLatEnd;
  set @RadLngDiff = @LngBegin * pi()/180.0 - @LngEnd * pi()/180.0;
  set @Distance = 2 * asin(sqrt(power(sin(@RadLatDiff/2), 2) + cos(@RadLatBegin)
                  * cos(@RadLatEnd) * power(sin(@RadLngDiff/2), 2)));
  set @Distance = @Distance * @EARTH_RADIUS;
  --set @Distance = Round(@Distance * 10000) / 10000
  return @Distance
end

 

  如果你跟我上面的想法一致的话,我只能对你说处理小数据量还可以。

  例如:我们现在要做一个停车管理系统,需车位的可以查附近的供车位的,供车位的可以查附近需车位的,如果数据库里面有一万条供车位的经纬度,需车位访问服务器,服务器要进行十万次距离换算,如果同时有十个人进行访问的话,那服务器被你轻而易举的百万数据量访问了。

    那有什么办法可以解决呢?

  

先看这张图,我们知道原点的坐标也就是我们的经纬度,也在知道半径(附近几公里),就可以得到圆的最小正方形,从而根据公式可以得到 正方形的四个顶点 就晓得了 最小经纬度和最大经纬度

把我们得到的经纬度往数据库里面一查 ,就能轻然一举的把符合范围内的人查

出来。

根据经纬度和距离,得到四个顶点的距离算法

 private static void GetlatLon(double GLON, double GLAT, double distance, double angle, out double newLon,out double newLat)
         {
             double Ea = 6378137;     //   赤道半径
             double Eb = 6356725;     //   极半径
             double dx = distance  * Math.Sin(angle * Math.PI / 180.0);
             double dy = distance  * Math.Cos(angle * Math.PI / 180.0);
             //double ec = 6356725 + 21412 * (90.0 - GLAT) / 90.0;

             // 21412 是赤道半径与极半径的差
             double ec = Eb + (Ea - Eb) * (90.0 - GLAT) / 90.0;
             double ed = ec * Math.Cos(GLAT * Math.PI / 180);
             newLon = (dx / ed + GLON * Math.PI / 180.0) * 180.0 / Math.PI;
             newLat = (dy / ec + GLAT * Math.PI / 180.0) * 180.0 / Math.PI;

         }
         public static Degree[] GetRectRange(double centorLogitude,double centorlatitude, double distance)
         {

             double temp = 0.0;
             double maxLatitude;
             double minLatitude;
             double maxLongitude;
             double minLongitude;
             GetlatLon(centorLogitude, centorlatitude, distance, 0, out temp, out maxLatitude);

             GetlatLon(centorLogitude, centorlatitude, distance, 180, out temp, out minLatitude);

             GetlatLon(centorLogitude, centorlatitude, distance, 90, out maxLongitude, out temp);

             GetlatLon(centorLogitude, centorlatitude, distance, 270, out minLongitude, out temp);
             maxLatitude = Math.Round(maxLatitude,6);
             minLatitude = Math.Round(minLatitude,6);
             maxLongitude = Math.Round(maxLongitude,6);
             minLongitude = Math.Round(minLongitude,6);
             return new Degree[] {
                new Degree(minLongitude,maxLatitude),//left-top
                new Degree(minLongitude,minLatitude),//left-bottom
                new Degree(maxLongitude,maxLatitude),//right-top
                new Degree(maxLongitude,minLatitude)  //right-bottom
             };

         }

这些东西经过测试的 相差不到 1,2米

还是那就话如有不懂的地方 请联系我 QQ:209229923,或在下发为我留言

时间: 2024-10-11 09:23:09

坐标距离算法的相关文章

Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离

Atitti knn实现的具体四个距离算法  欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领域有着广泛的应用1 2. 汉明距离1 2.1. 历史及应用1 3. 曼哈顿距离2 3.1. SimHash + 汉明距离3 3.2. .简单共有词4 1. Knn算法实质就是相似度的关系 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领域有着广泛的应用 数据挖掘的过程中,只用

【转】【矩阵】三维坐标旋转矩阵算法

3D数学 ---- 矩阵和线性变换 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线的同时,其他的几何性质如长度.角度.面积和体 积可能被变换改变了.从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系. 矩阵是怎样变换向量的 向量在几何上能被解释成一系列与轴平行的位移,一般来说,任意向量v都能写成“扩展”形式: 另一种略有差别的形式为: 注意右边的单位向量就是x,y,z轴,这里只是将概念数学化,向量的每个坐标都表明了平行于相

常见的距离算法和相似度(相关系数)计算方法

摘要: 1.常见的距离算法 1.1欧几里得距离(Euclidean Distance)以及欧式距离的标准化(Standardized Euclidean distance) 1.2马哈拉诺比斯距离(Mahalanobis Distance) 1.3曼哈顿距离(Manhattan Distance) 1.4切比雪夫距离(Chebyshev Distance) 1.5明可夫斯基距离(Minkowski Distance) 2.常见的相似度(系数)算法 2.1余弦相似度(Cosine Similari

sql 坐标距离排序计算距离(转)

如果两个坐标的列是(x1,y1).(x2,y2),那么他们之间的距离:SQRT((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)) sql排序 SELECT * FROM m_store ORDER BY SQRT((121.517759-`longitude`)*(121.517759-`longitude`)+(31.178469-`latitude`)*(31.178469-`latitude`)) PHP计算距离 /***求两个已知经纬度之间的距离,单位为米*@param

从百度地图API中抠出来的一个js方法,计算百度地图坐标距离

从百度地图api(http://developer.baidu.com/map/jsdemo.htm#a6_1)中抠出来的一个js方法,计算百度地图坐标距离 可读行还没还原,能用就行~ function fD(a, b, c) { for (; a > c;) a -= c - b; for (; a < b;) a += c - b; return a; }; function jD(a, b, c) { b != null && (a = Math.max(a, b));

Levenshtein字符串距离算法介绍

Levenshtein字符串距离算法介绍 文/开发部 Dimmacro KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上期介绍了KMP算法的一些皮毛,收到了同事的一些反馈,本期再接再厉,搜集了一些资料,简单谈谈Levenshtein相似度匹配算法,希望能抛砖引玉. 算法简介: Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,其原理是两个字符串之间,由

各种距离算法汇总

参考:http://blog.csdn.net/mousever/article/details/45967643 1. 欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为: (1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离: (2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离: (3)两个n维向量a(x11,x12,…,

Levenshtein Distance莱文斯坦距离算法来计算字符串的相似度

转 理解起来不难,但是很实用. 核心公式就是下面:             (1) 1.百度百科介绍: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance. 2.用途 模糊查询 3.实现过程 a.首先是有两个字符串,这里写一个简单的 abc和abe b.将

计算两点坐标距离与中点坐标

/*回顾一下数学公式: 两点的坐标是(x1, y1)和(x2, y2) 则两点之间的距离公式为 d=√[(x1-x2)2+(y1-y2)2] 注意特例: 当x1=x2时 两点间距离为|y1-y2| 当y1=y2时 两点间距离为|x1-x2| 中点坐标:midpoint(X,Y) X=(X1+X2)/2 Y=(Y1+Y2)/2 */ //自定义坐标类 public class Pointer { private double x; private double y; public Pointer(