我正在使用' NearBy Properties' C#,Asp.net,.net ver 2.0和MSSQL 2005中的模块。我的要求就像,
我将特定的Lat
和Lan
值传递给DB,它应该通过比较传递的Lat
Lan
和Lat
来获取35个最近的属性已经保存在DB中的Lan
值。这可以在SQL部件本身完成吗?
我可以在Asp.net
部分
创建一个名为' 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;
}
然后使用' Miles'对DataTable进行排序字段,并从DataTable中获取前35行。
问题是,
我必须将所有数据库行提取到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
答案 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;
答案 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坐标。