使用Python S2 / S2sphere库 - 在圆圈中找到特定级别的所有s2单元格(lat,long和radius)

时间:2017-06-20 09:57:27

标签: python geolocation

S2Region以及我应该如何使用从给定的lat,long和radius绘制的圆圈覆盖某个父级别(比如说9)的所有s2单元格。下面是一个使用python s2库获取矩形下所有单元格的示例。

region_rect = S2LatLngRect(
              S2LatLng.FromDegrees(-51.264871, -30.241701),
              S2LatLng.FromDegrees(-51.04618, -30.000003))
coverer = S2RegionCoverer()
coverer.set_min_level(8)
coverer.set_max_level(15)
coverer.set_max_cells(500)
covering = coverer.GetCovering(region_rect)

示例来源http://blog.christianperone.com/2015/08/googles-s2-geometry-on-the-sphere-cells-and-hilbert-curve/

我正在寻找像

这样的东西
region_circle = S2latLangCircle(lat,lang,radius)

我找到了用c ++ Using google s2 library - find all s2 cells of a certain level within the circle, given lat/lng and radius in miles/km实现的google s2库的这个问题的答案,但我需要在python中使用它。

由于

2 个答案:

答案 0 :(得分:1)

link的帮助下,我找到了python解决方案。

我正在使用python s2sphere库。

earthCircumferenceMeters = 1000 * 40075.017
def earthMetersToRadians(meters):
    return (2 * math.pi) * (float(meters) / 
    const.earthCircumferenceMeters)


def getCoveringRect(lat, lng, radius, parent_level):
    radius_radians = earthMetersToRadians(radius)
    latlng = LatLng.from_degrees(float(lat), 
             float(lng)).normalized().to_point()
    region = Cap.from_axis_height(latlng, 
    (radius_radians*radius_radians)/2)
    coverer = RegionCoverer()
    coverer.min_level = int(parent_level)
    coverer.max_level = int(parent_level)
    coverer.max_cells = const.MAX_S2_CELLS
    covering = coverer.get_covering(region)
    s2_rect = []
    for cell_id in covering:
    new_cell = Cell(cell_id)
    vertices = []
    for i in range(4):
        vertex = new_cell.get_vertex(i)
        latlng = LatLng.from_point(vertex)
        vertices.append((math.degrees(latlng.lat().radians),
                         math.degrees(latlng.lng().radians)))
    s2_rect.append(vertices)
    return s2_rect

getCoveringRect方法返回给定父级别的所有s2单元格(矩形边界),该级别由从给定纬度绘制的圆覆盖,长度为中心和给定半径

答案 1 :(得分:-1)

我不确定 Guarav 使用的公式是否正确。

首先,函数 earthMetersToRadians 不返回弧度,它只是计算 (2*pi*r) / (2*pi*R) = r/R,其中 R 表示地球的半径。 从中,它计算 height = (r/R)^2/2,我不确定这个公式来自哪里。

根据球冠的公式,我们有 height = 1 - cos(theta) 其中 theta = arcsin(r/R) 在我们的例子中。 一起有 height = 1 - cos(arcsin(r/R)) 可以计算为 height = 1 - sqrt(1 - (r/R)^2)

但是请注意,这两个公式非常接近,因此在实际情况下它们几乎相同,特别是如果您之后在上限上运行 S2Coverer。