OSMdroid - 无法从自定义位置加载脱机地图图块

时间:2016-08-03 10:12:09

标签: android offline osmdroid

我环顾四周,无法找到答案,我希望这是一件非常简单的事情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并因为没有在线图块而成为barfs。

感谢任何建议! 感谢。

2 个答案:

答案 0 :(得分:3)

所以我最终通过使用设备上的OSMDroid默认位置

对其进行了排序
/sdcard/osmdroid/uuid/tiles

并像这样设置磁贴源

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

osmdroid在目录uuid中查找名为“tiles”的子目录,虽然文档类型告诉你这个,它不是很明确。我想你可以使用这种方法在SD卡上使用任何位置,我只是决定使用最简单的解决方案。

答案 1 :(得分:2)

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

  1. 解压缩MOBAC生成的.zip文件,并仅重新压缩包含磁贴缩放级子目录的目录(例如,标记为&#34; 10&#34;,&#34; 11&#34;的目录,等)
  2. 将新zip放入osmdroid目录。不在osmdroid\tiles\
  3. 在您的代码中,引用您用于生成图集的来源的特定TileSourceFactory子类型。这对我有用(当使用OpenStreetMap公共传输层时):map.setTileSource(TileSourceFactory.PUBLIC_TRANSPORT);
  4. 这可以与检查一起使用以查看设备是否具有数据连接:

    // 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/