假设我有一个餐馆列表,我有一个正在寻找附近餐馆的顾客的位置。怎么用S2呢?
根据我的理解,如果没有S2,我将维护我自己的Quad Tree,其中包含所有的餐厅,然后我将获取我的客户的经纬度并查询我的Quad Tree以查找节点和相邻的Quad Tree节点。
S2如何符合这个图?它会取代我维护自己的四叉树的需要吗?
我对S2的理解是,在引擎盖下有四轴树和希尔伯空间填充曲线,给定纬度和经度可以提供64位单元格ID,标识纬度和经度所属的四轴树中的节点。
您通常在S2中使用的方式是通过现有的S2 API类,例如这里我将使用S2ClosestPointQuery
。
在内部,查询类构建一个内部索引(在本例中-使用餐馆的S2单元格),当您想要查找顾客附近的所有点时,它计算S2的希尔伯特曲线上与搜索位置(在本例中-顾客位置)在给定距离内的单元格范围,并在索引中查找这些单元格。
这篇来自Tinder的文章正是我一直在寻找的。
https://medium.com/tinder-engineering/geosharded-recommendations-part-1-sharding-approach-d5d54e0ec77a
如果你正在构建一个需要分区地理数据的服务,你可以使用S2为你提供特定位置的数字编码或特定半径的数字编码范围。您应该自己维护分区方案。