Android MBTiles映射在OSMDroid中不起作用
我正在尝试制作一个依赖离线地图的应用程序。Openstreet地图成了我的选择,因为OSMDroid似乎被大量使用。但是,当我尝试使用离线地图(使用Mobile Atlas creator生成的MBTiles)时,“MapView”类不会在我的设备上显示任何地图。下面是一个片段中的片段。我也没有看到logcat抛出任何错误Android MBTiles映射在OSMDroid中不起作用,android,maps,offline,osmdroid,mbtiles,Android,Maps,Offline,Osmdroid,Mbtiles,我正在尝试制作一个依赖离线地图的应用程序。Openstreet地图成了我的选择,因为OSMDroid似乎被大量使用。但是,当我尝试使用离线地图(使用Mobile Atlas creator生成的MBTiles)时,“MapView”类不会在我的设备上显示任何地图。下面是一个片段中的片段。我也没有看到logcat抛出任何错误 public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
String [] url = {"http://example.org/"};
XYTileSource MBTILESRENDER = new XYTileSource("mbtiles",
ResourceProxy.string.offline_mode,
1, 20, 256,
".png",
url);
DefaultResourceProxyImpl mResourceProxy = new DefaultResourceProxyImpl(getActivity());
SimpleRegisterReceiver simpleReceiver = new SimpleRegisterReceiver(getActivity());
File f = new File(Environment.getExternalStorageDirectory(), "osmdroid/srMbTiles.mbtiles");
Log.e("File ", f.toString() + " PATH:" + f.getAbsolutePath());
if ( f.exists() ) {
Log.d("DEBUG", " #### FIle Exists");
}
IArchiveFile[] files = { MBTilesFileArchive.getDatabaseFileArchive(f) };
MapTileModuleProviderBase moduleProvider = new MapTileFileArchiveProvider(simpleReceiver, MBTILESRENDER, files);
MapTileProviderArray mProvider = new MapTileProviderArray(MBTILESRENDER, null, new MapTileModuleProviderBase[] { moduleProvider });
myOpenMapView = new MapView(getActivity(),
256,mResourceProxy, mProvider);
myOpenMapView.setBuiltInZoomControls(true);
myOpenMapView.setTileSource(MBTILESRENDER);
IMapController controller = (IMapController) myOpenMapView.getController();
controller.setZoom(12);
getActivity().setContentView(myOpenMapView);
}
任何帮助都将不胜感激。提前感谢我也有同样的错误,问题是指定的缩放级别不存在,也没有显示地图。尝试将缩放级别更改为类似“最大/最小缩放级别”的功能。而且我的实现与你的不同 我按照教程实现了脱机MBTiles贴图,在主要活动中,我对其进行了如下修改:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create the mapView with an MBTileProvider
DefaultResourceProxyImpl resProxy;
resProxy = new DefaultResourceProxyImpl(this.getApplicationContext());
String path = Environment.getExternalStorageDirectory() + "/LocalPath/";
File file = new File(path, "file.mbtiles");
MBTileProvider provider = new MBTileProvider(this, file);
mapView = new MapView(this,
resProxy,
provider);
mapView.setScrollableAreaLimit(provider.getBoundingBox());
mapView.zoomToBoundingBox(provider.getBoundingBox());
// Set the MapView as the root View for this Activity; done!
setContentView(mapView);
mapView.setBuiltInZoomControls(true);
MapController controller = (MapController) mapView.getController();
//desired zoom level (here we use maximum)
controller.setZoom(provider.getTileSource().getMaximumZoomLevel());
}
protected MBTileSource(int minZoom,
int maxZoom,
BoundingBoxE6 box,
int tileSizePixels,
File file,
SQLiteDatabase db) {
super("MBTiles", resourceId, minZoom, maxZoom, tileSizePixels, ".png");
this.bbox = box;
archive = file;
database = db;
}
public static MBTileSource createFromFile(File file) {
//original stuff
//added
// Get the MBTiles limits
Cursor box = db.rawQuery("SELECT value FROM metadata WHERE name='bounds' LIMIT 0,1",
new String[] {});
BoundingBoxE6 bbox = null;
if (box.moveToFirst())
{
String rawBox = box.getString(box.getColumnIndex("value"));
StringTokenizer tokens=new StringTokenizer(rawBox, ",");
double fourth = Double.parseDouble((String) tokens.nextElement());
double third = Double.parseDouble((String) tokens.nextElement());
double second = Double.parseDouble((String) tokens.nextElement());
double first = Double.parseDouble((String) tokens.nextElement());
bbox = new BoundingBoxE6(first,second,third,fourth);
}
box.close();
return new MBTileSource(minZoomLevel, maxZoomLevel, bbox, tileSize, file, db);
}
public BoundingBoxE6 getBoundingBox()
{
return this.bbox;
}
此外,您正在使用具有定义边界的地图,因此最好告诉地图附加到这些边界。这是按照以下说明完成的:
mapView.setScrollableAreaLimit(provider.getBoundingBox());
我通过以下方式修改MBTileSource.java实现了这一点:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create the mapView with an MBTileProvider
DefaultResourceProxyImpl resProxy;
resProxy = new DefaultResourceProxyImpl(this.getApplicationContext());
String path = Environment.getExternalStorageDirectory() + "/LocalPath/";
File file = new File(path, "file.mbtiles");
MBTileProvider provider = new MBTileProvider(this, file);
mapView = new MapView(this,
resProxy,
provider);
mapView.setScrollableAreaLimit(provider.getBoundingBox());
mapView.zoomToBoundingBox(provider.getBoundingBox());
// Set the MapView as the root View for this Activity; done!
setContentView(mapView);
mapView.setBuiltInZoomControls(true);
MapController controller = (MapController) mapView.getController();
//desired zoom level (here we use maximum)
controller.setZoom(provider.getTileSource().getMaximumZoomLevel());
}
protected MBTileSource(int minZoom,
int maxZoom,
BoundingBoxE6 box,
int tileSizePixels,
File file,
SQLiteDatabase db) {
super("MBTiles", resourceId, minZoom, maxZoom, tileSizePixels, ".png");
this.bbox = box;
archive = file;
database = db;
}
public static MBTileSource createFromFile(File file) {
//original stuff
//added
// Get the MBTiles limits
Cursor box = db.rawQuery("SELECT value FROM metadata WHERE name='bounds' LIMIT 0,1",
new String[] {});
BoundingBoxE6 bbox = null;
if (box.moveToFirst())
{
String rawBox = box.getString(box.getColumnIndex("value"));
StringTokenizer tokens=new StringTokenizer(rawBox, ",");
double fourth = Double.parseDouble((String) tokens.nextElement());
double third = Double.parseDouble((String) tokens.nextElement());
double second = Double.parseDouble((String) tokens.nextElement());
double first = Double.parseDouble((String) tokens.nextElement());
bbox = new BoundingBoxE6(first,second,third,fourth);
}
box.close();
return new MBTileSource(minZoomLevel, maxZoomLevel, bbox, tileSize, file, db);
}
public BoundingBoxE6 getBoundingBox()
{
return this.bbox;
}
非常感谢@Miguel我稍后会尝试一下,并根据你的建议更新它@Miguel我让它工作了