android - Google Maps API Android - 图 block 提供商的图 block 分辨率

标签 android google-maps resolution tile

我在 Android 应用程序中使用自定义 TileProviders 来显示离线 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 - 图 block 提供商的图 block 分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218792/

相关文章:

javascript - Google map 在 WordPress 中损坏

javascript - 具有 PNG 后备功能的 Google map SVG 标记

Android - Google Play 过滤掉 xxhdpi

browser - 推荐的网站分辨率(宽度和高度)?

android - 元素的定位 - 不在同一行

android - 从字符串数组填充 ListView

java - 安卓屏幕截图

java - 将日期限制设置为 CalendarDatePickerDialogFragment android

android - 一个 Activity 在不同安卓版本上的奇怪行为 : map blinks

r - 如何提高 R 中绘图的分辨率?