我正在用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服务器。请指教。
答案 0 :(得分:0)
在SQL Server中,您可以使用地理空间类型。这将允许您按距离查询数据库和订单。
检查出来:
https://technet.microsoft.com/en-us/library/cc280766(v=sql.100).aspx
答案 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)
答案 3 :(得分:-1)
如果可能的话,一个很酷的想法是将用户的更新预先计算的距离信息保持在某个固定点。这可以是一个简单的字典,其中以km为单位的向下舍入距离作为关键字。每次注册新用户时,只需更新预先计算的距离缓存。
为什么?好吧,当您需要评估R
表单用户X
范围内的用户时,只需评估X
与引用的距离,我们称之为D
,然后放弃所有与参考预先计算的距离大于D + R
或小于D - R
的用户。当用户数量很高时,这会对性能产生很大影响。
如果用户位置非常动态,这是不可能的;如果你必须频繁更新预先计算的距离,那么解决方案就是自我失败。但是,没有任何背景,这是一个想法,以防万一。