坐标之间的匹配位置
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中知道多个点的位置坐标,怎样求各个点之间的距离?