gpt4 book ai didi

android - Google Maps API Android - 瓷砖提供商的瓷砖分辨率

转载 作者:行者123 更新时间:2023-11-29 00:17:56 25 4
gpt4 key购买 nike

我在我的 Android 应用程序中使用自定义 TileProvider 来显示离线 map 和 OpenStreetMap map 。它可以工作,但是图 block 分辨率存在问题,这是非常糟糕的。这些文件的大小为 256x256,将我的 TileProvider 的宽度/高度设置为 128 不会改变任何内容。

这是一段代码:

public class GenericUrlTileProvider extends UrlTileProvider {

// ---------------------------------------------------------------------------------------
// Private attributes :

private String _baseUrl;
// ---------------------------------------------------------------------------------------



// ---------------------------------------------------------------------------------------
// Constructor :
public GenericUrlTileProvider(int width, int height, String url) {

super(width, height);

this._baseUrl = url;
}

@Override
public URL getTileUrl(int x, int y, int zoom) {

try {
return new URL(_baseUrl.replace("{z}", "" + zoom).replace("{x}", "" + x).replace("{y}", "" + y));
}
catch (MalformedURLException e) { e.printStackTrace(); }

return null;
}
// ---------------------------------------------------------------------------------------
}

有谁知道如何解决这个问题以支持高分辨率设备?

谢谢

最佳答案

根据@grub 的要求,这是我为获得下一个缩放级别的 4 个图 block 所做的:

public Tile getTileFromNextZoomLevel(int x, int y, int zoom) {

final String topLeftTileUrl = _source.getUrlSchema().replace("{z}", "" + (zoom + 1)).replace("{x}", "" + (x * 2)).replace("{y}", "" + (y * 2));
final String topRightTileUrl = _source.getUrlSchema().replace("{z}", "" + (zoom + 1)).replace("{x}", "" + (x * 2 + 1)).replace("{y}", "" + (y * 2));
final String bottomLeftTileUrl = _source.getUrlSchema().replace("{z}", "" + (zoom + 1)).replace("{x}", "" + (x * 2)).replace("{y}", "" + (y * 2 + 1));
final String bottomRightTileUrl = _source.getUrlSchema().replace("{z}", "" + (zoom + 1)).replace("{x}", "" + (x * 2 + 1)).replace("{y}", "" + (y * 2 + 1));

final Bitmap[] tiles = new Bitmap[4];

Thread t1 = new Thread() {

@Override
public void run() { tiles[0] = Utils.getBitmapFromURL(topLeftTileUrl); }
};
t1.start();

Thread t2 = new Thread() {

@Override
public void run() { tiles[1] = Utils.getBitmapFromURL(topRightTileUrl); }
};
t2.start();

Thread t3 = new Thread() {

@Override
public void run() { tiles[2] = Utils.getBitmapFromURL(bottomLeftTileUrl); }
};
t3.start();

Thread t4 = new Thread() {

@Override
public void run() { tiles[3] = Utils.getBitmapFromURL(bottomRightTileUrl); }
};
t4.start();

try {
t1.join();
t2.join();
t3.join();
t4.join();
}
catch (InterruptedException e) { e.printStackTrace(); }

byte[] tile = Utils.mergeBitmaps(tiles, Bitmap.CompressFormat.JPEG); // PNG is a lot slower, use it only if you really need to

return tile == null ? TileProvider.NO_TILE : new Tile( (int) _source.getTileSize().getWidth(), (int) _source.getTileSize().getHeight(), tile);
}

还有 Utils 方法:

public static byte[] mergeBitmaps(Bitmap[] parts, Bitmap.CompressFormat format) {

// Check if all the bitmap are null (if so return null) :
boolean allNulls = true;
for (int i = 0; i < parts.length; i++) {

if(parts[i] != null) {

allNulls = false;
break;
}
}
if(allNulls) return null;

Bitmap tileBitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(tileBitmap);
Paint paint = new Paint();
for (int i = 0; i < parts.length; i++) {

if(parts[i] == null) {

parts[i] = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
}
canvas.drawBitmap(parts[i], parts[i].getWidth() * (i % 2), parts[i].getHeight() * (i / 2), paint);
}

ByteArrayOutputStream stream = new ByteArrayOutputStream();
tileBitmap.compress(format, 100, stream);
byte[] bytes = stream.toByteArray();

return bytes;
}

public static Bitmap getBitmapFromURL(String urlString) {

try {

// Ensure the file exists :
if(Utils.getResponseCode(urlString) != 200) return null;

URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
Bitmap bitmap = BitmapFactory.decodeStream(connection.getInputStream());

return bitmap;
}
catch (IOException e) { return null; }
}

您可能需要根据自己的需要对其进行调整。请注意,我的应用程序仍在开发中,此代码可能需要一些测试/改进。

关于android - Google Maps API Android - 瓷砖提供商的瓷砖分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com