2016-10-25 32 views
1

我有一個商店列表,每個商店都有像street_address,longitude,latitude這樣的數據。如何查詢訪問者鄰居中最近的商店的SQL Server數據庫?

現在,當用戶訪問我的網站,我想告訴他/她在他們附近的所有可用存儲(內10英里收音機「最接近最遠」)

這裏是我做了什麼。我創建了一個名爲StPoint的新列,其類型爲geography。我用geography::Point(latitude, longitude, 4326)功能,每家店的經度/緯度轉換爲一個點,像這樣

UPDATE stores 
SET StPoint = CASE WHEN latitude IS NOT NULL AND longitude IS NOT NULL 
    THEN geography::Point(latitude, longitude, 4326) 
    ELSE NULL END 

我試圖找到像這樣

SELECT 
CASE WHEN StPoint IS NOT NULL THEN StPoint.STIntersection(geography::Point(42.2974416, -71.4478897, 4326)).STAsText() ELSE NULL END AS distance 
FROM stores 

訪問者的當前點和所有門店之間的距離但是,這是給我像

GEOMETRYCOLLECTION EMPTY東西

或像這樣

POINT(-99.4478897 56.2974416)

最後,我用STDistance函數返回一個值嘗試(我不知道什麼單位在這裏使用)

SELECT StPoint.STDistance(geography::Point(42.2974416, -71.4478897, 4326)) 
FROM stores 

這裏是什麼上面的查詢顯示

27376.5070395886 
3973.49722397033 
27620.9636451663 
50346.8940144233 
7425.98548351235 
34193.3513625182 
樣本

正如你所看到的,結果不是以英里爲單位。我怎樣才能正確地得到最近的商店以及每個商店的訪問者的距離?

+0

'正如你所看到的,結果是沒有英里。 - 但你沒有告訴我們結果;) – MatBailie

+0

對不起,我忘了粘貼。我更新了問題。 – Jaylen

回答

1

它看起來像STDistance返回Geog單位的值。將其轉換爲萬里,你需要劃分VY 1609.344(1英里= 1609.344米)

SQL Server 2008 GEOGRAPHY STDistance() value

請嘗試以下

SELECT StPoint.STDistance(geography::Point(42.2974416, -71.4478897, 4326))/1609.344 
FROM stores 
+0

非常感謝。我也驗證了結果是準確的! – Jaylen