2016-01-24 52 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 articleWikipedia以獲取更多信息。

+0

嚴格地說,我相信它是球形餘弦式。另外,如果你使用SQL服務器,爲什麼不使用Geography類呢? https://msdn.microsoft.com/en-gb/library/microsoft.sqlserver.types.sqlgeography.aspx –

1

就像@TimBiegeleisen和@RobertRodkey說,它是一個老同學的公式計算地球上兩點之間的距離。

因此,這導致了一些其他問題:

  1. 問:不SqlServer的具有可用的地理空間的方法呢? - 答:是的 SQL服務器版本2008和更高版本。
  2. 問:如果Sql使用Geography方法有這個可用,我應該使用上面的數學嗎? - 答:沒有如果你在Sql Server 2008或更高版本。如果在此之前,那麼你別無選擇,但你必須使用這種方式/公式。
  3. 問:Narwhales,海洋獨角獸? - 答:是的

而且炫耀提示 - 使用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);