我和一个朋友正在尝试为使用谷歌地图的课程构建一个Android应用程序,我们已经花了好几天才出现这个错误。
理想情况下,应用会接收用户位置的更新,存储它们并绘制任何存储的坐标。事实证明这是一个噩梦,所以现在我们只是试图在整个图块上绘制,如果该图块包含用户访问过的坐标。然而,我们认为从坐标到平铺位置的转换有问题,因为缩放越高,我们绘制的图块越向北移动,从实际坐标向西移动。
private boolean isCoordInTileForZoom(int tileX, int tileY, int zoom)
{
//coordinate to check if they are in the current tile
float lon = WILF_TEST_COOR.x;
float lat = WILF_TEST_COOR.y;
//coordinates in terms of map length and map height
float mapX = lon + 180;
float mapY = (lat * -1) + 150;
//number of tiles in a row or column (2^zoom)
int tiles = (int) Math.pow(2,zoom);
//the height and width of a single tile
double tileWidth = 360.0/tiles;
double tileHeight = 180.0/tiles;
int mapCol = (int) (mapX/tileWidth);
int mapRow = (int) (mapY/tileHeight);
Log.d("Minimap.mapGridDetails"," \n" + "Zoom level: " + zoom + "\nMap Rows: " + tiles + "\nTile Width: " + tileWidth + "\nTile Height: " + tileHeight);
if (mapCol == tileX && mapRow == tileY)
{
return true;
}
else
{
return false;
}
}
现在我们假设世界是360度高度和180度高,这意味着,在缩放级别2,每个图块应该是90x45(4x4网格)。它适用于变焦2,我认为3但是在变焦4和超出绘制的瓷砖跳过预期位置以北。
我的感觉是问题在于我们假设坐标转换是如何工作的(我们假设Google的世界地图是一个布置得很好的平面,这可能是我们特别天真)或者谷歌地图实际上比180度。无论哪种方式,这件事将在几天后到期,所以我们提前感谢您的任何建议。
答案 0 :(得分:0)
你见过这个:https://developers.google.com/maps/documentation/javascript/examples/map-coordinates? 虽然它的JavaScript,但它显示了正确坐标转换的原理。
您也可以查看我对此SO question的回答。我在那里提供的TileProjection类应该回答你的问题。你可以,例如使用它的方法getTileBounds来检查你的坐标是否在tile中,或者你可以使用latLngToPoint方法并检查该点的x和y是否都在0-TILE_SIZE范围内。