Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航

摘要:
OpenStreetMap的引入在中国仍然很少见。有一篇关于csdn的好文章,所以我不再赘述。这里的下载方法与我们通常所做的不同。你需要通过svn下载。以下是svn的代码:svncheckouthttp://osmbonuspack.googlecode.com/svn/trunk/osmbonuspack-read-only下载后,文件夹中将有以下三项。此外,请选中此选项,因为此项目是一个Android库,不在同一级别目录中,并且在引用它#4时会发生错误。请将osmbonupack引用到您的项目。这里的参考很简单。右键单击项目,选择属性,在左列中选择Android,然后在右侧的库下添加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

下载好后,文件夹下会有如下的三个项目。

Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航第1张

#3,导入到eclipse中。

如何导入不讲了,但是请注意,这里只导入OSMBounsPack项目,其他项目不是必须要导入的。

还有,请注意勾选Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航第2张这个选项,因为这个项目是一个Android Library,不在同一级目录下,引用时会出错。

#4,将osmbonuspack引用到你的项目中。

这里的引用很简单,在你的项目上点击右键,选择Properties,在左边的栏里面选择Android,然后在右边的Library下,添加OSMBonusPack。

Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航第3张

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

免责声明:文章转载自《Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇scrapy抓取所有网站域名Selenium切换窗口,警告框处理,调用JavaScript代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SVN更改登录用户

如果装了TortoiseSVN: Settings -> Saved Data -> Authentication Data -> clear。即可清除保存的上个用户登录信息;当再次用到svn时,会提示输入用户名密码,输入新的用户名密码即可。 或者,手动删除下面目录下的svn登录用户信息保存文件: C:Documents and Setti...

无法访问SVN历史记录的问题

今天在eclipse中发现无法访问SVN的历史记录,提示条目不可读,截图如下: 用小乌龟客户端试了试也不行,截图如下: 最后解决办法是在SVN服务器上将代码仓库中conf目录下的svnserve.conf文件中设置  anon-access = null,保存文件即可,不需要重启SVN服务。...

svn 删除、移动和改名

删除、移动和改名 Subversion allows renaming and moving of files and folders. So there are menu entries for delete and rename in the TortoiseSVN submenu. 图4.33.版本控制文件的菜单浏览 正在删除文件/文件夹...

(转)SVN分支/合并原理及最佳实践

先说说什么是branch。按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰trunk的情况下,和trunk并行开发,待开发结束后合并回trunk中,在branch和trunk各自开发的过程中,他们都可以不断地提交自己的修改,从而使得...

centos7 svn在repository在的情况下重装恢复

公司一台centos服务器一不小心被搞崩溃了,进不去系统,svn没有备份,泪牛满面~ 重装系统后,发现repository文件夹还在,幸亏代码没放根目录。 安装svn 开始恢复,先安装svn yum -y install subversion 迁移 大部分教程都是教从头创建repository,现在repository文件还在,该怎么操作? 网上搜了一通...

(转)SVN详解

原文地址:http://www.weixingon.com/s/visualsvn+%E4%B8%AD%E6%96%87 1.几种代理管理工具的适用场景 A.如果你的项目是5-6人的小团队,那么使用VSS已经可以了。 B.如果是几十个人的团队,团队中需要创建代码分支,或者需要跨平台,跨地区开发,那么SVN是一个不错的选择。 C.对于较大型的项目,如果是使用...