通过使用 SQL 地理的 STContains 函数,可以计算一组坐标是否在一个区域内 https://stackoverflow.com/questions/64453530/match-location-between-coordinates/64467776,但这表明如果最后收到的坐标正好在该区域之外,那么这些坐标与任何位置都不匹配。
什么是有效的展示方式how many and 哪些设备根据一组静态位置坐标与设备动态坐标之间的最小距离,(共 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 万次计算。即使我从列表中删除位置已匹配的设备,计算量仍然很大,未来增长的潜力有限。
另一种方法是添加一个地点名称列到设备表中,并在每次从设备接收到坐标时计算最近的位置,即每分钟计算 100 个设备 x 600 个位置,比以前更好,因为它是稳定负载而不是突发负载。
也许有更好的方法来逻辑地处理这个问题,或者使用我不知道的函数?
我可以想出几种方法。两者都将利用先前解决方案的能力来找到一组点are在您的固定位置之一的指定容差范围内。通过扩展,这应该为您提供一种找到一组特殊点的方法。
找到该集合后,您可以应用概述的“最近邻居”处理here https://learn.microsoft.com/en-us/sql/relational-databases/spatial/query-spatial-data-for-nearest-neighbor?view=sql-server-ver15。它看起来像这样:
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
从文档来看,应该能够利用表上现有的空间索引。
我能想到的另一种方法是创建一个沃罗诺伊镶嵌 https://en.wikipedia.org/wiki/Voronoi_diagram使用您的位置。然后,您可以向“位置”表中添加另一列,以存储与该位置关联的 Voronoi 单元。那时,就像原始方法一样连接两个表。哎呀...这甚至可以replace原始方法(使用 Voronoi Cell 而不是该位置周围的固定半径缓冲区)。但它也有一个警告——计算曲面细分并非易事。当然,您只需要执行一次(或者每当位置集发生变化时)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)