我如何在Android上使用MapBox

时间:2013-06-10 16:22:06

标签: android map mapbox

如何在Android上显示MapBox图块?我尝试将它与OSMDroid一起使用,而Nutiteq则没有成功。是否有MapBox的安卓库?

例如,我使用此代码在OSMDroid上实现MapBox:http://blog.spatialnetworks.com/post/2012/07/using-mbtiles-on-android-with-osmdroid

XYTileSource MBTILESRENDER = new XYTileSource("mbtiles", ResourceProxy.string.offline_mode, 1, 20, 256, ".png", "http://example.org/");
DefaultResourceProxyImpl mResourceProxy = new DefaultResourceProxyImpl(this.getApplicationContext());
SimpleRegisterReceiver simpleReceiver = new SimpleRegisterReceiver(this.getActivity());

File f = new File(Environment.getExternalStorageDirectory(), "mymbtilesfile.mbtiles");

IArchiveFile[] files = { MBTilesFileArchive.getDatabaseFileArchive(f) };

MapTileModuleProviderBase moduleProvider = new MapTileFileArchiveProvider(simpleReceiver, MBTILESRENDER, files);

MapTileProviderArray mProvider = new MapTileProviderArray(MBTILESRENDER, null, new     MapTileModuleProviderBase[] { moduleProvider });

this.mMapView = new MapView(this, 256, mResourceProxy, mProvider);

但它没有用,我想直接从网上加载MbTiles。

5 个答案:

答案 0 :(得分:16)

修改

Official Mapbox Android SDK is released.

Also, see Mapbox's answer.

对于那些投票的人,我在sdk存在之前回答了这个问题。

=============================================

我认为Nutiteq看起来很有希望。他们的API有很多功能。此外,他们的演示项目也是内联评论。你可以看看this project。特别是,MBTilesMapActivity可能是您正在寻找的东西。该课程展示了如何使用mbtiles:

// 1. Get the MapView from the Layout xml
mapView = (MapView) findViewById(R.id.mapView);
// 2. create and set MapView components
Components components = new Components();
mapView.setComponents(components);
// 3. Define map layer for basemap
MBTilesMapLayer dbLayer = new MBTilesMapLayer(new EPSG3857(), 0, 19, file.hashCode(), file, this);
mapView.getLayers().setBaseLayer(dbLayer);
...
// 4. Start the map - mandatory
mapView.startMapping();        
// 5. zoom buttons using Android widgets - optional
// get the zoomcontrols that was defined in main.xml
ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols);

您还可以查看从其演示中修改的my toy project。基本上,我的应用程序允许用户输入mbtiles文件的URL。然后,它下载文件并将其加载到MapView。

如果您真的必须坚持使用OSMDroid,this可能会有所帮助。我没有机会尝试它。

希望这有帮助。

答案 1 :(得分:7)

  

是否有MapBox的安卓库?

在Android上使用Mapbox的最佳方式是Mapbox Android SDK!它是官方代码库,一个支持矢量切片,地图动画和其他一系列的开源项目 - 它也可以很容易地从系统默认地图过渡到。

回复:

  

但它没有用,我想直接从网上加载MbTiles。

由于MBTiles文件是一组通常非常大的磁贴 - 并且无法单独请求 - 因此您通常不会直接加载它以显示地图。 SDK采用的方法是dynamic caching, as shown in this example。该示例使用Mapbox,但缓存机制是通用的,可以与任何磁贴服务器一起使用。

披露:我为Mapbox工作,偶尔会处理我们的本机代码的核心,包括Android SDK。

答案 2 :(得分:4)

您是否知道使用Google Maps API v2,您可以使用自己的磁贴提供程序?

请参阅TileProviderUrlTileProvider

答案 3 :(得分:4)

Mapbox团队已经开始在Android上发布Mapbox地图,因此我想推荐它,只是为了尝试。我认为很高兴知道他们已经听过Android开发人员的祈祷。

Mapbox for Android on Github

答案 4 :(得分:3)

OSMDroid是非常详细的文档,但是如果你看一下可实现的方法,它们设计它的方式使它非常灵活和自我解释。以下是截至2015年1月使用OSMDroid的Mapbox切片的方法。

    mvMap = (MapView) rootView.findViewById(R.id.mapview);

    String mapCode = "mapbox.streets";
    final String accessToken = "myAccessToken";

    OnlineTileSourceBase customTileSource = new XYTileSource("MapBoxSatelliteLabelled",
            ResourceProxy.string.mapquest_aerial, 1, 19, 256, ".png", new String[]{
            "http://a.tiles.mapbox.com/v4/" + mapCode + "/",
            "http://b.tiles.mapbox.com/v4/" + mapCode + "/",
            "http://c.tiles.mapbox.com/v4/" + mapCode + "/",
            "http://d.tiles.mapbox.com/v4/" + mapCode + "/"}){

        @Override
        public String getTileURLString(MapTile aTile) {
            String str = super.getTileURLString(aTile) + "?access_token=" + accessToken;
            return str;
        }
    };

    TileSourceFactory.addTileSource(customTileSource);

    mvMap.setTileSource(customTileSource);

快速提示:如果您使用的是Android Studio,请使用断点来获取任何变量的值。这有助于调试和理解不熟悉的代码。这就是我弄清楚getTileURLString()返回磁贴的完整URL的方式。