关于OpenStreetMap的介绍,国内还是很少,csdn上面有一篇,写的不错,我也就不再做重复的事情了。
这里贴出链接地址:http://blog.csdn.net/mad1989/article/details/9733985
下面,开始介绍一下osmbonuspack导航。
注意,如果要做商业应用,请先仔细阅读许可文档,以免发生不必要的麻烦。
强烈推荐大家先做这一步,从注册到申请到的App Key可以使用,要等待1小时左右。所以,先注册了吧。
注册的网址:http://developer.mapquest.com/
注册好之后,你会得到一个类似于“Fmjtd%7Cluubn10zn9%2C8s%3Do5-90rnq6”这样的App key。也就是API KEY。
这个,按照http://blog.csdn.net/mad1989/article/details/9733985来做就可以了。其中,我们只需要做完“1.3地图实例化”即可。
这个步奏不难,只是下载的东西比较多,大家慢慢来就可以了。
这里的下载方式和我们所常见的不太一样,你需要通过svn来下载。
下面是svn的代码:
1
|
svn checkout http://osmbonuspack.googlecode.com/svn/trunk/ osmbonuspack-
read
-
only
|
下载好后,文件夹下会有如下的三个项目。
如何导入不讲了,但是请注意,这里只导入OSMBounsPack项目,其他项目不是必须要导入的。
还有,请注意勾选这个选项,因为这个项目是一个Android Library,不在同一级目录下,引用时会出错。
这里的引用很简单,在你的项目上点击右键,选择Properties,在左边的栏里面选择Android,然后在右边的Library下,添加OSMBonusPack。
这里就很简单了。由于是简单的例子,这里给大家看一下如何调用就可以了。
首先,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();
}
};
|
这里开线程的原因,是因为网络操作,不能在主线程中进行。
之后,就可以编译运行啦。
问题:
导入用来导航的OSMBonusPack第三方包时,编译程序出现如下错误:
Multiple dex files define Lorg/slf4j/ILoggerFactory
原因:
这个是由于在源程序中,需要引用slf4j的jar包,而OSMBonusPack也引用了这个jar包,但是两个jar包的版本不同导致的。
解决方法:
将OSMBonusPack中slf4j的jar包删除,并导入现在项目中使用的jar包,重新引用,编译一次即可。