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的代码:
1 | svn checkout http://osmbonuspack.googlecode.com/svn/trunk/ osmbonuspack- read - only |
下载好后,文件夹下会有如下的三个项目。
#3,导入到eclipse中。
如何导入不讲了,但是请注意,这里只导入OSMBounsPack项目,其他项目不是必须要导入的。
还有,请注意勾选这个选项,因为这个项目是一个Android Library,不在同一级目录下,引用时会出错。
#4,将osmbonuspack引用到你的项目中。
这里的引用很简单,在你的项目上点击右键,选择Properties,在左边的栏里面选择Android,然后在右边的Library下,添加OSMBonusPack。
#5,写代码,实现导航。
这里就很简单了。由于是简单的例子,这里给大家看一下如何调用就可以了。
首先,onCreate方法的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 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:
1 2 3 4 5 | 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包,重新引用,编译一次即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?