• 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包,重新引用,编译一次即可。

    一只孤独的猫咪神!喵!
  • 相关阅读:
    创建应用程序菜单与菜单融合 
    FastReport 内置函数的用法与注意
    Visual Basic 2005 中的程式語言加強功能
    写作关键用词及短语汇总
    序列化FastReport
    Only Time(惟有时光)
    bcd
    【分享】微软产品全部序列号,盖茨会哭的~~~
    TADOQuery parameter对象被不正确地定义。提供了不一致或不完整的信息
    两相四线步进电机驱动代码
  • 原文地址:https://www.cnblogs.com/maomishen/p/3572015.html
Copyright © 2020-2023  润新知