查询以将在特定地理距离内的行返回到给定行(使用 sql server 2008)

Posted

技术标签:

【中文标题】查询以将在特定地理距离内的行返回到给定行(使用 sql server 2008)【英文标题】:Query to return the rows that are within a certain geographic distance to a given row (using sql server 2008) 【发布时间】:2010-01-08 22:18:50 【问题描述】:

我有一个包含多条记录的表,每条记录都包含一个名为“coords”的字段。此字段已更新为地理点。

UPDATE testing SET [coords] = geography::Point(52.029736, -113.973541, 4326)
WHERE id=2"

我需要做的是......当用户登录时,他们有一条属于他们的记录,因为这个例子说它的记录 id #1。他们需要访问一个页面,该页面显示“坐标”字段位于一定距离内的所有其他记录。

这是我想出的最好的;

第一,我可以找到与这句话相协调的开始;

SELECT coords FROM testing WHERE id=1

这给了我作为 coords.Lat 和 coords.Long 的原始坐标

那我想找附近的,所以我有这个;

SELECT * FROM testing WHERE coords.STDistance() <=(20 * 1609.344)

我不知道如何将原始坐标放入第二个语句以使其工作。

我是否需要一个存储过程,或者我可以以某种方式将 coords.Lat/coords.Long 放在 STDistance 的括号内?还是我完全不知道我期望它如何工作。

仅供参考,我对 sql server 的经验很少,我从来没有做过任何“高级”的事情,只有简单的select * from table where record = 1 和基本的插入和更新。

【问题讨论】:

@Drew:欢迎来到 SO,请花几分钟时间阅读简单的降价文档。当您在左侧空白处编辑或创建问题时,您可以阅读基础知识。 【参考方案1】:

这行得通吗?

SELECT
    [near].* 
FROM 
    testing [near]
INNER JOIN
    testing [user] ON
    [user].coords.STDistance( [near].coords ) < (20 * 1609.344)
WHERE
    [user].id = 1

【讨论】:

【参考方案2】:

这个怎么样?

 DECLARE @g geography;
 SELECT @g = coords FROM testing WHERE id=1;        
 SELECT * FROM testing WHERE coords.STDistance(@g) <=(20 * 1609.344)

【讨论】:

【参考方案3】:

我自己用 2 个选择和 2 个变量解决了这个问题...有什么建议可以让它变得更好吗?

sql1 = "SELECT coords.Lat, coords.Long FROM testing WHERE id=1"
lat2 = rs(0)
lon2 = rs(1)
sql2 = "SELECT * FROM testing WHERE id <> 1 AND coords.STDistance(geography::Point(" & lat2 & ", " & lon2 & ", 4326)) <=(20 * 1609.344)"
'20 miles or less

【讨论】:

以上是关于查询以将在特定地理距离内的行返回到给定行(使用 sql server 2008)的主要内容,如果未能解决你的问题,请参考以下文章

如何计算具有 lat+long 信息的集合的地理空间距离?

使用经度和纬度查找给定距离内的所有附近客户

SQL Server 2008 地理空间查询

如何进行地理距离查询仅返回我尚未“喜欢”的结果、Elastic Search、Dynamo DB

如何将在我的数据库中创建的特定行列入黑名单?

在mongodb中聚类地理数据