选择前35个Lat Lan记录,参考MS SQL表中的特定Lat Lan

时间:2013-01-25 06:40:27

标签: c# asp.net sql-server-2005

我正在使用' NearBy Properties' C#,Asp.net,.net ver 2.0和MSSQL 2005中的模块。我的要求就像,

我将特定的LatLan值传递给DB,它应该通过比较传递的Lat LanLat来获取35个最近的属性已经保存在DB中的Lan值。这可以在SQL部件本身完成吗?

我可以在Asp.net部分

中执行此操作
  1. 循环遍历DataTable中的所有行,然后
  2. 创建一个名为' Miles'的额外字段。在DataTable中并将Km值插入到 它,像这样

    public decimal calcDistance(decimal latA, decimal longA, decimal latB, decimal longB)
    {
            double theDistance = (Math.Sin(DegreesToRadians(latA)) *
            Math.Sin(DegreesToRadians(latB)) +
            Math.Cos(DegreesToRadians(latA)) *
            Math.Cos(DegreesToRadians(latB)) *
            Math.Cos(DegreesToRadians(longA - longB)));
    
    return Convert.ToDecimal((RadiansToDegrees(Math.Acos(theDistance)))) * 69.09M * 1.6093M;
    }
    
  3. 然后使用' Miles'对DataTable进行排序字段,并从DataTable中获取前35行。

  4. 问题是,

    我必须将所有数据库行提取到asp部分,然后执行for循环然后进行排序,这会占用大量时间和资源,有没有办法在SQL部分本身执行此操作?

    我将@Bacon Bits的答案调整为

    SELECT PM.Id AS PropertyId,PM.Address,PM.PropertyImage,  ROUND((DEGREES(ACOS(SIN(RADIANS('9.98')) * SIN(RADIANS(PM.Latitude)) + COS(RADIANS('9.98')) * COS(RADIANS(PM.Latitude)) * COS(RADIANS(76.27999999999997 - PM.Longitude)))) * 69.09 * 1.6093),0) AS Miles 
    FROM Tbl_PropertyMaster PM 
    INNER JOIN dbo.Tbl_PropertyApproval AS PA  
    ON PA.PropertyId = PM.Id 
    WHERE PM.IsDeleted='False' AND PM.Enabled='True' and PA.Action='Approved' AND ROUND((DEGREES(ACOS(SIN(RADIANS('9.98')) * SIN(RADIANS(PM.Latitude)) + COS(RADIANS('9.98')) * COS(RADIANS(PM.Latitude)) * COS(RADIANS(76.27999999999997 - PM.Longitude)))) * 69.09 * 1.6093),0) < 1000 
    ORDER BY Miles DESC
    

2 个答案:

答案 0 :(得分:0)

创建一个标量函数,用于计算给定的两组lan-lat参数之间的距离(就像在asp.net端一样)。 例如:

SELECT TOP 35 * FROM Table_1 ORDER BY dbo.calcDistance(field_latitude,field_longitude, param_lat,param_long) DESC;

我不知道如何计算给定的两组lang,lat的距离。由您编写函数实现。您可以使用herehere

答案 1 :(得分:0)

尝试以下用户定义的函数,它是您提供给TSQL的函数的转换。这应该与SQL Server一样准确。查询应该适用于SQL Server 2005及更高版本。请注意,您应该评估两个静态值的乘积。我只是懒惰。

CREATE FUNCTION dbo.calcDistance (
    @latA AS NUMERIC(38, 35),
    @longA AS NUMERIC(38, 35),
    @latB AS NUMERIC(38, 35),
    @longB AS NUMERIC(38, 35)
    )
RETURNS NUMERIC(38, 35)
AS
BEGIN
    RETURN (DEGREES(ACOS(SIN(RADIANS(@latA)) * SIN(RADIANS(@latB)) + COS(RADIANS(@latA)) * COS(RADIANS(@latB)) * COS(RADIANS(@longA - @longB)))) * 69.09 * 1.6093)
END

SQLFiddle。我的示例使用了测试中的位置和Mangalore的Wikipedia坐标。