"最近邻居"在处理空间数据时,问题非常普遍。
甚至还有一些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 的解决方案......
答案 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
两个音符。
where
中的outer apply
条款是将搜索范围限制在(在这种情况下)距离彼此100米范围内的点(假设您正在使用SRID)其原始计量单位是米)。这可能适合您,也可能不适合您。如果没有,只需省略where
子句。
我认为仍然是游标。不要因为有一个declare cursor
语句可以看到数据库引擎有很多选择但是要遍历你的表并评估每个apply
而欺骗自己。行。