我可能在一个国家的跨度中分布了数十亿个多点(有时超过20个)多边形区域(不同大小,交叉,嵌套)。但是,多边形区域或“围栏”通常不会太大,并且与跨度相比,大多数区域的尺寸可以忽略不计。多边形的点是根据它的GPS坐标来描述的。我需要一个快速算法来检查设备的当前GPS位置是否属于任何封闭的“栅栏”。
在使用一些搜索算法充分缩小候选者之后,我想到了使用RAY CASTING ALGORITHM(点多边形测试)。现在的问题是什么方法可以作为一种有效的2D搜索算法,保持以下两个考虑因素 -
该单元将被放置在车辆上,因此不需要对距离车辆附近足够远的区域重复搜索。如果连续的实时查找非常快,那么初始启动时间是可以接受的。
我最初想过使用KD树来执行边界框查询,然后将每个“栅栏”减少到一个点(大约使用其中的一个点),然后是光线投射算法。
我也一直在研究hilbert曲线和geo hash。
Another method I'm considering is to use RECTANGLES that just enclose the fences. We choose these rectangles for each fence such that it is aligned to the GRID (sides aligned to the latitude and longitude).
也就是说,单独找出围栏的纬度和经度的最大值和最小值,让它们为LAT 1, LAT 2, LONG 1 , LONG 2
。
现在点(LAT1, LONG1) , (LAT1, LONG2) , (LAT2, LONG1) , (LAT2, LONG2)
是矩形的坐标(与GRID对齐),栅栏必须包含在其中。(我知道它不是几何意义上的矩形,尽管如此。)
现在使用R树搜索当前gps位置所在的RECTANGLES
。这会将搜索范围缩小到很少的结果,每个结果都可以使用RAY CASTING ALGORITHM进行单独测试。
我也可以使用混合方法,使用K-D tree
作为初始块,然后应用R tree
搜索。
我对其他任何方法都持开放态度。
您认为解决此问题陈述的最佳方式是什么?
编辑 - 删除了多边形栅栏的尺寸限制。
答案 0 :(得分:0)
您可以尝试分层多边形点测试,例如kirkpatrick数据结构,但它非常复杂。 Personaly我会尝试矩形,kd树,希尔伯特曲线,四叉树。
答案 1 :(得分:-1)
听起来你的多边形集是静态的。如果是这样,最快的方式之一可能是binary space partitioning。简而言之,构建BSP树意味着从数十亿个多边形中拾取单个边,将跨越此(无限)线的任何多边形分成两半,将多边形划分为线的每一边的多边形,并递归地构建BSP每边都是树。在树的最底层是凸多边形,它们完全位于一组原始多边形内 - 例如,如果两个原始多边形A和B相交但一个不完全包含另一个,则这将在最低级别产生至少3个“基本”多边形,一个用于区域A但不用于B,一个用于B而不是A,如果其中任何一个都不是凸的,则可能需要更多。)每个都可以用它所属的原始多边形列表标记。
在没有分割多边形的理想情况下,一旦构建了BSP树,找到你所在的完整多边形集就是O(log(边缘总数)),因为在决定下一个要访问的子节点时树只是O(1)测试查询点所在行的哪一侧。
构建BSP树需要花费大量的工作,特别是如果你想确保它尽可能少的多边形细分。它还要求你的多边形是凸的,但如果不是这样,你可以通过先对它们进行三角测量来轻松制作它们。
如果你的多边形组随着时间的推移缓慢增长,你当然可以通过对新多边形进行常规的多边形点测试来补充上述技术,偶尔在达到某个阈值时重建BSP树。