前两天试着将离线地图导入了一个叫OSMand的APP里,发现还有 诸多的缺点,详见http://blog.csdn.net/u014712516/article/details/50480953
所以想着自己弄一个类似的东西出来,于是去官网上找:http://wiki.openstreetmap.org/wiki/Main_Page
发现要调用OSM的API需要这三个东东:
1.osmdroid-android-4.2.jar 下载链接:https://code.google.com/p/osmdroid/wiki/Downloads
2.slf4j-android-1.6.1-RC1.jar 下载链接:http://www.slf4j.org/android/
3.osmbonuspack_v5.1 下载链接:https://github.com/MKergall/osmbonuspack/releases(我用的是eclipse,所以选择了这个,用AS的大神可以选更新的)
前二者是实例化地图所必须的包,第三个是在你的地图上使用marker、POI、划线等等功能所需要的,现在干脆一次性把它也加进来。
废话不多说,直接上代码
main.xml
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<org.osmdroid.views.MapView
android:id="@+id/myOSMmapview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</org.osmdroid.views.MapView>
</RelativeLayout>
MainActivity.java
package com.tj.osmbeta1;
import org.osmdroid.bonuspack.overlays.Marker;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
private MapView osm;
private MapController mcontrol;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
osm = (MapView) findViewById(R.id.myOSMmapview);
osm.setTileSource(TileSourceFactory.CYCLEMAP);
osm.setBuiltInZoomControls(true);
osm.setMultiTouchControls(true);
mcontrol = (MapController) osm.getController();
mcontrol.setZoom(11);
GeoPoint center = new GeoPoint(39.94943,116.33507);
mcontrol.animateTo(center);
addMarker(center);
}
public void addMarker(GeoPoint center){
Marker marker = new Marker(osm);
marker.setPosition(center);
marker.setAnchor(Marker.ANCHOR_CENTER,Marker.ANCHOR_BOTTOM);
marker.setIcon(getResources().getDrawable(R.drawable.ic_launcher));
osm.getOverlays().clear();
osm.getOverlays().add(marker);
osm.invalidate();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(1, Menu.FIRST, 1, "退出");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
this.finish();
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
}
<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_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="com.android.vending.BILLING" />
能力有限,我不管有的没的都加上来了。
现在的时间也就到此为止,只是很初步的实现了地图的基本功能。如果想要离线加载地图,可以把.obf文件拷贝到手机SD卡中的osmdroid文件夹的更目录即可。至于怎么生成.obf文件,可以看这篇文章:http://blog.csdn.net/u014712516/article/details/50480953
问题;
1.我发现当我用Mapkin进行渲染的时候地图会出现加载不出来的情况,后来只好选择了CYCLEMAP
2.通过把.obf文件放到根目录的方法可以读出离线的中国地图,但是读不出我自己修改过的地图,而这个在OSMand里面是可以做到的,现在还没想明白怎么回事,难道要调用一些别的方法?
3.一开始地图显示的中心点并不是我想要的点,但是安卓小人站的位置确实是我定的位置,不知道是为什么。
最后把资源包上传一下http://download.csdn.net/download/u014712516/9398492
接下来打算把那个读取地图的问题解决了,顺便研究一下卫星定位的问题。
由于个人能力有限,难免有错误,请各位不吝批评指正~