我在iPhone中以米为单位使用以下查询进行基于半径的搜索。我需要找到10米以内的用户。但问题是,
lat, lon
--------
9.585879, 76.545488
9.585879, 76.545477
如果我在查询中使用以下函数,
dbo.GetDistanceFrom2LatLong(CONVERT(FLOAT,'9.585879'), CONVERT(FLOAT,'76.545477')
返回以下值,
2 1106.079
1 0
实际上值1106.079是错误的,应该在10到15米之内(我没有移动1106米来测试这个;))。我正在使用iPhone核心位置获取GPS信息并使用以下SQL功能。任何人都可以建议一种更好的方法来获得与此功能的确切距离吗?
ALTER Function [dbo].[GetDistanceFrom2LatLong]
(
@Lat1 Float(18),
@Long1 Float(18),
@Lat2 Float(18),
@Long2 Float(18),
@ReturnType VarChar(10)
)
Returns Float(18)
AS
Begin
Declare @R Float(8);
Declare @dLat Float(18);
Declare @dLon Float(18);
Declare @a Float(18);
Declare @c Float(18);
Declare @d Float(18);
Set @R =
Case @ReturnType
When 'Miles' Then 3956.55
When 'Kilometers' Then 6367.45
When 'Feet' Then 20890584
When 'Meters' Then 6367450
Else 20890584 -- Default feet (Garmin rel elev)
End
Set @dLat = Radians(@lat2 - @lat1);
Set @dLon = Radians(@long2 - @long1);
Set @a = Sin(@dLat / 2)
* Sin(@dLat / 2)
+ Cos(Radians(@lat1))
* Cos(Radians(@lat2))
* Sin(@dLon / 2)
* Sin(@dLon / 2);
Set @c = 2 * Asin(Min(Sqrt(@a)));
Set @d = @R * @c;
Return @d;
End
答案 0 :(得分:1)
我正在回答我自己的问题。当我改变我的功能如下,它的工作。希望这可以帮助别人。
ALTER Function [dbo].[GetDistanceFrom2LatLong]
(
@Lat1 Float(18),
@Long1 Float(18),
@Lat2 Float(18),
@Long2 Float(18),
@ReturnType VarChar(10)
)
Returns Float(18)
AS
Begin
Declare @R Float(8);
Declare @dLat Float(18);
Declare @dLon Float(18);
Declare @a Float(18);
Declare @c Float(18);
Declare @d Float(18);
Set @R =
Case @ReturnType
When 'Miles' Then 3956.55
When 'Kilometers' Then 6367.45
When 'Feet' Then 20890584
When 'Meters' Then 6367450
Else 20890584 -- Default feet (Garmin rel elev)
End
Set @dLat = Radians(@lat2 - @lat1);
Set @dLon = Radians(@long2 - @long1);
Set @a = Sin(@dLat / 2)
* Sin(@dLat / 2)
+ Cos(Radians(@lat1))
* Cos(Radians(@lat2))
* Sin(@dLon / 2)
* Sin(@dLon / 2);
--Set @c = 2 * Asin(Min(Sqrt(@a)));
Set @c = 2 * Atn2(sqrt(@a),sqrt(1-@a));
Set @d = @R * @c;
Return @d;
End