【问题标题】:How to perform the Search operation using Google S2 geometry如何使用 Google S2 几何执行搜索操作
【发布时间】:2019-08-28 07:24:53
【问题描述】:

我有车辆的地理位置和我在城市中的点,我需要找到那些在我点半径 5 公里范围内的车辆。 我可以用 S2 单元 ID 表示车辆位置和我的观点。但是怎么查询呢?

我可以将所有用户的数据存储在数据库中并查询 S2 单元 ID。 由于 S2 cell id 使用 Hilbert 曲线,我们可以知道那些具有更接近 S2 cell id 的车辆彼此之间的距离更近。 或者还有什么其他方法我必须在这里使用来执行搜索操作?

【问题讨论】:

    标签: python geometry s2


    【解决方案1】:

    我会把这个问题分成几个步骤:

    1. 为您的应用选择合适的 S2 级别。在您的情况下,由于您以 5 公里半径进行查询,我会选择 13 级单元格,它们具有 average size of 1.27 km^2

    2. 在人周围 5 公里半径范围内生成一个 13 级细胞覆盖。

    3. 从汽车的 lat/lng 获取 13 级单元格。

    4. 对汽车 S2 Cell 进行包含检查,检查半径为 5 KM 的 S2 Cell 覆盖范围。

    这是Node.js JavaScript S2 Library 的示例:

    const s2 = require('@radarlabs/s2');
    
    # s2 cell level of ~1.27 km^2
    const level = 13;
    
    # cell covering of enclosure around a person
    const enclosureLLs = [
      [40.77933906065449, -73.96983146667479],
      [40.77933906065449, -73.9634370803833],
      [40.78483079505022, -73.9634370803833],
      [40.78483079505022, -73.96983146667479],
    ].map((latlng) => {
      const [lat, lng] = latlng;
      return new s2.LatLng(lat, lng);
    });
    
    const enclosureCells = new Set(s2.RegionCoverer.getCoveringTokens(enclosureLLs, { min: level, max: level }));
    # -> Set { '89c25894', '89c2589c' }
    
    // arbitrary vehicle lat longs
    
    const vehicle1 = new s2.CellId(new s2.LatLng(40.78340103809933,  -73.96515369415283)).parent(level);
    # -> '89c2589c'
    
    const vehicle2 = new s2.CellId(new s2.LatLng(40.782848623761375, -73.95506858825684)).parent(level);
    # -> '89c258a4'
    
    
    console.log(enclosureCells.has(vehicle1.token()));
    # -> true
    
    console.log(enclosureCells.has(vehicle2.token()));
    # -> false
    
    

    您可以使用 Sidewalk Lab 的 S2 地图工具将其形象化:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多