2016-01-24 3 views
0

У меня есть такая функция в SQL Server. Я не понимаю, что это. Может кто-нибудь объяснить это мне кратко?Запрос с использованием долготы и широты в SQL Server

6371 * ACOS(ROUND(
      COS(RADIANS(Latitude1)) * 
      COS(RADIANS([Latitude2])) * 
      COS(RADIANS(Longitude1) - RADIANS(Longitude2)) + 
      SIN(RADIANS(Latitude1)) * 
      SIN(RADIANS([Latitude2])), 15, 2))*1000 <= 500 

ответ

2

Вы смотрите на формулу Haversine, которая вычисляет расстояние на сфере, используя свои координаты широты и долготы. Вот запрос, используя полное Haversine формулы:

SELECT 
    ACOS(
     COS(RADIANS(Latitude1)) 
    * COS(RADIANS(Latitude2)) 
    * COS(RADIANS(Longitude1) - RADIANS(Longitude2)) 
    + SIN(RADIANS(Latitude1)) 
    * SIN(RADIANS(Latitude2)) 
) AS haversineDistance 
FROM yourTable 

Посмотри this SO article или Wikipedia для получения дополнительной информации.

+0

Строго говоря, я считаю, что это сферическая косинус формула. Кроме того, почему бы не использовать класс географии, если вы используете SQL-сервер? https://msdn.microsoft.com/en-gb/library/microsoft.sqlserver.types.sqlgeography.aspx –

1

Как @TimBiegeleisen и @RobertRodkey сказали, что это старая школа формула вычисляя расстояние между двумя точками на Земле.

Таким образом, это приводит к некоторым другим вопросам:

  1. Q: Не SqlServer есть геопространственных методы доступны? A: Да для SQL Server версии 2008 и выше.
  2. В: Если Sql имеет это, используя методы Geography, следует ли использовать приведенную выше математику? A: Noесли вы находитесь на сервере Sql 2008 или позже. Если до этого, то у вас нет выбора, но вы должны использовать этот способ/формулу.
  3. В: Нарвалы, единороги океана? A: Да.

Далее показать наконечник - использовать STDistance .. это ваш друг :)

(браузер код, не тестируются и т.д.) ...

-- Arrange. 
DECLARE @longitude1 FLOAT = -122.360, 
     @latitude1 FLOAT = 47.656, 
     @longitude2 FLOAT = -122.343, 
     @latitude2 FLOAT = 47.656; 
DECLARE @point1 GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(' + CAST(@longitude1 AS VARCHAR(10)) + ' ' + CAST(@latitude1 AS VARCHAR(10)) + ')', 4326); 
DECLARE @point2 GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(' + CAST(@longitude2 AS VARCHAR(10)) + ' ' + CAST(@latitude2 AS VARCHAR(10)) + ')', 4326); 

-- Determine the distance (which would be in metres because we're using the 4326 == [common GPS format](http://spatialreference.org/ref/epsg/wgs-84/)). 
SELECT @point1.STDistance(@point2); 
Смежные вопросы