s2sphere 单元 ID 到角顶点
s2sphere Cell ID to Corner Vertices
我从 OSMCoverer 获得了格式为 487a73cc7c
的 S2 17 级单元 ID 列表,我需要获取每个单元的角点。我在 Reddit here 上找到了一个用户使用 Python s2sphere 库编写的脚本,我相信我可以使用它,但它没有输出正确的坐标,它们应该在 52.80xxxx 左右,- 2.xxxxx范围。
我认为这与第 5 行的 shift 操作有关,但我还不够了解以更正它。
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)
提前致谢。
感谢 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)))
我从 OSMCoverer 获得了格式为 487a73cc7c
的 S2 17 级单元 ID 列表,我需要获取每个单元的角点。我在 Reddit here 上找到了一个用户使用 Python s2sphere 库编写的脚本,我相信我可以使用它,但它没有输出正确的坐标,它们应该在 52.80xxxx 左右,- 2.xxxxx范围。
我认为这与第 5 行的 shift 操作有关,但我还不够了解以更正它。
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)
提前致谢。
感谢 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)))