OSMdroid - 无法从自定义位置加载离线地图图块
OSMdroid - unable to load offline map tiles from custom location
我环顾四周,找不到我希望很简单就能实现的答案 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。
非常感谢收到任何建议!
谢谢。
所以我最终通过使用设备上的 OSMDroid 默认位置解决了这个问题
/sdcard/osmdroid/uuid/tiles
并像这样设置图块源
ITileSource tileSource = new XYTileSource(uuid, 0, 17, 256, ".png", new String[0]);
osmdroid 在目录 uuid 中查找名为 'tiles' 的子目录,尽管文档告诉您这一点,但不是很明确。我认为您可以使用这种方法使用 SD 卡上的任何位置,我只是决定使用最简单的解决方案。
我在尝试使用 MOBAC-generated .zip 文件时在没有默认 "uuid" 文件夹(8" Samsung Tab 4)的设备上遇到了这个问题。我在以下位置找到了解决方案下面的 link,但要点是这样的:
- 解压缩 MOBAC-generated .zip 文件,re-zip 只解压包含平铺 zoom-level 子目录的目录(例如,标有“10”、“11”等的目录)。 )
- 将新的 zip 文件放入
osmdroid
目录。不在 osmdroid\tiles\
.
- 在您的代码中,引用特定的
TileSourceFactory
sub-type 作为您用于生成图集的来源。这对我有用(当使用 OpenStreetMap public 传输层时):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);
}
这是 link:
https://mobiledevstories.wordpress.com/2014/02/27/osmdroid-mobile-atlas-creator-tutorial/
我环顾四周,找不到我希望很简单就能实现的答案 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。
非常感谢收到任何建议! 谢谢。
所以我最终通过使用设备上的 OSMDroid 默认位置解决了这个问题
/sdcard/osmdroid/uuid/tiles
并像这样设置图块源
ITileSource tileSource = new XYTileSource(uuid, 0, 17, 256, ".png", new String[0]);
osmdroid 在目录 uuid 中查找名为 'tiles' 的子目录,尽管文档告诉您这一点,但不是很明确。我认为您可以使用这种方法使用 SD 卡上的任何位置,我只是决定使用最简单的解决方案。
我在尝试使用 MOBAC-generated .zip 文件时在没有默认 "uuid" 文件夹(8" Samsung Tab 4)的设备上遇到了这个问题。我在以下位置找到了解决方案下面的 link,但要点是这样的:
- 解压缩 MOBAC-generated .zip 文件,re-zip 只解压包含平铺 zoom-level 子目录的目录(例如,标有“10”、“11”等的目录)。 )
- 将新的 zip 文件放入
osmdroid
目录。不在osmdroid\tiles\
. - 在您的代码中,引用特定的
TileSourceFactory
sub-type 作为您用于生成图集的来源。这对我有用(当使用 OpenStreetMap public 传输层时):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);
}
这是 link:
https://mobiledevstories.wordpress.com/2014/02/27/osmdroid-mobile-atlas-creator-tutorial/