您现在的位置: 爱51代码网 >> 范文 >> 文章正文
C#根据一个用户的经纬度来推荐附近的人

项目: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;
}

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    maven如何加自定义的包
    redhat 2.6 (santigo 5.6) vsftp
    shell如何实现自动填写操作执行下
    linux shell 文件配置sh:color:
    shell script语法一定要加path吗
    SecureCRT如何访问虚拟机vmWare中
    C#如何读取WINDOWS的放大系数
    cximge的图如何存入数据库并提取
    DBGRID控件显示查询结果文本类型
    TChart控件如何把表中右边的系列
    maven如何加自定义的包
    redhat 2.6 (santigo 5.6) vsftp
    shell如何实现自动填写操作执行下
    linux shell 文件配置sh:color:
    shell script语法一定要加path吗
    SecureCRT如何访问虚拟机vmWare中
    C#如何读取WINDOWS的放大系数
    cximge的图如何存入数据库并提取
    DBGRID控件显示查询结果文本类型
    TChart控件如何把表中右边的系列
    无法加载 DLL“HCNetSDK.dll
    异常信息:无效的视图状态
    WPF如何在自己定义的style里
    C#字符字串转换成日期出错
    win7x64虚拟机上提示emgu.cv
    .NET Reflector导出"发现不明
    C#如何采集电表数据
    C#两个textBox如何互相控制对
    ExecuteReade如何r创建SqlDa
    如何在ashx页面里面使用Resp
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |