【问题标题】:SQL radius search webservice IPhone SDKSQL 半径搜索网络服务 iPhone SDK
【发布时间】:2012-04-17 15:25:42
【问题描述】:

我正在使用以下查询在 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

【问题讨论】:

    标签: iphone sql sdk


    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2016-09-06
      • 2014-11-24
      • 1970-01-01
      相关资源
      最近更新 更多