Algorithm 快速地理空间搜索地理围栏不规则多边形

Algorithm 快速地理空间搜索地理围栏不规则多边形,algorithm,google-maps,search,geospatial,geofencing,Algorithm,Google Maps,Search,Geospatial,Geofencing,我可能有数十亿个多点,有时超过20个多边形区域,大小不一,相互交叉,嵌套分布在整个国家。尽管如此,多边形区域或“围栏”通常不会太大,与跨度相比,它们中的大多数在尺寸上可以忽略不计。多边形的点根据其GPS坐标进行描述。我需要一个快速算法来检查设备的当前GPS位置是否在任何封闭的“围栏”内 在使用一些搜索算法充分缩小候选对象的范围后,我曾考虑在多边形测试中使用光线投射算法点。现在的问题是,什么样的方法可以作为一种有效的2D搜索算法,同时考虑以下两个因素- 处理速度 数据结构应紧凑,因为存储空间有限

我可能有数十亿个多点,有时超过20个多边形区域,大小不一,相互交叉,嵌套分布在整个国家。尽管如此,多边形区域或“围栏”通常不会太大,与跨度相比,它们中的大多数在尺寸上可以忽略不计。多边形的点根据其GPS坐标进行描述。我需要一个快速算法来检查设备的当前GPS位置是否在任何封闭的“围栏”内

在使用一些搜索算法充分缩小候选对象的范围后,我曾考虑在多边形测试中使用光线投射算法点。现在的问题是,什么样的方法可以作为一种有效的2D搜索算法,同时考虑以下两个因素-

处理速度 数据结构应紧凑,因为存储空间有限 这些区域是静态和恒定的。因此,二维数据可以在存储之前根据任何要求预先排序。 该装置将安装在车辆上,因此无需在距离车辆足够远的区域重复搜索。如果连续的实时查找速度非常快,那么初始启动时间是可以接受的

我最初考虑使用KD树来执行边界框查询,在使用光线投射算法将每个“栅栏”减少到一个近似点后,使用其中的一个点

我也一直在研究hilbert曲线和geo hash

我正在考虑的另一种方法是使用矩形来包围栅栏。我们为每个栅栏选择这些矩形,使其与与纬度和经度对齐的栅格边对齐。 也就是说,分别求出栅栏的纬度和经度的最大值和最小值,让它们为LAT 1、LAT 2、LONG 1、LONG 2

现在,点LAT1、LONG1、LAT1、LONG2、LAT2、LONG1、LAT2、LONG2是矩形的坐标,该矩形与围栏必须包含在其中的网格对齐。尽管如此,我知道它不会是几何意义上的矩形

现在使用R树搜索当前gps位置所在的矩形。这将把搜索范围缩小到很少的结果,每个结果都可以使用光线投射算法单独测试

我还可以使用一种混合方法,使用K-D树作为初始块,然后应用R树搜索。 我也非常愿意接受任何其他方法

你认为解决这个问题的最好方法是什么


编辑-删除了多边形围栏的大小限制。

听起来您的多边形集是静态的。如果是这样的话,最快的方法之一可能是。非常简单地说,构建BSP树意味着从数十亿个多边形中拾取一条边,将穿过这条无限直线的任何多边形拆分为两半,将多边形划分为直线两侧的多边形,并在每一侧递归构建BSP树。在树的最底层是完全位于某一组原始多边形内部的凸多边形-例如,如果两个原始多边形A和B相交,但其中一个不完全包含另一个,则这将在最低层生成至少3个基本多边形,一个用于区域A但不用于区域B,一个用于区域B但不用于区域A,A和B各一个。如果其中任何一个不是凸的,则可能需要更多。每个多边形都可以使用它所属的原始多边形列表进行标记

在理想情况下,如果不分割多边形,则在构建BSP树后,查找您所在的完整多边形集是所有边数的总和,因为决定树中下一个要访问的子级只是对查询点位于线的哪一侧的O1测试

构建BSP树需要相当多的前期工作,尤其是如果您希望确保它尽可能少地进行多边形细分。它还要求多边形是凸面的,但如果不是这样,则可以通过先对多边形进行三角剖分来轻松地使其成为凸面


如果您的多边形集随时间缓慢增长,您当然可以使用新多边形的规则多边形点测试来补充上述技术,偶尔在达到某个阈值时重建BSP树。

您可以尝试多边形中的层次点测试,例如kirkpatrick数据结构,但它非常复杂。就个人而言,我会尝试矩形、kd树、希尔伯特曲线、四叉树。

您好,我假设并纠正我的错误,即此方法适用于一般的多面多边形集。假设多边形的大小有一定的上限,并且与多边形分布的跨度相比,这个大小是可忽略的,那么使用一些算法,首先将这些多边形视为点来删除,不是会更快吗
一大块?然后在确定附近的候选对象后,分别检查它们是否为多边形中的点?我看到在我写下这篇文章后,您编辑了这个问题,说多边形很小。是的,在那种情况下,这样做绝对有道理。如果不大于30x30的正方形意味着多边形不能宽或高出30km,则应制作一个正方形网格,每个30km x 30km,对于每个多边形,将其添加到其接触的每个网格单元的列表中,最多可以是4。然后对于查询点q,您需要测试的唯一网格单元是包含q及其8个邻居的单元。你可以为每个单元建立一个BSP树,但是蛮力可能已经足够了。嗨,我最后尝试了kd树,将每个栅栏近似到一个点。问题陈述再次演变,我需要取消围栏尺寸限制,尽管大多数围栏仍适合30公里X30公里的范围。数据是静态的。我目前正在研究R treesto索引边界框及其各种修改形式。该单元将被放置在汽车中,因此优先考虑的是搜索速度和索引大小。任何预先缓存附近围栏的方法都是有用的。