使用OSMDroid在线存储的MBTiles

时间:2015-10-19 07:52:04

标签: java android osmdroid mbtiles

我已经在我的项目中导入了OSMDroid,并且使用默认的OpenStreetMap运行时非常正常。我想使用MBTiles格式的地图而不是OSM。有很多关于将MBTiles用作离线地图的教程,但我的MBTiles文件存储在一个在线存储中,如

http://www.example.com/mymbtiles.mbtiles

我在MainActivity.java中使用以下代码,这是OSMDroid默认教程的xerox

package com.example.user.osmdroid;

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

import org.osmdroid.api.IMapController;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.tileprovider.tilesource.XYTileSource;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;

public class MainActivity extends Activity {
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView map = (MapView) findViewById(R.id.map);
        map.setTileSource(TileSourceFactory.MAPNIK);
        map.setBuiltInZoomControls(true);
        map.setMultiTouchControls(true);
        IMapController mapController = map.getController();
        mapController.setZoom(9);
        GeoPoint startPoint = new GeoPoint(23.7588, 90.38967);
        mapController.setCenter(startPoint);
    }
}

如何在我的OSMDroid项目中使用该在线存储的MBTiles文件?

1 个答案:

答案 0 :(得分:1)

您不能直接使用它。 MBTiles基本上是一个sqlite数据库。 OSMDroid可以从设备的存储中读取和使用它,但不能通过网络读取和使用它。要解决这个问题,您必须将数据库传输到设备,然后告诉OSMDroid通过tile源和tile提供程序将mbtiles文件用于它。

编辑:考虑到数据库的大小,最简单的方法是托管一个简单的Web服务,从数据库(服务器端)获取切片,然后通过自定义ITileSource将它们提供给用户。我实际上有服务等代码,但它还没有发布。 “标准”osm方式是http://server/port:path/Z/X/Y.png,但只要在android设备上安装了ITileSource,你就可以制作任何你想要的格式。另外,您可能希望看到此示例https://github.com/osmdroid/osmdroid/blob/master/OpenStreetMapViewer/src/main/java/org/osmdroid/samplefragments/SampleCustomTileSource.java注意,我们正在扩展OnlineTileSourceBase