osmdroid的使用

Author Avatar
W-quan 9月 05, 2016
  • 在其它设备中阅读本文章

osmdroid是一个用与替代Android原生MapView的开源地图组件。 它支持多种在线/离线地图,如 OpenStreetMap等。详情见osmdroid wiki

基本使用

Gradle 导入

添加下面的依赖到build.gradle

1
2
3
dependencies {
compile 'org.osmdroid:osmdroid-android:5.1@aar'
}

AndroidMainFest.xml添加权限

1
2
3
4
5
6
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_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.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

布局文件中添加MapView组件

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<org.osmdroid.views.MapView android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>

代码中引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;

public class MainActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//important! set your user agent to prevent getting banned from the osm servers
org.osmdroid.tileprovider.constants.OpenStreetMapTileProviderConstants.setUserAgentValue(BuildConfig.APPLICATION_ID);

MapView map = (MapView) findViewById(R.id.map);
map.setTileSource(TileSourceFactory.MAPNIK);
}
}

到这里,你的程序应该能看到一个地图了。这个地图有一个让人不爽的地方,就是如果地图缩放级别太小的话,你会看到许多重复的世界地图。我们可以通过现在它的最小缩放级别来解决:

1
map.setMinZoomLevel(5);

添加我的位置图层

1
2
3
this.mLocationOverlay = new MyLocationNewOverlay(context, new GpsMyLocationProvider(context),mMapView);
this.mLocationOverlay.enableMyLocation();
mMapView.getOverlays().add(this.mLocationOverlay);

这样地图就会显示一个小黄人的图标在你的位置上了。而且还会随着你位置的改变而改变位置。

高级用法

离线地图的使用

  1. 使用MOBAC地图下载工具下载离线地图,保存为zip格式

MOBAC默认最大下载线程是6个。以及限制了最大下载瓦片数(图片)。可以下载其源码,找到相应的类,修改数值,然后单独编译那个类。替换MOBAC的jar包里的相应类即可。下载线程数增加可以提高下载速度,但是不要太大,不然程序会报内存溢出的错误。由于法律的限制,在新版的MOBAC里移除了google等地图的支持,但是可以通过xml配置添加支持。见其文档。

  1. 把下载好的地图放至手机储存的osmdroid目录下的tiles目录

  2. 代码设置地图为离线模式,并指定地图源的名字

1
2
3
map.setTileSource(new XYTileSource("YOUR MAP SOURCE", 0, 18, 256, ".jpg", new String[] {}));
//....
map.setUseDataConnection(false); //optional, but a good way to prevent loading from the network and test your zip loading.

使用OSMBonusPack

OSMBonusPack是osmdroid的第三方附加库。它为osmdroid添加了许多功能支持。

Marker

Marker可以在地图上添加一个标记点。使用:

1
2
3
4
Marker startMarker = new Marker(map);
startMarker.setPosition(startPoint);
startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
map.getOverlays().add(startMarker);

Polyline

Polyline可以在地图上显示线段,你需要提供一个点的数组。使用:

1
2
3
4
5
6
ArrayList<GeoPoint> mPoints = new ArrayList<>();
mPoints.add(new GeoPoint(lat, lng));
...
mPolyline.setPoints(mPoints);
mMapView.getOverlays().add(mPolyline);
mMapView.invalidate();

其他

OSMBonusPack还有很多功能,比如多边形、导航等。详情请看官网

总结

osmdroid是一款很不错的开源地图工具,它的功能强大。此文只是简单介绍了它的使用,如果要深入了解,请访问其github地址