通过使用SQL地理的STContains函数,可以计算一组坐标是否在一个区域内,但是这表明,如果最后接收到的坐标恰好在该区域之外,则这些坐标不匹配任何位置。
这将是一种有效的方式来显示 多少 和 哪些设备 (在4000)存在于哪个位置基于静态组位置坐标和设备的动态坐标之间最小距离(在600)?
位置表:
loc_name | loc_lat | loc_long | loc_geo_polygon | loc_geo_point
设备表:
dev_name | dev_lat | dev_long | dev_geo_point
显而易见的解决方案是查询两个表中的所有数据,并遍历4000个设备,并测量返回最小距离的600个位置的距离,但这每次我要查看数据时都会产生240万次计算。即使我从列表中删除了位置已经匹配的设备,它仍然是很多计算,对于未来的增长潜力是有限的。
另一种方法是在我的设备表中添加一个 location_name 列,并在每次我从设备收到坐标时计算最近的位置,这将是每分钟100个设备x 600个位置的计算结果,比以前更好,因为这是一个稳定的负载而不是一个爆裂。
也许有更好的方法来逻辑地解决此问题,或者使用我不知道的功能来解决此问题?
我可以想到几种方法。双方要充分利用以前的解决方案的找到一套点的能力 是 你的固定位置之一的指定公差范围内。通过扩展,应该为您提供一种找到例外点的方法。
找到该集合后,您可以应用此处概述的“最近邻居”处理。它看起来像这样:
select * from ExceptionalPoints as e cross apply ( select top(1) l.* from Location as l order by l.loc_geo_point.STDistance(e.dev_geo_point) ) as nn
从文档中,应该能够利用表上的现有空间索引。
我能想到的另一种方法是使用您的位置创建Voronoi镶嵌。然后,将另一列添加到“位置”表中,以存储与该位置关联的Voronoi单元。那时,就像原始方法一样,将两个表连接在一起是一个问题。哎呀…这甚至可以 代替 原始方法(使用Voronoi Cell代替该位置周围的固定半径缓冲区)。但它附带了警告- 计算镶嵌细分并非易事。当然,您只需要执行一次(或每当位置更改时)。