Boy*_*Boy 18 android google-maps
我有一个问题,我正在尝试为其构建自定义解决方案.我很挣扎,也许我能够让它发挥作用,但也许已经有了另一个解决方案.
我的客户有一个后端来获取磁贴,但它只会在缩放级别8之前.之后,不会显示任何磁贴.
为了制作更多细节瓷砖,我过去使用过/sf/answers/2568740401/.从较高的缩放级别获取4个图块并将其构造为1.
但是现在,我必须从较低的缩放级别获取磁贴,并且需要将其炸毁.我一直试图以上述为基础,但尚未成功.如果有人知道不同的方法,我会非常感激.
或者,也许可以让谷歌地图保持缩放而不需要超过一定水平的新图层?我的意思是,它在缩放级别之间已经做到了
Boy*_*Boy 16
以该解决方案(通过组合4瓦更高的缩放级别为1)由@RadekJ增强瓷砖的分辨率这里作为参考,我就开始工作了相反的:以更低的缩放级别,在4个部分,并用砍碎它可以从中构建更高的缩放级别.
假设您获得的最大缩放级别为8,但您希望能够通过炸毁这些切片将其缩小到9,10等.
每次放大时,瓷砖除以2.因此,以缩放级别9为例,我从缩放级别8中取出瓷砖并将其切割成4个.然后我确定了在9级请求的磁贴所需的"象限".
接下来,我使用递归来获得更高级别的缩放级别.我对结果非常满意.
设置DRAW_DEBUG_DATA
为true
如果您想要查看其中的图块x
,y
并将其zoom level
绘制在其中.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
708 次 |
最近记录: |