繁体   English   中英

坐标之间的匹配位置

[英]Match location between coordinates

我有一个包含位置名称、纬度、经度、容差的静态表。 例如:

NY, 40.7128, 74.0060, 100 x 50

这时候有600条记录,表会慢慢增长。

还有一个带有 MAC 地址的动态表,以及每隔几分钟更改一次的坐标:

AC233F271FE4, 40.7228, 74.0110

有 4000 条记录

我想计算每个位置有多少 MAC 地址在容差范围内。 地球是球体/椭球体的精度并不重要。

起初,当我想显示计数时,我打算在 SQL 查询中计算两点之间的距离,但现在我在想,当我更新 MAC 地址的坐标时,在 php 中计算这个是否更好。 我可以添加一个位置列,计算最近点,每隔几分钟更新一次 MAC 纬度/经度/位置。 那么用于显示计数的 SQL 查询将是一个简单的 SELECT COUNT GROUP。

主要问题是 - 在哪个阶段确定公差范围内的位置更好?

第二个问题是 - 我是使用 SQL 的地理函数(我读过它很慢)还是Haversine 公式以及如何实现两点之间距离的容差?

PS一直盯着,目前的计划是制作一个函数,该函数将为给定的坐标找到最近的位置名称,并在动态表中创建一个将调用该函数的计算列。 在我看来,它会像这样工作:

接收 MAC 地址, lat, long => update lat, long 其中 MAC 与接收相同 => 计算列运行函数以获取更新坐标的名称 => 在前端我希望可以显示 MAC + 位置名称。

这对我来说看起来过于复杂和混乱,对于找到更好的方法很有教育意义。

这感觉像是对 SQL Server 中地理空间功能的极大利用。 你可以(大部分)用你拥有的东西来做,但有一些性能增强。 这是我的建议。

向静态位置表中添加一列,表示容差的多边形。 我不确定“100 x 50”是什么意思(一个 100m x 50m 的边界框?如果是这样,方向是什么?)。 无论哪种方式,大概您都可以根据纬度/经度和容差推导出多边形。 将其保留在geography类型的列中。 在此列上放置索引。

同样,向动态表中添加一列。 在某些方面,这是比上面,你可以只让一个计算列(如果你能坚持)更容易拥有的定义newColumn as geography::Point(Latitude, Longitude, 4236) 也索引此列。

最后,您拥有所需的东西。 您现在可以像这样运行地理空间查询:

select *
from dbo.dynamicTable as d
join dbo.staticTable as s
   on s.BoundingBox.STContains(d.Point) = 1;

这两个表的索引是合理的。 否则,它必须在两者之间进行笛卡尔连接。 无论具体情况如何,这都不太可能表现良好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM