“overzoom”tileoverlay谷歌地图

我有一个问题,我目前正在试图build立一个自定义的解决scheme。 我正在努力,也许我能够得到它的工作,但也许已经有另一个解决scheme。

我的客户有一个用于获取拼贴图的后端,但是只有在缩放级别为8级之后才会显示拼贴。

为了制作更多细节贴图,我以前使用过https://stackoverflow.com/a/36696291/969016 。 它从一个较高的缩放级别需要4个瓷砖,并将其构build为1。

但是现在,我必须从较低的缩放级别拍摄拼贴,并且需要将其炸开。 我一直试图把上面的一个作为基础,但还没有成功。 如果有人知道一个不同的方法,我会很感激。

或者,也许有可能让Google地图保持缩放而不需要超过特定级别的新图层? 我的意思是,它在zoomlevels之间已经这样做了

Solutions Collecting From Web of "“overzoom”tileoverlay谷歌地图"

以@RadekJ作为参考,以解决scheme来提高拼贴的分辨率(通过组合4个更高缩放级别的拼贴为1),我开始研究相反的问题:以较低的缩放级别将其分割成四部分,然后使用它从它构build一个更高的缩放级别。

假设您获得的最大缩放级别为8,但是您希望能够通过炸毁这些图块来缩小至9,10等。

每次放大,瓦片被2除。所以以9级缩放比例为例,我从缩放级别8中把瓦片切成4块。 然后,我确定了9级所要求的瓷砖需要哪个“象限”。

接下来,我使用recursion来获取更高级别的缩放级别。 我对结果很满意。

如果要查看其中绘制了xyzoom level的图块,请将DRAW_DEBUG_DATA设置为true

 import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import com.google.android.gms.maps.model.Tile; import com.google.android.gms.maps.model.TileProvider; import java.io.ByteArrayOutputStream; public class OverZoomTileProvider implements TileProvider { public static final int MAX_ZOOM = 8; private static final boolean DRAW_DEBUG_DATA = false; private static final int TILE_SIZE = 256; private static final int HALF_TILE_SIZE = TILE_SIZE / 2; private Paint tilePainter = new Paint(); // these will only be used when DRAW_DEBUG_DATA is true private Paint debugRectPaint; private Paint debugTextPaint; private TileProvider mTileProvider; public OverZoomTileProvider(TileProvider tileProvider) { mTileProvider = tileProvider; if (DRAW_DEBUG_DATA) { debugRectPaint = new Paint(); debugRectPaint.setColor(Color.RED); debugRectPaint.setStrokeWidth(1); debugRectPaint.setStyle(Paint.Style.STROKE); debugTextPaint = new Paint(); debugTextPaint.setColor(Color.WHITE); debugTextPaint.setStyle(Paint.Style.FILL); debugTextPaint.setColor(Color.BLACK); debugTextPaint.setTextSize(20); } } @Override public Tile getTile(int x, int y, int zoom) { Bitmap image = Bitmap.createBitmap(TILE_SIZE, TILE_SIZE, Bitmap.Config.ARGB_8888); image.eraseColor(Color.TRANSPARENT); Canvas canvas = new Canvas(image); drawTile(canvas, zoom, x, y); byte[] data = bitmapToByteArray(image); image.recycle(); return new Tile(TILE_SIZE, TILE_SIZE, data); } private void drawTile(Canvas canvas, int zoom, int x, int y) { Bitmap bitmap = getTileAsBitmap(x, y, zoom); if (bitmap != null) { canvas.drawBitmap(bitmap, 0, 0, tilePainter); bitmap.recycle(); } if (DRAW_DEBUG_DATA) { canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), debugRectPaint); canvas.drawText("" + x + ", " + x + " (" + zoom + ")", 128, 128, debugTextPaint); } } private Bitmap getTileAsBitmap(int x, int y, int zoom) { if (zoom <= MAX_ZOOM) { Tile tile = mTileProvider.getTile(x, y, zoom); if (tile == NO_TILE) { return null; } return BitmapFactory.decodeByteArray(tile.data, 0, tile.data.length); } boolean leftColumn = x % 2 == 0; boolean topRow = y % 2 == 0; Bitmap bitmap = getTileAsBitmap(x / 2, y / 2, zoom - 1); int quadrant; if (leftColumn && topRow) { quadrant = 1; } else if (!leftColumn && topRow) { quadrant = 2; } else if (leftColumn) { quadrant = 3; } else { quadrant = 4; } switch (quadrant) { case 1: bitmap = Bitmap.createBitmap(bitmap, 0, 0, HALF_TILE_SIZE, HALF_TILE_SIZE); break; case 2: bitmap = Bitmap.createBitmap(bitmap, HALF_TILE_SIZE, 0, HALF_TILE_SIZE, HALF_TILE_SIZE); break; case 3: bitmap = Bitmap.createBitmap(bitmap, 0, HALF_TILE_SIZE, HALF_TILE_SIZE, HALF_TILE_SIZE); break; case 4: bitmap = Bitmap.createBitmap(bitmap, HALF_TILE_SIZE, HALF_TILE_SIZE, HALF_TILE_SIZE, HALF_TILE_SIZE); break; } return Bitmap.createScaledBitmap(bitmap, TILE_SIZE, TILE_SIZE, false); } private static byte[] bitmapToByteArray(Bitmap bm) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, bos); byte[] data = bos.toByteArray(); try { bos.close(); } catch (Exception e) { e.printStackTrace(); } return data; } }