s2sphere Cell ID到Corner Vertices

问题描述 投票:0回答:1

我有一个来自OSMCoverer的S2 Level 17 Cell ID的列表,格式为487a73cc7c,我需要得到每个的角点。我在Reddit here上找到了一个使用Python s2sphere库的用户脚本,我相信我可以使用它,但是它没有输出正确的co-ords,它们应该在52.80xxxx,-2.xxxxx范围内。

我认为这与第5行的换档操作有关,但我不知道如何纠正它。

import s2sphere
from s2sphere import CellId, LatLng, Cell

def get_corners(s2CellId_str, level):
    c1 = Cell(CellId(int(s2CellId_str,16)<<(60 - 2*level)))

    print(c1)

    c0 = LatLng.from_point(c1.get_center())  # center lat/lon of s2 cell
    v0 = LatLng.from_point(c1.get_vertex(0)) # lat/lon of upper/left corner
    v1 = LatLng.from_point(c1.get_vertex(1)) # lat/lon of lower/left corner
    v2 = LatLng.from_point(c1.get_vertex(2)) # lat/lon of lower/right corner
    v3 = LatLng.from_point(c1.get_vertex(3)) # lat/lon of upper/right corner
    print('    // s2 level ' + str(level) + ' cell id = ' + s2CellId_str)
    print('Center  = ' + str(c0))
    print('Vertex0 = ' + str(v0))
    print('Vertex1 = ' + str(v1))
    print('Vertex2 = ' + str(v2))
    print('Vertex3 = ' + str(v3))

get_corners("487a73cc7c", 17)

提前致谢。

python geolocation
1个回答
0
投票

感谢Reddit的一位有用的用户,他指出我所拥有的不是CellID,而是被称为令牌,这已经解决了。

CellID具有from_token功能,可以这样使用。

import s2sphere
from s2sphere import CellId, LatLng, Cell

def get_corners(s2CellId_str, level):
    c1 = Cell(CellId.from_token(s2CellId_str))

    print(c1)

    c0 = LatLng.from_point(c1.get_center())  # center lat/lon of s2 cell
    v0 = LatLng.from_point(c1.get_vertex(0)) # lat/lon of upper/left corner
    v1 = LatLng.from_point(c1.get_vertex(1)) # lat/lon of lower/left corner
    v2 = LatLng.from_point(c1.get_vertex(2)) # lat/lon of lower/right corner
    v3 = LatLng.from_point(c1.get_vertex(3)) # lat/lon of upper/right corner
    print('    // s2 level ' + str(level) + ' cell id = ' + s2CellId_str)
    print('Center  = ' + str(c0))
    print('Vertex0 = ' + str(v0))
    print('Vertex1 = ' + str(v1))
    print('Vertex2 = ' + str(v2))
    print('Vertex3 = ' + str(v3))

get_corners("487a73cc7c", 17)

文档:http://s2sphere.readthedocs.io/en/latest/api.html#s2sphere.CellId.from_token

作为一个稍微不同的解决方案,如果你有lat / long值,你可以这样做:

import s2sphere
lat = 52.809766
lng = -2.088996
cell_id = s2sphere.CellId.from_lat_lng(s2sphere.LatLng.from_degrees(lat,lng)).parent(12)
print (s2sphere.LatLng.from_point(s2sphere.Cell(cell_id).get_center()))
print (s2sphere.LatLng.from_point(s2sphere.Cell(cell_id).get_vertex(0)))
print (s2sphere.LatLng.from_point(s2sphere.Cell(cell_id).get_vertex(1)))
print (s2sphere.LatLng.from_point(s2sphere.Cell(cell_id).get_vertex(2)))
print (s2sphere.LatLng.from_point(s2sphere.Cell(cell_id).get_vertex(3)))
© www.soinside.com 2019 - 2024. All rights reserved.