SQL radius search webservice iPhone SDK

#iphone #sql #sdk

#iPhone #sql #sdk

Вопрос:

Я использую следующий запрос для поиска на основе radius в метрах в 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:

Я отвечаю на свой собственный вопрос. Когда я изменил свою функцию следующим образом, она сработала. Надеюсь, это может помочь другим.

 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