gpt4 book ai didi

php - 根据两者的坐标选择和计算某个位置的设备

转载 作者:行者123 更新时间:2023-12-04 03:50:06 25 4
gpt4 key购买 nike

通过使用 SQL geography 的 STContains 函数,可以 calculate if a set of coordinates is within an area ,然而这表明如果最后接收的坐标刚好在该区域之外,那么这些坐标与任何位置都不匹配。
根据一组静态位置坐标和设备的动态坐标之间的最小距离,显示在哪个位置(共 600 个)中存在多少和哪些设备(共 4000 个)的有效方法是什么?
位置表:

loc_name | loc_lat | loc_long | loc_geo_polygon | loc_geo_point
设备表:
dev_name | dev_lat | dev_long | dev_geo_point
明显的解决方案是查询所有数据的两个表并循环遍历 4000 个设备并测量到 600 个位置的距离返回最小距离,但是每次我想查看数据时都会创建 240 万次计算。即使我从列表中删除了一个位置已经匹配的设备,它仍然是相当多的计算, future 增长的潜力有限。
另一种方法是在 Devices 表中添加一个 location_name 列,并在每次我从设备接收坐标时计算最近的位置,这将是每分钟 100 个设备 x 600 个位置计算,比以前更好,因为它是一个稳定的负载而不是一个爆裂。
也许有更好的方法可以从逻辑上或使用我不知道的功能来解决这个问题?

最佳答案

我可以想到几种方法。两者都将利用先前解决方案的能力来查找位于您的一个固定位置的指定容差范围内的一组点。推而广之,这应该为您提供一种找到异常点集的方法。
找到该集合后,您可以应用概述的“最近邻”处理 here .它看起来像这样:

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 Tessellation使用您的位置。然后将另一列添加到 Locations 表中以存储与该位置关联的 Voronoi Cell。那时,就像在原始方法中一样,将两个表连接起来。哎呀……这甚至可以取代原来的方法(使用 Voronoi Cell 而不是该位置周围的固定半径缓冲区)。但它伴随着警告 - 计算曲面分割并非易事。当然,您只需要执行一次(或每当位置集更改时)。

关于php - 根据两者的坐标选择和计算某个位置的设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64544565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com