OSMdroid开发
获取OSM数据
-
可以通过该网站下载世界各地的OpenStreetMap地图矢量数据,可以下载pbf,shapefile,geojson格式的数据。缺点:只能选择国家范围的数据,无法精确到一个省或市。
比如:从这个页面下载中国的地图,选择bz2格式,使用7-zip解压,可以得到一个osm文件,也就是xml文件。
-
openstreetmap.org 网站本身提供地图数据的下载服务(范围不能过大),点击地图上端的“输出”,然后选择范围和输出格式即可,下载格式为osm格式。如果范围太大可以选择从下方的镜像站下载。
-
全球范围的数据https://planet.openstreetmap.org/
Osmdroid的使用
在线OSM街道地图的加载
-
添加依赖
在module级别的build.gradle中的dependencies中添加
implementation 'org.osmdroid:osmdroid-android:6.1.0'
-
权限配置
打开AndroidManifest.xml文件,在application的外面添加如下的代码
<!--添加访问权限--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
MainActivity
在其中添加如下的代码:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取布局文件中的mapView MapView mMapView = (MapView) findViewById(R.id.mapView); //获取地图控制器 IMapController mcontroller = mMapView.getController(); //设置在线地图源为MAPNIK(OSM街道) mMapView.setTileSource(TileSourceFactory.MAPNIK); //设置多指触控可用 mMapView.setMultiTouchControls(true); //设置缩放按钮可见 mMapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.ALWAYS); //设置缩放界别 mcontroller.setZoom(15); //添加比例尺 ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(mMapView); mMapView.getOverlays().add(mScaleBarOverlay); //地图可旋转 RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(this, mMapView); mRotationGestureOverlay.setEnabled(true); mMapView.getOverlays().add(mRotationGestureOverlay); //设置地图中心 GeoPoint geopoint = new GeoPoint(30.4653, 114.4281); MapController mMapController= (MapController) mMapView.getController();//获取MapView控制器 mMapController.setCenter(geopoint);//设置地图中心 } }
启动后Osmdroid可能会出现
android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database ‘/storage/emulated/0/osmdroid/tiles/cache.db’: Directory /storage/emulated/0/osmdroid/tiles doesn’t exist报错,无法打开数据库
需要在onCreate中添加如下代码
//获取访问数据库的权限
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Context ctx = getApplicationContext();
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));