如何查询SQL Server数据库中访问者附近最近的商店?

时间:2016-10-25 16:00:49

标签: sql sql-server geolocation geography sqlgeography

我有一个商店列表,每个商店都有street_address,经度,纬度等数据。

现在,当用户访问我的网站时,我想向他/她显示他们附近所有可用的商店(距离最近的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

或类似的东西

  

要点(-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

如您所见,结果并非数英里。如何才能正确获取最近的商店以及每家商店的访客距离?

1 个答案:

答案 0 :(得分:2)

看起来STDistance会以Geog为单位返回值。把它转换成Miles你需要划分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