>我正在尝试加载放置在安卓工作室/assets文件夹中的.map文件。.map 文件是从 mapsforge 下载的 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
map = (MapView) findViewById(R.id.map);
map.setBuiltInZoomControls(true);
map.setTileSource(TileSourceFactory.MAPNIK);
IMapController controller = map.getController();
GeoPoint point = new GeoPoint(41.2585, 69.2097);
controller.animateTo(point);
controller.setZoom(10);
File f = new File("file:///android_asset/" + "myfile.map");
if (f.exists()) {
File[] list = f.listFiles();
if (list != null) {
for (int i = 0; i < list.length; i++) {
if (list[i].isDirectory()) {
continue;
}
String name = list[i].getName().toLowerCase();
if (!name.contains(".")) {
continue; //skip files without an extension
}
name = name.substring(name.lastIndexOf(".") + 1);
if (name.length() == 0) {
continue;
}
if (ArchiveFileFactory.isFileExtensionRegistered(name)) {
try {
OfflineTileProvider tileProvider = new OfflineTileProvider(new SimpleRegisterReceiver(this),
new File[]{list[i]});
map.setTileProvider(tileProvider);
String source = "";
IArchiveFile[] archives = tileProvider.getArchives();
if (archives.length > 0) {
Set<String> tileSources = archives[0].getTileSources();
if (!tileSources.isEmpty()) {
source = tileSources.iterator().next();
map.setTileSource(FileBasedTileSource.getSource(source));
} else map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
} else map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
map.invalidate();
return;
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
Toast.makeText(this, f.getAbsolutePath() + " did not have any files I can open! Try using MOBAC", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, f.getAbsolutePath() + " dir not found!", Toast.LENGTH_SHORT).show();
}
}
未找到错误"myfileDirectory"。
自从我写了你发布的代码以来,我想我正在插话。
- 您发布的代码实际上是用于加载 osmdroid 支持的默认磁贴提供程序链(sqlite、mbtile、zip 等)的离线磁贴数据库集合。Mapsforge不在该列表中,因为它是一个特殊情况。
- 要使用地图伪造提供的带有osmdroid的瓷砖,您可能应该遵循此示例 https://github.com/osmdroid/osmdroid/blob/master/OpenStreetMapViewer/src/main/java/org/osmdroid/samplefragments/tileproviders/MapsforgeTileProviderSample.java 我相信您会在那里找到各种其他有用的示例。 将
- 地图文件或任何其他数据库捆绑在 assets 文件夹中(尽管可以这样做)在 osmdroid 中加载此图块是不可能的,除非在资产中存储原始 jpg/png。因此,如果捆绑资产是您选择的路径,您需要将数据库复制到设备存储,然后告诉 osmdroid 加载它。我不确定为什么,但这可能与权限有关。
为了节省一些时间,这里有相关的代码片段,其中 bymaps
是一个File[]
。
XmlRenderTheme theme = null;
try {
theme = new AssetsRenderTheme(getContext().getApplicationContext(), "renderthemes/", "rendertheme-v4.xml");
} catch (Exception ex) {
ex.printStackTrace();
}
fromFiles = MapsForgeTileSource.createFromFiles(maps, theme, "rendertheme-v4");
forge = new MapsForgeTileProvider(
new SimpleRegisterReceiver(getContext()),
fromFiles, null);
mMapView.setTileProvider(forge);
回答我自己的问题, *.map 文件需要放在/SDCARD/osmdroid/下
致谢 http://programtalk.com/java-api-usage-examples/org.osmdroid.mapsforge.MapsForgeTileProvider/
里面 创建 ...
mMap = (MapView) findViewById(R.id.map);
Set<File> mapfiles = findMapFiles();
File[] maps = new File[mapfiles.size()];
maps = mapfiles.toArray(maps);
if (maps.length==0)Log.d(TAG, "No Mapsforge files found");
else Toast.makeText(this, "Loaded " + maps.length + " map files",
Toast.LENGTH_LONG).show();
XmlRenderTheme theme = null;
try {
theme = new AssetsRenderTheme(getApplicationContext(),
"renderthemes/","rendertheme-v4.xml");
}catch (Exception ex){
ex.printStackTrace();
}
MapsForgeTileProvider forge = new MapsForgeTileProvider(new
SimpleRegisterReceiver(this), MapsForgeTileSource.createFromFiles(maps,
theme, "rendertheme-v4"), null);
mMap.setTileProvider(forge);
mMap.setUseDataConnection(false);
mMap.setMultiTouchControls(true);
mMap.setBuiltInZoomControls(true);
获取 .map 文件的方法
protected static Set<File> findMapFiles() { Set<File> maps = new HashSet<>(); List<StorageUtils.StorageInfo> storageList = StorageUtils.getStorageList(); for (int i = 0; i < storageList.size(); i++) { File f = new File(storageList.get(i).path + File.separator + "osmdroid" + File.separator); if (f.exists()) { maps.addAll(scan(f)); } } return maps; } static private Collection<? extends File> scan(File f) { List<File> ret = new ArrayList<>(); File[] files = f.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if (pathname.getName().toLowerCase().endsWith(".map")) return true; return false; } }); if (files != null) { for (int i = 0; i < files.length; i++) { ret.add(files[i]); } } return ret;
}
如果OfflineTileProvider
无法从InputStream
读取,但需要将File
对象发送到.map文件,那么您应该首先关注真实文件。
因此,请先将所有"文件"从资产复制到文件系统上的文件。
之后,您可以使用这些文件。
将文件从资产复制到文件存储的代码已在此处发布一百次。