SQL radius搜索webservice IPhone SDK

时间:2011-10-18 07:41:08

标签: iphone sql sdk

我在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

1 个答案:

答案 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