【问题标题】:OSMdroid - unable to load offline map tiles from custom locationOSMdroid - 无法从自定义位置加载离线地图图块
【发布时间】:2016-08-03 10:12:08
【问题描述】:

我环顾四周,找不到答案,我希望这是一件很简单的事情来实现this 问题似乎相似但没有回复!所以问题是这样的;我在 android 设备上有我的离线地图图块:

/sdcard/application-name/uuid/tiles

我已经像这样设置了 OSM 缓存:

File applicationDir = new File(Environment.getExternalStorageDirectory(), File.separator + "application-name" + File.separator + "uuid" + File.separator);
OpenStreetMapTileProviderConstants.setCachePath(applicationDir.getAbsolutePath());

然后我设置 TileSource:

ITileSource tileSource = new XYTileSource ("tiles", 0, 18, 256, ".png", new String[]{});

和 TileProvider:

tileProvider = new MapTileProviderBasic(getActivity());
tileProvider.setTileSource(tileSource);

当我运行我的应用程序时,我会得到一连串的这些:

Error downloading MapTile: /15/16000/9960
java.lang.IllegalArgumentException: n <= 0: 0
at java.util.Random.nextInt(Random.java:175)
at org.osmdroid.tileprovider.tilesource.OnlineTileSourceBase.getBaseUrl(OnlineTileSourceBase.java:33)
at org.osmdroid.tileprovider.tilesource.XYTileSource.getTileURLString(XYTileSource.java:19)
at org.osmdroid.tileprovider.modules.MapTileDownloader$TileLoader.loadTile(MapTileDownloader.java:171)
at org.osmdroid.tileprovider.modules.MapTileModuleProviderBase$TileLoader.run(MapTileModuleProviderBase.java:291)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

大概是因为没有找到本地图块,而 MapTileProviderBasic 最终落入 MapTileDownloader 并且因为没有在线图块而失败。

任何建议都非常感谢! 谢谢。

【问题讨论】:

  • 你有没有试过自己写路径看看会发生什么?
  • 我认为路径不是问题,当我对其进行硬编码时,它仍然失败。我认为问题出在 Source 或 Provider 上。
  • 如果我看到任何东西,我会在几个小时后回复你,我必须与我的代码进行比较,因为我觉得我的代码与你的没有太大区别。
  • 谢谢@M.Haché,你看过你的代码了吗?
  • 尝试在您的 tilesource 上设置示例 URL。而不是ITileSource tileSource = new XYTileSource ("tiles", 0, 18, 256, ".png", new String[]{}); 尝试ITileSource tileSource = new XYTileSource ("tiles", 0, 18, 256, ".png", new String[]{"http://i.dont.care.org/"});

标签: android offline osmdroid


【解决方案1】:

所以我最终通过使用设备上的 OSMDroid 默认位置解决了这个问题

/sdcard/osmdroid/uuid/tiles

并像这样设置图块源

ITileSource tileSource = new XYTileSource(uuid, 0, 17, 256, ".png", new String[0]);

osmdroid 在目录 uuid 中查找名为 'tiles' 的子目录,虽然文档告诉你这一点,但它不是很明确。我认为您可以使用这种方法使用 sdcard 上的任何位置,我只是决定使用最简单的解决方案。

【讨论】:

  • 如果您的设备中没有 SD 卡会怎样?
【解决方案2】:

在尝试使用 MOBAC 生成的 .zip 文件时,我在没有默认“uuid”文件夹(8“Samsung Tab 4)的设备上遇到了这个问题。我在下面的链接中找到了解决方案,但是要点是:

  1. 解压 MOBAC 生成的 .zip 文件,并仅重新压缩包含平铺缩放级别子目录的目录(例如,标记为“10”、“11”等的目录)
  2. 将新的 zip 文件放在 osmdroid 目录中。不在osmdroid\tiles\
  3. 在您的代码中,引用用于生成图集的源的特定TileSourceFactory 子类型。这对我有用(使用 OpenStreetMap 公共交通层时):map.setTileSource(TileSourceFactory.PUBLIC_TRANSPORT);

这可以与检查设备是否有数据连接一起使用:

// Check for data connection and use offline map if necessary
    if (Main.deviceIsOnline()) {
        map.setTileSource(TileSourceFactory.MAPNIK);
        //map.setTileSource(TileSourceFactory.USGS_SAT);
        //map.setTileSource(TileSourceFactory.USGS_TOPO);
    } else {
        map.setTileSource(TileSourceFactory.PUBLIC_TRANSPORT);
    }

这里是链接:

https://mobiledevstories.wordpress.com/2014/02/27/osmdroid-mobile-atlas-creator-tutorial/

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2016-10-11
    • 2011-12-31
    • 2011-11-29
    相关资源
    最近更新 更多