坐标之间的匹配位置

Posted

技术标签:

【中文标题】坐标之间的匹配位置【英文标题】:Match location between coordinates 【发布时间】:2020-10-20 21:24:01 【问题描述】:

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

NY, 40.7128, 74.0060, 100 x 50

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

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

AC233F271FE4, 40.7228, 74.0110

有 4000 条记录

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

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

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

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

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

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

这对我来说看起来过于复杂和困惑,寻找更好的方法会很有教育意义。

【问题讨论】:

【参考方案1】:

这感觉像是对 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;

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

【讨论】:

您的建议很有效,但揭示了一个问题:由于隧道等原因,最后传输的坐标可能超出容差范围。似乎更好的位置表示是到位置之间的最小距离所有已知位置,而不是公差区域。例如:动态表中的坐标不在任何静态公差方格内,而是距 s.location1 100m,距 s.location2 200m。合理地假设 location1 甚至认为不适合 50x50 容差。是否有替代 STContains 以获得最小距离? 不是为了积分,但您应该将其作为一个单独的问题提出,以便更容易发现(对于其他有类似问题的人)。请随时在此处发表评论并附上指向该链接的链接,我可以看一下。但是剧透警报-我对您的解决方案有一些想法。 :) i posted the new question here

以上是关于坐标之间的匹配位置的主要内容,如果未能解决你的问题,请参考以下文章

在MATLAB中知道多个点的位置坐标,怎样求各个点之间的距离?

在两个位置之间的直线上的各个位置推导出 Lat\Lng 坐标

“我当前的地理位置”和其他坐标之间的计算

从坐标数组到表格中的位置之间的距离

相对“位置:绝对”坐标之间的动画对象

如果我的位置在 2 个坐标之间,则 PHP/JS 结果