项目:web应用程序。 根据一个用户的经纬度来推荐附近的人。
每个人的经纬度数据库都有保存数据,当有一个新用户注册的时候,如果推送离他最近的人? 难道只能从数据库中查询几个一个比对吗?那数据量大的时候如何解决? 谁做过类似的交友程序?上面很多应该用到这个东西,怎么做的?求指点啊
刚看了有的程序是如果有本地的,随机推荐本地,如果没有,随机推荐全国的。 如果上面的没有好的方法,结合下面的如何更靠谱点推荐啊? 对经纬度字段做索引嘛。 你只要查和他经纬度取整在正负1度范围内的人就可以了(维度1度=110千米,已经超过城市的跨度了) 这个用RTree和KDTree都可以做。Lz可以搜索一下第k近的邻居。实际上就是一个分支限界的搜索。如果数据量不大的话哪怕二分这个经度纬度范围,然后直接在数据库中Select也是可以的。 SQL SERVER 根据地图经纬度计算距离的公式 go --创建经纬度距离计算函数 CREATEFUNCTION [dbo].[fnGetDistance] --LatBegin 开始经度 --LngBegin 开始维度 (@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNSFLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EARTH_RADIUS REAL SET @EARTH_RADIUS = 6378.137 DECLARE @RadLatBegin REAL, @RadLatEnd REAL, @RadLatDiff REAL, @RadLngDiff REAL SET @RadLatBegin = @LatBegin *PI()/ 180.0 SET @RadLatEnd = @LatEnd *PI()/ 180.0 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 @Distance的单位为:千米 经测试,误差在30米左右,完全可以接受 private const double EARTH_RADIUS = 6378.137;//地球半径 private static double rad(double d) { return d * Math.PI / 180.0; } public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); 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; }
|