如何计算最近邻居"对于Sql Server中的多个源?

时间:2017-04-05 05:12:42

标签: sql-server spatial nearest-neighbor

"最近邻居"在处理空间数据时,问题非常普遍。

甚至还有一些nice, simple documentation关于如何在他们的文档中使用MS Sql Server做到这一点!

我经常会看到使用1x源Lat / Long的示例,它会返回' x'最近邻数Lat / Longs。细...

e.g。

USE AdventureWorks2012  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
WHERE SpatialLocation.STDistance(@g) IS NOT NULL  
ORDER BY SpatialLocation.STDistance(@g);

在我的情况下,我有多个 Lat / Long源...并且对于每个来源,需要返回' x'最近邻居的数量。

有人可以帮忙吗?

这是我的架构

Table: SomeGeogBoundaries
LocationId INTEGER PRIMARY KEY (it's not an identity, but a PK & FK)
CentrePoint GEOGRAPHY

Index:
Spatial Index on CentrePoint column. [Geography || MEDIUM, MEDIUM, HIGH, HIGH]

示例数据。

LocationId | CP Lat/Long
1          | 10,10
2          | 11,11
3          | 20,20

..

在此表中的foreach位置,我需要找到最接近的...说其他5个位置。

更新:

到目前为止......看起来使用CURSOR是唯一的方法..但我可以使用更多基于 set 的解决方案......

1 个答案:

答案 0 :(得分:1)

您需要在同一组中找到最近的邻居吗?

SELECT *
FROM SomeGeogBoundaries as b
OUTER APPLY (
   SELECT TOP(5) CentrePoint
   FROM SomeGeogBoundaries as t
   WHERE t.CentrePoint.STInsersects(b.CentrePoint.STBuffer(100))
   ORDER by b.CentrePoint.STDistance(t.CentrePoint)
) AS nn

两个音符。

  1. where中的outer apply条款是将搜索范围限制在(在这种情况下)距离彼此100米范围内的点(假设您正在使用SRID)其原始计量单位是米)。这可能适合您,也可能不适合您。如果没有,只需省略where子句。

  2. 我认为仍然是游标。不要因为有一个declare cursor语句可以看到数据库引擎有很多选择但是要遍历你的表并评估每个apply而欺骗自己。行。