2011-10-18 20 views
0

iPhoneのメートル単位の半径ベースの検索では、次のクエリを使用しています。私は10メートル以内にユーザーを見つける必要があります。しかし、問題は、私は次の値を返す。その SQL半径検索webservice IPhone SDK

dbo.GetDistanceFrom2LatLong(CONVERT(FLOAT,'9.585879'), CONVERT(FLOAT,'76.545477') 
、と私のクエリでは、次の機能を使用する場合は、

2 1106.079 
1 0 

が実際値1106.079が間違っている、

lat, lon 
-------- 
9.585879, 76.545488 
9.585879, 76.545477 

ときそれは10〜15メートル以内でなければなりません(私はこれをテストするために1106メートル移動しませんでした;))。私はGPS情報を取得し、次のSQL関数を使用するためにiPhoneのコアの場所を使用しています。誰もがこの機能から正確な距離を得る良い方法を提案できますか?

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