我正在使用这两个函数将latlng转换为tile坐标。我无法理解的是,如果在缩放级别1有4个tile。这些坐标属于哪些瓷砖?或者这些属于左上角?
public int langtoTileX(Double lng,int zoom)
{
double x;
x = Math.round((256*(Math.pow(2,zoom-1)))+(lng*((256*(Math.pow(2,zoom)))/360)));
return ((int)(x/256));
}
public int lattoTileY(Double lat,int zoom)
{
Double exp = Math.sin(lat*Math.PI/180);
if (exp < -.9999)
exp = -.9999;
if (exp > .9999)
exp = .9999 ;
return (int) (Math.round (256*(Math.pow(2,zoom-1)))+((.5*Math.log((1+exp)/(1-exp)))*((-256*(Math.pow(2,zoom)))/(2*Math.PI))))/256;
}
此示例中使用了相同类型的公式:
https://developers.google.com/maps/documentation/javascript/examples/map-coordinates
答案 0 :(得分:4)
最有可能是左上方的瓷砖。当您想要细分地图时,使用四叉树会很有用,因此在缩放级别1有4个图块。查找bing maps四键解决方案:http://msdn.microsoft.com/en-us/library/bb259689.aspx。但Google地图使用x,y对作为切片:How can I get Tile Count, Tile X, Tile Y details without specifying zoom Level (or LevelOfDetails)?。在缩放级别0,缩放级别1有1个图块,您可以看到4个图块和两侧的一些图块等.pp。链接:http://facstaff.unca.edu/mcmcclur/GoogleMaps/Projections/GoogleCoords.html,http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection。
更新:要从x获得边界框,y对使用像x,x + 1,y,y + 1这样的矩形: TileProvider method getTile - need to translate x and y to lat/long。但您也可以在Bing和Google地图之间进行转换。将quadkey值替换如下:0 = q,1 = r,2 = t,3 = s(?),也可能0 = q,1 = r,2 = s,3 = t(?)并将其附加到网址http://kh.google.com/kh?v=3&;t=quadkey。来源:http://dzone.com/snippets/converting-between-2-google。
Update2:网址http://kh.google.com已经死亡,但您仍然可以使用该代码段:
def quadtree(x,y, zoom):
out = []
m = {(0,0):'q', (0,1):'t', (1,0):'r', (1,1):'s'}
for i in range(17-zoom):
x, rx = divmod(x, 2)
y, ry = divmod(y, 2)
out.insert(0, m[(rx,ry)])
return 't' + ''.join(out)
def xyzoom(quad):
x, y, z = 0, 0, 17
m = {'q':(0,0), 't':(0,1), 'r':(1,0), 's':(1,1)}
for c in quad[1:]:
x = x*2 + m[c][0]
y = y*2 + m[c][1]
z -= 1
return x, y, z
在地图中,曲线从右上角到右下角到左下角到左上角。因此它看起来像一个倒U形?也许我错了,它是左上角,右上角,左下角,右下角?然后它是Z形。然后lat,lng对位于左上方的区块?
为了获得边界框,我假设在几秒内给出long和lat。
首先,您需要以秒为单位计算矩形的宽度。赤道上的一秒是30.9米,对于其他纬度,乘以cos(纬度),所以要将其转换为秒,您可以执行以下操作:
double widthSeconds = meters / (30.9 * cos(lat));
其次,知道方框的中心,可以很容易地计算出角落的坐标: