有太多数据时计算距离的最佳和最快方法?

时间:2017-02-14 19:36:11

标签: c# wcf

我正在用C#编写WCF服务。我需要根据当前用户登录来计算用户的距离。例如,我需要目前在当前用户10公里范围内的所有用户。

数据看起来像那样。

User    Longitude   Latitude
1   71.23232    31.23232
2   69.23232    30.23232
3   68.23232    28.23232
4   67.23232    27.23232
.
.
1000    23.22332    45.22323

我使用以下方法计算距离。

public static double Distance(double sLatitude, double sLongitude, double dLatitude, double dLongitude, char unit='m')
{
    var sCoord = new GeoCoordinate(sLatitude, sLongitude);
    var dCoord = new GeoCoordinate(dLatitude, dLongitude);

    if(unit == 'm')
        return sCoord.GetDistanceTo(dCoord);
    else if(unit == 'k')
        return (sCoord.GetDistanceTo(dCoord))/1000;
} 

用户1已登录,我需要获得10 KM或20 KM用户范围内的所有用户。是否有最好的方式来吸引此类用户?我在后端使用SQL服务器。请指教。

4 个答案:

答案 0 :(得分:0)

在SQL Server中,您可以使用地理空间类型。这将允许您按距离查询数据库和订单。

检查出来:

https://technet.microsoft.com/en-us/library/cc280766(v=sql.100).aspx

https://www.mssqltips.com/sqlservertip/2690/calculate-the-geographical-distance-between-two-cities-in-sql-server/

答案 1 :(得分:0)

在100NM以下的范围内,以下代码将指示您是否位于指定距离内的其他用户(具有良好的精度和卓越的性能)。

public static bool IsWithinRadius(double radius,double sLatitude, double sLongitude, 
                                  double dLatitude, double dLongitude, char unit='m')
{ // [sLatitude,sLongitude] defines the "center", i.e. the location of the current user.
    if(unit == 'm') radius=radius/1000 ; 
    double deltalat = (sLatitude -dLatitude )*40000f/360f ;
    double deltalon = (sLongitude-dLongitude)*40000f/360f ;
    if (deltalon>20000f) deltalon=40000f-deltalon ; // Points on both sides of meridian 0
    double loncorrection = Math.Cos(sLatitude*Math.PI/180);
    deltalon = deltalon*loncorrection ; 
    return Math.Sqrt(deltalat*deltalat+deltalon*deltalon)<radius ;   
} 

答案 2 :(得分:-1)

此任务称为“空间索引构造”。您可以使用R-tree执行此任务。其唯一目的是索引此类数据以供进一步搜索。更多here

可以在非常受欢迎的SharpMap项目中找到实施框架。

答案 3 :(得分:-1)

如果可能的话,一个很酷的想法是将用户的更新预先计算的距离信息保持在某个固定点。这可以是一个简单的字典,其中以km为单位的向下舍入距离作为关键字。每次注册新用户时,只需更新预先计算的距离缓存。

为什么?好吧,当您需要评估R表单用户X范围内的用户时,只需评估X与引用的距离,我们称之为D,然后放弃所有与参考预先计算的距离大于D + R或小于D - R的用户。当用户数量很高时,这会对性能产生很大影响。

如果用户位置非常动态,这是不可能的;如果你必须频繁更新预先计算的距离,那么解决方案就是自我失败。但是,没有任何背景,这是一个想法,以防万一。