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。

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

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

你可能感兴趣的:(Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航)