首页 > 解决方案 > 如何识别与给定地理围栏重叠的六边形?

问题描述

介绍了 H3 API 参考polyfill,其理念是“在围绕给定地理围栏定义的 k 环中的每个六边形上进行点内多边形操作”。问题是:

  1. 我不明白“围绕地理围栏定义的 k 环”是什么意思,这是一个“环”吗?它的中心实际上是整个地理围栏?
  2. 如果判断是基于六边形的中心位置,并进行“多边形中的点”操作,则地理围栏和六边形有可能重叠,但六边形的中心不在地理围栏内,我无法得到它的索引使用polyfill. 那么,有什么方法可以分别获得完全在地理围栏内的两种六边形和与地理围栏部分重叠的六边形?

标签: h3

解决方案


你实际上可以忽略这k-ring部分——它是一个实现细节,事实上,这个细节在最新版本的库中已经改变了。这两种实现的基本思想是我们收集一组覆盖整个多边形的“测试”单元格,然后根据每个单元格的中心进行多边形点检查。

听起来您需要的是获取所有完全包含的单元格和所有相交单元格的方法。这个功能有一个现有的特性请求,虽然我们想添加这个,但目前库中不支持其他 polyfill 模式。

自己滚动并不难,但对于大型系列来说可能会很慢。您需要对单元格和多边形进行多边形相交检查 - 一个简单的实现将简单地检查任何两个线段是否相交(O(polygonVertices)因为单元格顶点的计数实际上是恒定的)。

  • 运行polyfill以获得起始设置。这包括完全包含的单元格和一些(但不一定是全部)部分包含的单元格。

  • 对于起始集中的每个单元格,检查它是否与多边形相交

    • 如果它不相交,则它是完全包含的,添加到包含的单元格集合中
    • 如果它确实相交,则添加到部分包含的单元格集以及“边界”单元格的临时队列中。
    • 如果它与多边形相邻,则它是完全包含的。将其添加到包含单元格的集合中,也添加到边界单元格队列中。
  • 现在识别不在初始polyfill集中的部分包含的单元格。当单元格保留在边界队列中时,弹出第一个单元格并使用kRing(cell, 1)它来获取其邻居。对于每个邻居:

    • 如果邻居在初始polyfill集合中,则忽略。
    • 如果邻居不与多边形相交,则忽略。
    • 如果邻居与多边形相交,则添加到部分包含的单元格集合中并推入边界队列。
  • 当边界队列为空时,您的两个集合(包含和部分包含)是完整的。


推荐阅读