下载 osmdroid 的地图

7

我正在开发一个应用程序,需要离线使用地图。我正在使用osmdroid和osmbonuspack。

为了下载地图,我已经尝试过:

对我来说,理想的情况是从应用程序本身下载地图,而且我只想下载沿着路径所在的地图,而不是完整的区域。

我该如何解决这个问题?

是否有办法通过我的应用程序从手机上下载地图?

4个回答

23

使用MobileAtlasCreator / MOBAC的解决方案:

虽然有osmdroid文档,但很薄弱,有时也过时了。

我曾在连续问题上挣扎了一段时间。下面是使用osmdroid v4.1的工作解决方案的详细信息:

1) 在使用MOBAC构建离线地图时:

  • 由于Mapnik地图实际上被锁定,请选择“OpenStreetMap MapQuest”作为源。
  • 图集格式:选择“Osmdroid ZIP”
  • 务必选中您需要的所有缩放级别。默认情况下,没有选择任何缩放级别。

选择您的区域,创建您的“图集”。这将生成一个zip文件。

将zip文件上传到设备上,放置在/sdcard/osmdroid/目录下(确切路径可能因设备而异。如果您已经使用过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);
}

在这段代码中,有两个参数非常重要:
必须使用“MapQuest”名称(拼写必须完全一致)=> 这将用作zip文件内部路径。如果您打开zip文件,您会看到MOBAC创建了此“MapQuest”目录。
“.jpg”扩展名也是强制性的 => 因为MOBAC在zip中创建了具有.jpg扩展名的MapQuest瓦片(重要的是要注意,因为osmdroid中的标准瓷砖源都使用“.png”扩展名)。
在这个阶段,只要您真正将mapview定位在图集的一部分(缩放级别和位置),就应该没问题。
回到MOBAC... 您还可以选择以下Atlas格式:“Osmdroid SQLite”或“MBTiles SQLite”。将文件(Layer.sqlite或Layer.mbtiles)传输到设备的/sdcard/osmdroid/中
同样,在您的XYTileSource构造函数中,扩展名必须是“.jpg”。名称无关紧要。
两者都运行良好。

4) 选择“Osmdroid GEMF”格式不起作用:这是GEMF中处理jpg瓦片的已知错误。编辑> 在MOBAC中,您可以使用“自定义瓷砖处理”功能将JPG瓦片转换为PNG格式。然后,“Osmdroid GEMF”将正常工作。


MKer,感谢您的回复。但我有一个问题。 如果我放置map.setUseDataConnection(true),它不会下载地图。如果地图不存在,我该怎么办才能下载地图? - user3292741
问题在于设置 .jpg 扩展名是 MapQuest 压缩文件所必需的,但不适用于 openstreetmap.org 的在线瓦片(它们是 .png 文件)。因此,我们还必须使用 MapQuest 来获取在线瓦片。我编辑了代码以更改这一点。 - MKer
上面的代码专门用于离线瓦片:map.setUseDataConnection(false)用于确保不会检索在线瓦片。它应该可以正常工作。如果不能,请提供更多详细的用例/上下文描述。 - MKer
你是认真的吗?http://otile1.mqcdn.com/tiles/1.0.0/map/ 这是一个网络调用,需要互联网。我没有看到任何用于从内部/外部存储读取地图的代码? - Muhammad Babar
1
是的,我很认真。如果你不相信我,可以阅读osmdroid源代码,osmdroid加载策略的概述可以在这里找到:https://code.google.com/p/osmdroid/wiki/ModularTileProviderArchitecture - MKer
显示剩余3条评论

5
关于问题中提到的第二种 - 首选 - 方法: "有没有办法通过我的应用程序从手机下载地图?"
答案是:现在可以了!从OSMBonusPack v4.6开始,有一个CacheManager类,可以直接从Android应用程序下载(矩形)区域的图块。图块被加载到标准的osmdroid图块缓存中。可以使用OSMNavigator进行测试。

非常感谢@MKer我已经使用CacheManager类实现了地图的下载和删除。 - user3292741

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));

使用移动地图创建器创建地图后


谢谢你指出这些int值是minzoom/maxzoom/tilesize!+1 - 1111161171159459134
API最近发生了变化,对ResourceProxy的引用被删除了。 - spy

0

今天只有OSM地图瓷砖打包器适用于地图瓷砖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/"}));
    }

我更喜欢放一些具体的URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接