2011-10-18 89 views
0

我在iPhone中使用以下查詢進行基於半徑的搜索。我需要在10米範圍內找到用戶。但是,當問題是,SQL半徑搜索web服務IPhone SDK

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

我在回答我自己的問題。當我改變我的功能如下它的工作。希望這可以幫助其他人。

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([email protected])); 

    Set @d = @R * @c; 
    Return @d; 

End