關於OpenStreetMap的介紹,國內還是很少,csdn上面有一篇,寫的不錯,我也就不再做重複的事情了。
這裡貼出連結地址:http://blog.csdn.net/mad1989/article/details/9733985
下面,開始介紹一下osmbonuspack導航。
注意,如果要做商業應用,請先仔細閱讀許可文檔,以免發生不必要的麻煩。
#0,首先,先去mapquest上面註冊一個開發人員帳號!
強烈推薦大家先做這一步,從註冊到申請到的App Key可以使用,要等待1小時左右。所以,先註冊了吧。
註冊的網址:http://developer.mapquest.com/
註冊好之後,你會得到一個類似於“Fmjtd%7Cluubn10zn9%2C8s%3Do5-90rnq6”這樣的App key。也就是API KEY。
#1,顯示地圖。
這個,按照http://blog.csdn.net/mad1989/article/details/9733985來做就可以了。其中,我們只需要做完“1.3地圖執行個體化”即可。
這個步奏不難,只是下載的東西比較多,大家慢慢來就可以了。
#2,下載osmbonuspack。
這裡的下載方式和我們所常見的不太一樣,你需要通過svn來下載。
下面是svn的代碼:
svn checkout http://osmbonuspack.googlecode.com/svn/trunk/ osmbonuspack-read-only
下載好後,檔案夾下會有如下的三個項目。
#3,匯入到eclipse中。
如何匯入不講了,但是請注意,這裡只匯入OSMBounsPack項目,其他項目不是必須要匯入的。
還有,請注意勾選這個選項,因為這個項目是一個Android Library,不在同一級目錄下,引用時會出錯。
#4,將osmbonuspack引用到你的項目中。
這裡的引用很簡單,在你的項目上點擊右鍵,選擇Properties,在左邊的欄裡面選擇Android,然後在右邊的Library下,添加OSMBonusPack。
#5,寫代碼,實現導航。
這裡就很簡單了。由於是簡單的例子,這裡給大家看一下如何調用就可以了。
首先,onCreate方法的代碼:
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);activity = this;mMapView = (MapView) findViewById(R.id.mapview);mController = mMapView.getController();// ResourceProxy init// mResourceProxy = new DefaultResourceProxyImpl(this);mMapView.setTileSource(TileSourceFactory.MAPNIK);mMapView.setBuiltInZoomControls(true);mMapView.setMultiTouchControls(true);// 定位當前位置,珠海GeoPoint center = new GeoPoint(22.288874, 113.576873);mController.setZoom(14); // 先設定縮放,後設定中心點,不然會出現偏差。mController.setCenter(center);mMapView.setMinZoomLevel(14);mMapView.setMaxZoomLevel(17);// 委任標記setBickAndParkLocation();mMapView.setKeepScreenOn(true);// 右下角小地圖Overlay// MinimapOverlay MinimapOverlayoverlay = new MinimapOverlay(this,// mMapView.getTileRequestCompleteHandler());// mMapView.getOverlays().add(MinimapOverlayoverlay);// mMapView.getOverlays().remove(0);// 地圖範圍控制// http://stackoverflow.com/questions/5403733/restricting-the-area-the-user-can-go-to-on-mapviewBoundingBoxE6 areaLimit = new BoundingBoxE6(22.499, 113.698, 22.123,113.363);mMapView.setScrollableAreaLimit(areaLimit);mZoomLevel = mMapView.getZoomLevel();new Thread(new Runnable() {@Overridepublic void run() {RoadManager roadManager = new MapQuestRoadManager("這裡是#0申請的那個App Key");roadManager.addRequestOption("routeType=bicycle");Marker startMarker = new Marker(mMapView);GeoPoint startPoint = new GeoPoint(22.274, 113.574);startMarker.setPosition(startPoint);startMarker.setAnchor(Marker.ANCHOR_CENTER, 1.0f);// startMarker.setIcon(getResources().getDrawable(R.drawable.ic_launcher));mMapView.getOverlays().add(startMarker);// mMapView.invalidate();startMarker.setTitle("Start point");// mMapView.invalidate();ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>();waypoints.add(startPoint);waypoints.add(new GeoPoint(22.284, 113.553)); // end pointRoad road = roadManager.getRoad(waypoints);Polyline roadOverlay = RoadManager.buildRoadOverlay(road,activity);mMapView.getOverlays().add(roadOverlay);// mMapView.invalidate();Drawable nodeIcon = getResources().getDrawable(R.drawable.marker_node);for (int i = 0; i < road.mNodes.size(); i++) {RoadNode node = road.mNodes.get(i);Marker nodeMarker = new Marker(mMapView);nodeMarker.setPosition(node.mLocation);nodeMarker.setIcon(nodeIcon);nodeMarker.setTitle("Step " + i);mMapView.getOverlays().add(nodeMarker);}mhandler.obtainMessage(1).sendToTarget();}}).start();
之後,在類中添加Handler:
Handler mhandler = new Handler() {public void handleMessage(Message msg) {mMapView.invalidate();}};
這裡開線程的原因,是因為網路操作,不能在主線程中進行。
之後,就可以編譯運行啦。
#6,Unable to execute dex: Multiple dex files define Lorg/slf4j/ILoggerFactory
問題:
匯入用來導航的OSMBonusPack第三方包時,編譯器出現如下錯誤:
Multiple dex files define Lorg/slf4j/ILoggerFactory
原因:
這個是由於在來源程式中,需要引用slf4j的jar包,而OSMBonusPack也引用了這個jar包,但是兩個jar包的版本不同導致的。
解決方案:
將OSMBonusPack中slf4j的jar包刪除,並匯入現在項目中使用的jar包,重新引用,編譯一次即可。