我正在开发一个我需要离线使用地图的应用程序。我使用的是osmdroid和osmbonuspack
要下载我尝试过的地图:
对我而言,理想的情况是从应用程序本身下载地图,我只想下载您在轨道上的地图,而不是完整的部分。
我该如何解决?
有没有办法通过我的应用程序从手机下载地图?
答案 0 :(得分:20)
使用MobileAtlasCreator / MOBAC的工作解决方案:
有一个osmdroid documentation,但它很弱,有时过时了。
我在连续的问题上挣扎了一段时间。以下是osmdroid v4.1的工作解决方案的详细信息。
1)使用MOBAC构建离线地图时:
选择您的区域,创建“地图集”。这会生成一个zip文件。
在/ sdcard / osmdroid /上传设备上的zip文件 (确切路径可能因设备而异。如果您已经使用过osmdroid,则该目录必须已存在)
文件名无关紧要。扩展必须是“.zip”
2)现在,在你的osmdroid应用程序中,你的onCreate方法应该是这样的:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
map = (MapView) findViewById(R.id.map);
map.setTileSource(new XYTileSource("MapQuest",
ResourceProxy.string.mapquest_osm, 0, 18, 256, ".jpg", new String[] {
"http://otile1.mqcdn.com/tiles/1.0.0/map/",
"http://otile2.mqcdn.com/tiles/1.0.0/map/",
"http://otile3.mqcdn.com/tiles/1.0.0/map/",
"http://otile4.mqcdn.com/tiles/1.0.0/map/"}));
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
map.setUseDataConnection(false); //optional, but a good way to prevent loading from the network and test your zip loading.
IMapController mapController = map.getController();
mapController.setZoom(_A ZOOM LEVEL YOU HAVE IN YOUR ZIP_);
GeoPoint startPoint = new GeoPoint(_POSITION SOMEWHERE INSIDE YOUR MAP_);
mapController.setCenter(startPoint);
}
在此代码中,2个参数值非常重要:
“MapQuest”名称(使用此EXACT拼写)是MANDATORY =>这用作zip文件中的内部路径。如果您打开zip文件,您将看到MOBAC创建了这个“MapQuest”目录。
“。jpg”扩展名也是MANDATORY =>因为MOBAC在带有.jpg扩展名的zip中创建MapQuest磁贴(重要的是要注意,因为osmdroid中的标准磁贴源都使用“.png”扩展名)。
在这个阶段,它应该没问题 - 只要您真正将地图视图定位在地图集的一部分区域(缩放级别和位置)。
3)返回MOBAC ...您还可以选择以下Atlas格式:“Osmdroid SQLite”或“MBTiles SQLite”。 在/ sdcard / osmdroid /
中传输设备上的文件(Layer.sqlite或Layer.mbtiles)同样,在你的XYTileSource构造函数中,扩展名必须是“.jpg”。这个名字并不重要。
两者都运作良好。
4)选择“Osmdroid GEMF”格式不起作用:在GEMF中处理jpg图块是known bug。 编辑>在MOBAC中,您可以使用“自定义图块处理”功能将JPG图块转换为PNG格式。那么“Osmdroid GEMF”就可以了。
答案 1 :(得分:5)
关于第二个 - 首选 - 在问题中提出的方法: "有没有办法通过我的应用程序从手机下载地图?"
=>现在回答:是的!
从OSMBonusPack v4.6开始,有一个CacheManager类,允许直接从Android应用程序下载(矩形)区域的切片。 Tiles加载到标准的osmdroid tile缓存中。
可以使用OSMNavigator进行测试。
答案 2 :(得分:4)
首先感谢MKer和来自另一篇文章的Tom Kincaid,将两者放在一起。以下适用于我:
这就是我需要做的与MKer不同的事情:
String[] urls = {"http://127.0.0.1"};
mapView.setTileSource(new XYTileSource("MapQuest", // name of the main file that has been zipped
ResourceProxy.string.mapquest_osm,
2, // min map zoom level
14, // max map zoom level
256, // tile size pixels
".jpg", // extension of the tiles (can be ".png" as well)
urls));
使用Mobile Atlas Creator创建地图后
答案 3 :(得分:0)
今天只有OSM Map Tile Packager适用于地图图块mapnik,它在PNG中做地图,所以
if(ConexaoInternet.verificaConexao(getActivity())) { //<-- here i am Checking if has conection with internet
mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
}else{
String[] urls = {"http://127.0.0.1"};
mapView.setTileSource(new XYTileSource("Mapnik", // name of the main file that has been zipped
ResourceProxy.string.mapquest_osm,
9, // min map zoom level
15, // max map zoom level
256, // tile size pixels
".png",
new String[]{"http://a.tile.openstreetmap.org/", "http://b.tile.openstreetmap.org/", "http://c.tile.openstreetmap.org/"}));
}
我更喜欢把一些网址混凝土。