当前位置: 首页 > 面试题库 >

根据两者的坐标在一个位置选择和计数设备

羊舌高峰
2023-03-14
问题内容

通过使用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代替该位置周围的固定半径缓冲区)。但它附带了警告-
计算镶嵌细分并非易事。当然,您只需要执行一次(或每当位置更改时)。



 类似资料:
  • 问题内容: 我想做这样的事情: 如何在MySql中实现? 问题答案: 使用,而非子句进行汇总结果比较。 以面值查询: 理想情况下,应该在子句中定义适当的评估值,但是MySQL确实允许GROUP BY …中的隐藏列。 这是在准备唯一的约束吗?看起来应该是…

  • 问题内容: 我有一个模块(db.py),它从不同的数据库类型(sqlite,mysql等)加载数据。该模块包含一个db_loader类和从其继承的子类(sqlite_loader,mysql_loader)。 使用的数据库类型在单独的params文件中, 用户如何找回正确的物体? 即我该怎么做: 我是在db.py模块中使用一种称为loader的方法,还是有一种更优雅的方式使类可以根据参数选择自己的

  • 我正试图根据一个标准将x个列的数据归零 例如: 第1页: 一月二月三月四月五月六月七月八月九月十月十一月十二月 第2页: 版本(标准)=2 因此,我想选择前两个月,并在1月份将所有数据归零 更新:到目前为止,我得到了这么多,现在我只能选择 我无法让它选择范围。

  • 如果没有数据,如何根据两个表中两个列的值选择新列。 提前谢了。

  • 我有一个图像21810x14872,它投影了一个区域的方框,坐标为: 上、左角经纬度:23.635069763547662、58.09107365049769下、右角经纬度:23.598520470202025、58.14957297881731 或使用WGS84向北、向东: 上、左角东、北:617289.588、2610249.342下、右角东、北:611289.588、2614249.428

  • 如何手动设置窗格的坐标?当我单击ImageView时,我想在同一位置有一个不同的ImageView弹出窗口,然后放大它。我可以让它弹出,但它只能在所有ImageViews的父窗格的默认左上角弹出。