TileOverlay的资产文件的URL

问题描述 投票:0回答:1

我正在使用Google Maps API for Android处理TileOverlay。多亏了这篇文章(here),我从png图像生成了图块,并将其放置在“ tiles”文件夹(assets/tiles/myTiles.png)下的Android资产文件夹中。我不想在线上传png磁贴,我希望我的应用可以在没有Internet的情况下运行。我的图块是根据以下模式命名的:x-y-zoom.png。这是我的onMapReady

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    TileProvider tileProvider = new UrlTileProvider(256, 256) {
        @Override
        public URL getTileUrl(int x, int y, int zoom) {
            String url = "file:///android_asset/tiles/" + x + "-" + y + "-" + zoom + ".png";
            try {
                return new URL(url);
            } catch (MalformedURLException e) {
                // ignore
            }
            return null;
        }
    };

    TileOverlay tileOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));
}

但是当我启动应用程序时,地图会出现,但TileOverlay不会。

我尝试并发现的内容:

  • 我尝试记录url字符串,返回的字符串指向一个现有文件。
  • [我还尝试用一个知名的切片服务(http://b.tile.openstreetmap.org/" + zoom + "/" + x + "/" + y + ".png)替换我的URL,这一次,出现TileOverlay。

所以我认为给定的URL不起作用。在其他论坛(like here)上,我了解到以file:///android_asset/开头的URL仅适用于AndroidWebView。

但是我无处发现如何从资产文件创建URL。我该怎么办?

android url google-maps-android-api-2 android-assets
1个回答
0
投票

[如果有人仍然需要它,我就像安迪所说的那样解决了这个问题:

mMap = googleMap;

TileProvider tileProvider = new TileProvider() {
        @Override
        public Tile getTile(int x, int y, int zoom) {
            try {
                InputStream inputStream = getAssets().open(String.format("tiles/%d_%d_%d.png", zoom, x, y));
                byte[] buffer = new byte[8192];
                int bytesRead;
                ByteArrayOutputStream output = new ByteArrayOutputStream();

                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    output.write(buffer, 0, bytesRead);
                }
                byte file[] = output.toByteArray();

                Tile result = new Tile(256, 256, file);

                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    };

TileOverlay tileOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));

就我而言,我是将磁贴放在资产的“平铺”文件夹中。确保更改它。

© www.soinside.com 2019 - 2024. All rights reserved.