【问题标题】:URL of an asset file for TileOverlayTileOverlay 资源文件的 URL
【发布时间】:2018-05-14 15:35:40
【问题描述】:

我正在使用适用于 Android 的 Google Maps API 开发 TileOverlay。感谢这篇文章 (here),我从 png 图像生成了切片,并将它们放置在 Android 资产文件夹中的“切片”文件夹 (assets/tiles/myTiles.png) 下。我不想在线上传 png 瓷砖,我希望我的应用程序在没有互联网的情况下工作。我的瓷砖是根据这种模式命名的: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 字符串,返回的字符串指向一个 现有文件。
  • 我还尝试将我的 url 替换为众所周知的磁贴服务 (http://b.tile.openstreetmap.org/" + zoom + "/" + x + "/" + y + ".png),这一次出现了 TileOverlay。

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

但我找不到如何从资产文件创建 URL。 我该怎么做?

【问题讨论】:

  • 实现 TileProvider 并使用 AssetManager 获取 InputStream 以读取字节数据,如下所述:stackoverflow.com/questions/4820816/…
  • 感谢它有效!我是新来的,我应该发布我的解决方案吗?
  • 恭喜 - 解决方案很好,所以发布!

标签: android url google-maps-android-api-2 android-assets


【解决方案1】:

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

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));

就我而言,我将图块放在资产上的“图块”文件夹中。请务必更改它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多