關於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-mapview BoundingBoxE6 areaLimit = new BoundingBoxE6(22.499, 113.698, 22.123, 113.363); mMapView.setScrollableAreaLimit(areaLimit); mZoomLevel = mMapView.getZoomLevel(); new Thread(new Runnable() { @Override public 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 point Road 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包,重新引用,編譯一次即可。