【问题标题】:Download maps for osmdroid下载 osmdroid 的地图
【发布时间】:2014-05-16 18:02:11
【问题描述】:

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

要下载我尝试过的地图:

对我来说,理想的情况是从应用程序本身下载地图,我只想下载您在赛道上的地图,而不是完整的部分。

我该如何解决?

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

【问题讨论】:

    标签: android osmdroid


    【解决方案1】:

    MobileAtlasCreator / MOBAC 的工作解决方案:

    有一个osmdroid documentation,但它很弱,有时已经过时了。

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

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

    • 由于 Mapnik 地图被有效锁定,因此选择“OpenStreetMap MapQuest”作为来源。
    • Atlas 格式:选择“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”扩展名)。

    在这个阶段,应该没问题 - 只要您真正将地图视图定位在属于您的地图集的区域(缩放级别和位置)。

    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”就可以了。

    【讨论】:

    • MKer 感谢您的回复。但我有一个问题。如果我输入map.setUseDataConnection(true),它不会下载地图。如果地图不存在,我该如何下载?
    • 问题是 MapQuest zip 文件需要设置 .jpg 扩展名,但不适用于 openstreetmap.org 在线图块(即 .png 文件)。所以我们还必须将 MapQuest 用于在线图块。我编辑代码来改变它。
    • 很好的解释。你有任何代码可以让离线磁贴源工作吗?以上代码仅适用于在线!
    • 上面的代码专用于离线瓦片:map.setUseDataConnection(false) 在这里确保不检索在线瓦片。它应该工作。如果没有,请详细描述您的用例/上下文。
    • 是的,我是认真的。不信任的可以阅读osmdroid源码,osmdroid加载策略的概述可以在这里找到:code.google.com/p/osmdroid/wiki/ModularTileProviderArchitecture
    【解决方案2】:

    关于问题中提出的第二种首选方法: "有什么方法可以通过我的应用从手机下载地图吗?"

    => 现在的答案是:是的!

    从 OSMBonusPack v4.6 开始,有一个 CacheManager 类,允许直接从 Android 应用程序下载(矩形)区域的图块。切片加载在标准 osmdroid 切片缓存中。

    可以使用OSMNavigator 进行测试。

    【讨论】:

    • 非常感谢@MKer 我已经用类CacheManager实现了下载和删除地图
    【解决方案3】:

    首先感谢 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 创建地图后

    【讨论】:

    • 也感谢您指出这些 int val 是 minzoom/maxzoom/tilesize! +1
    • API 最近发生了变化,对 ResourceProxy 的引用被删除了。
    【解决方案4】:

    今天只有 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/"}));
        }
    

    我更喜欢把一些网址具体化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多