osmdroid 加载离线地图资源包。我这只用了zip的。其他格式没试。
storage/emulated/0/osmdroid/hefeiosm.zip
主要逻辑是,拷贝 hefeiosm.zip 离线资源到根目录下 osmdroid/ 文件夹中。
注意:hefeiosm.zip里面为 hefeiosm 文件夹hefeiosm里面是0-17的数字文件夹这个是ZoomLevel。
osmdroid/hefeiosm.zip-》hefeiosm--》0-17的数字--》一窜数字文件夹--》 图片
另外如果加载失败的话,检查下图片路径和加载的图片路径是不是一致的。
debug 查看 BitmapTileSourceBase 类的 getTileRelativeFilenameString 方法返回的值。下面链接给的zip就是加载路劲不对的。可以改 BitmapTileSourceBase getTileRelativeFilenameString 返回值 MapTileIndex.getY 和 MapTileIndex.getX 的值换下位置
osmdroid github地址:https://github.com/osmdroid/osmdroid
hefeiosm.zip
链接:https://pan.baidu.com/s/1pAytTyaz94S4IbebPArVNA
提取码:yr7o
下面是具体代码。
package com.example.android.osmdroidofflinedemo;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import org.osmdroid.api.IMapController;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.IRegisterReceiver;
import org.osmdroid.tileprovider.modules.OfflineTileProvider;
import org.osmdroid.tileprovider.tilesource.FileBasedTileSource;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.tileprovider.util.SimpleRegisterReceiver;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ScaleBarOverlay;
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
MapView mMapView;
private MyLocationNewOverlay mLocationOverlay;
private GpsMyLocationProvider gpsMyLocationProvider;
private IMapController mController;
private ScaleBarOverlay mScaleBarOverlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.mapview);
Configuration.getInstance().setUserAgentValue(BuildConfig.APPLICATION_ID);
//built in zoom controls
mMapView.setBuiltInZoomControls(true);
//needed for pinch zooms
mMapView.setMultiTouchControls(true);
//scales tiles to the current screen's DPI, helps with readability of labels
mMapView.setTilesScaledToDpi(true);
mapViewOtherData(mMapView);
mMapView.setMaxZoomLevel(16.0);
// mMapView.setMinZoomLevel(10.0);
//我的位置
gpsMyLocationProvider = new GpsMyLocationProvider(this);
mLocationOverlay = new MyLocationNewOverlay(gpsMyLocationProvider, mMapView);
mLocationOverlay.enableMyLocation();
//定位的图标和方向旋转
// mLocationOverlay.setDirectionArrow(((BitmapDrawable) getBaseContext().getResources().getDrawable(R.mipmap.ic_choose_location)).getBitmap(),
// ((BitmapDrawable) getBaseContext().getResources().getDrawable(R.drawable.ic_menu_mylocation)).getBitmap());
// mMapView.getOverlays().add(this.mLocationOverlay);
//map scale
mScaleBarOverlay = new ScaleBarOverlay(mMapView);
mScaleBarOverlay.setCentred(true);
//设置比例尺显示的位置
// mScaleBarOverlay.setScaleBarOffset(ScreenUtils.getScreenWidth(mActivity) / 2, ScreenUtils.getScreenHeight(mActivity) - 50);
// mMapView.getOverlays().add(this.mScaleBarOverlay);
//经纬度网格显示
// LatLonGridlineOverlay2 grids = new LatLonGridlineOverlay2();
// grids.setBackgroundColor(Color.BLACK);
// grids.setFontColor(Color.RED);
// grids.setLineColor(Color.RED);
// grids.setFontSizeDp((short) 14);
// mMapView.getOverlayManager().add(grids);
mController = mMapView.getController();
mController.setZoom(14.0);
mController.setCenter(new GeoPoint(31.82655, 117.166575));
//指南针显示
// CompassOverlay mCompassOverlay = new CompassOverlay(context, new InternalCompassOrientationProvider(context),
// mMapView);
// mCompassOverlay.enableCompass();
// mMapView.getOverlays().add(mCompassOverlay);
}
/**
* ————————————————
* 版权声明:本文为CSDN博主「mmsx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* 参考链接:https://blog.csdn.net/qq_16064871/article/details/54024687
*/
public void mapViewOtherData(MapView mapView) {
mapView.setUseDataConnection(false);
String strFilepath = Environment.getExternalStorageDirectory().getPath() + "/osmdroid/hefeiosm.zip";// storage/emulated/0/osmdroid/hefeiosm.zip
File exitFile = new File(strFilepath);
if (!exitFile.exists()) {//文件不存在,用默认网络的
mapView.setTileSource(TileSourceFactory.MAPNIK);
} else {//文件存在
try {
OfflineTileProvider tileProvider = new OfflineTileProvider((IRegisterReceiver) new SimpleRegisterReceiver(this), new File[]{exitFile});
mapView.setTileProvider(tileProvider);
String source = "hefeiosm";//注意 hefeiosm 为 /osmdroid/hefeiosm.zip 文件内的 第一级文件夹名
mapView.setTileSource(FileBasedTileSource.getSource(source));
mapView.invalidate();
Log.e("hefeiosm",strFilepath+" = "+source);
return;
} catch (Exception ex) {
ex.printStackTrace();
}
Toast.makeText(this, " did not have any files I can open! Try using MOBAC", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}