如何识别与给定地理围栏重叠的六边形?
How to identify the hexagons which overlap with a given geofence?
引入了 H3 API 参考文献 polyfill
,其思想是“在给定地理围栏周围定义的 k 环中的每个六边形上的多边形点操作”。问题是:
- 我不明白“围绕地理围栏定义的 k 环”是什么意思,这是一个“环”吗?它的中心实际上是整个地理围栏?
- 如果根据六边形的中心位置判断,做一个“多边形中的点”操作,有可能地理围栏和六边形重叠,但是六边形的中心在地理围栏外,我不能'使用
polyfill
获取它的索引。那么,有什么方法可以分别得到两种完全在地理围栏内的六边形和部分与地理围栏重叠的六边形吗?
您实际上可以忽略其中的 k-ring
部分 - 它是一个实现细节,事实上,该细节在最新版本的库中已更改。两种实现的基本思想是我们收集一组覆盖整个多边形的“测试”单元格,然后根据每个单元格的中心进行多边形点检查。
听起来您需要的是获取所有完全包含的单元格和所有交叉单元格的方法。此功能有 an existing feature request,虽然我们想添加此功能,但目前库中不支持其他 polyfill 模式。
自己滚动并不太难,但对于大集合来说可能会很慢。您需要对单元格和多边形进行多边形相交检查 - 一个简单的实现会简单地检查是否有任何两个线段相交(O(polygonVertices)
,因为单元格顶点的数量实际上是恒定的)。
运行 polyfill
获取起始集。这包括完全包含的和一些(但不一定是全部)部分包含的单元格。
对于起始集中的每个单元格,检查它是否与多边形相交
- 如果不相交,则完全包含,添加到包含单元格的集合中
- 如果确实相交,则将其添加到部分包含的单元格集以及“边界”单元格的临时队列中。
- 如果它与多边形相邻,则它完全包含在内。将其添加到包含单元格的集合中,同时也添加到边界单元格队列中。
现在识别不在初始 polyfill
集中的部分包含的单元格。当单元格保留在边界队列中时,弹出第一个单元格并使用 kRing(cell, 1)
获取其邻居。对于每个邻居:
- 如果邻居在初始
polyfill
集合中,则忽略。
- 如果邻居不与多边形相交,则忽略。
- 如果邻居与多边形相交,则添加到部分包含的单元格集并推入边界队列。
当边界队列为空时,你的两组(包含和部分包含)就完成了。
引入了 H3 API 参考文献 polyfill
,其思想是“在给定地理围栏周围定义的 k 环中的每个六边形上的多边形点操作”。问题是:
- 我不明白“围绕地理围栏定义的 k 环”是什么意思,这是一个“环”吗?它的中心实际上是整个地理围栏?
- 如果根据六边形的中心位置判断,做一个“多边形中的点”操作,有可能地理围栏和六边形重叠,但是六边形的中心在地理围栏外,我不能'使用
polyfill
获取它的索引。那么,有什么方法可以分别得到两种完全在地理围栏内的六边形和部分与地理围栏重叠的六边形吗?
您实际上可以忽略其中的 k-ring
部分 - 它是一个实现细节,事实上,该细节在最新版本的库中已更改。两种实现的基本思想是我们收集一组覆盖整个多边形的“测试”单元格,然后根据每个单元格的中心进行多边形点检查。
听起来您需要的是获取所有完全包含的单元格和所有交叉单元格的方法。此功能有 an existing feature request,虽然我们想添加此功能,但目前库中不支持其他 polyfill 模式。
自己滚动并不太难,但对于大集合来说可能会很慢。您需要对单元格和多边形进行多边形相交检查 - 一个简单的实现会简单地检查是否有任何两个线段相交(O(polygonVertices)
,因为单元格顶点的数量实际上是恒定的)。
运行
polyfill
获取起始集。这包括完全包含的和一些(但不一定是全部)部分包含的单元格。对于起始集中的每个单元格,检查它是否与多边形相交
- 如果不相交,则完全包含,添加到包含单元格的集合中
- 如果确实相交,则将其添加到部分包含的单元格集以及“边界”单元格的临时队列中。
- 如果它与多边形相邻,则它完全包含在内。将其添加到包含单元格的集合中,同时也添加到边界单元格队列中。
现在识别不在初始
polyfill
集中的部分包含的单元格。当单元格保留在边界队列中时,弹出第一个单元格并使用kRing(cell, 1)
获取其邻居。对于每个邻居:- 如果邻居在初始
polyfill
集合中,则忽略。 - 如果邻居不与多边形相交,则忽略。
- 如果邻居与多边形相交,则添加到部分包含的单元格集并推入边界队列。
- 如果邻居在初始
当边界队列为空时,你的两组(包含和部分包含)就完成了。