查找距离特定点最远 500 米的纬度/经度的行



我有一个包含纬度和经度列的表(两者都是浮点数),现在我正在构建一个存储过程,该过程获取一个点作为参数并查找哪些行距离它最远 500 米。

我在我的 where 子句上使用以下语句,但它不起作用:

(geometry::STGeomFromText('POINT(' + CAST(Longitude AS VARCHAR(20)) + ' ' + 
CAST(Latitude AS VARCHAR(20)) 
+ ')', 4326).STDistance(@currentLocation) / 1000) < @radius

@currentLocationgeometry@radiusfloat

我正在使用 SQL Server 2012。我的where条款有什么问题?

从样式和性能的角度来看,有几个问题,但就功能而言,查询不起作用的原因是因为(我猜)您提供了 500 的@radius参数,期望它搜索 500 米内的位置?

但是,经度和纬度坐标是角坐标,以度为单位,对吧?所以你实际上在做的是找到那些距离@currentLocation小于500/1000度的点(不知道你为什么要除以1000?

我猜你真的想在这个查询中使用地理数据类型。你还应该使用 Point() 方法而不是 STGeomFromText() 方法,方法会稍微快一些,也更整洁,因为它不涉及所有的 CASTing。

然后,您的 WHERE 子句将如下所示:

geography::Point(Latitude, Longitude, 4326).STDistance(@currentLocation) < @radius

这里仍然存在问题 - 由于您仅为查询中的每一行动态创建地理点实例,因此您将无法使用任何索引,并且查询可能会非常慢。更好的方法是在表中创建一个持久计算列:

ALTER TABLE yourTable
ADD Location AS geography::Point(Latitude, Longitude, 4326) PERSISTED;

然后向此列添加空间索引(表中需要聚集主键),然后查询将变为:

SELECT * FROM yourTable
WHERE Location.STDistance(@currentLocation) < 500;

最新更新