Android OpenStreetMap(OSM) 使用 osmbonuspack 進行導航


關於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包,重新引用,編譯一次即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM