赞
踩
S2算法是将经纬度转换到单位球面上,然后转成直角坐标系,进而将球面映射到立方体不同的面上(这里叫做face),根据直角坐标计算坐标所在的立方体的面,以及对应的uv坐标,进而进行(线性映射或tan映射等)将uv转换为st,(待续)
接下来,逐步解析s2算法是如何进行这个过程的。
给定球面上的一个坐标,即经纬度(jd, wd),将其转换到单位球上的坐标,即将半径看做1,那么根据球坐标转立体坐标的关系,得到单位球上的直角坐标(python代码):
rjindu, rweidu = jindu*math.pi/180, weidu*math.pi/180 x,y,z = math.sin(math.pi/2-rweidu)*math.cos(rjindu), math.sin(math.pi/2-rweidu)*math.sin(rjindu), math.cos(math.pi/2-rweidu)
def __largestAbsComp(self, x, y, z):‘此处返回是哪一个轴是主轴 absX = math.fabs(x) absY = math.fabs(y) absZ = math.fabs(z) if absX>absY: if absX>absZ: return 0; else: return 2; else: if absY>absZ: return 1 else: return 2 def __xyzToFace(self, x, y, z): lac = self.__largestAbsComp(x,y,z)'根据 反馈的主轴,计算所在的面 if lac==0: if x<0: return 3 else: return 0 if lac==1: if y<0: return 4 else: return 1 if lac==2: if z<0: return 5 else: return 2
确定face以后,xyz2uv是按照face进行的,具体如下,
face | u | v |
0 | y/x | z/x |
1 | -x/y | z/y |
2 | -x/z | -y/z |
3 | z/x | y/x |
4 | z/y | -x/y |
5 | -y/z | -x/z |
至此,从经纬度
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。