如何在谷歌地图中获取缩放级别25的平铺值(x和y)?

时间:2015-06-22 07:38:28

标签: android google-maps

我正在开发一个应用程序,它在缩放级别25上加载一些自定义图块,但谷歌地图缩放级别限制为21.如何获得缩放级别25的图块值(无论谷歌地图图块是否可用)缩放级别)?

1 个答案:

答案 0 :(得分:0)

瓷砖的X和Y值只是您所在世界位置的索引。 在此页面中,您可以看到关于切片方案如何工作的非常好的解释: http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ 在页面的末尾有一些代码可以帮助您计算tile的边界或索引(It's python)。 GoogleMaps图块仅限于lev 21,但如果禁用Google地图图块(将地图类型设置为GoogleMap.TYPE_NONE),您应该可以进一步缩放。 下面的代码显示了如何使用x,y和z来获取切片坐标(使用wms服务),如果你知道边界和缩放以获得x和y,它应该很容易:

protected double[] getBoundingBox(int x, int y, int zoom) {
    double tileSize = MAP_SIZE / Math.pow(2, zoom);
    double minx = TILE_ORIGIN[ORIG_X] + x * tileSize;
    double maxx = TILE_ORIGIN[ORIG_X] + (x + 1) * tileSize;
    double miny = TILE_ORIGIN[ORIG_Y] - (y + 1) * tileSize;
    double maxy = TILE_ORIGIN[ORIG_Y] - y * tileSize;

    double[] bbox = new double[4];
    bbox[MINX] = minx;
    bbox[MINY] = miny;
    bbox[MAXX] = maxx;
    bbox[MAXY] = maxy;

    return bbox;
}

此外,如果你有一个特定的点(如你的视图的中心),以米坐标,你可以得到相应的瓦片给出缩放:

private TileDataInfo getTileByCoordinate(double xmeters, double ymeters, int zoomLevel) {
    final double tileDim = MAP_SIZE / Math.pow(2d, zoomLevel);

    final int tileX = (int) ((pointX - TILES_ORIGIN[0]) / tileDim);
    final int tileY = (int) ((TILES_ORIGIN[1] - pointY) / tileDim);

    return new TileDataInfo(tileX, tileY, zoomLevel);
}

其中:

private static final double[] TILES_ORIGIN = {-20037508.34789244, 20037508.34789244};
    // Size of square world map in meters, using WebMerc projection.
    private static final double MAP_SIZE = 20037508.34789244 * 2;
   private static final double ORIGIN_SHIFT = Math.PI * 6378137d;

从LatLng数据获取坐标的米:

/**
     * Transform the lat in meters
     *
     * @param latitude the latitude of map
     * @return meters of y coordinate
     */
    private double inMetersYCoordinate(double latitude) {
        if (latitude < 0) {
            return -inMetersYCoordinate(-latitude);
        }
        return (Math.log(Math.tan((90d + latitude) * Math.PI / 360d)) / (Math.PI / 180d)) * ORIGIN_SHIFT / 180d;
    }

    /**
     * Transform the lng in meters
     *
     * @param longitude the longitude of map
     * @return meters of x coordinate
     */
    private double inMetersXCoordinate(double longitude) {
        return longitude * ORIGIN_SHIFT / 180.0;
    }

希望有所帮助!