我有一个商店列表,每个商店都有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
如您所见,结果并非数英里。如何才能正确获取最近的商店以及每家商店的访客距离?
答案 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