1.首先了解一下OSM
OpenStreetMap 是一个世界地图,可依据开放许可协议自由使用。OpenStreetMap的优缺点:优点:数据开放,可自己搭建服务器,自己修改数据;缺点:数据尚不完善,资源不是十分丰富。可以为任何需要的人,创建并提供象道路图之类自由的地理数据。
2.地图控件渲染机制
由于Android自带的MapView在使用地图时并未定义和实现容器组件,而OSMdroid恰恰有了这些功能,OSMdroid中的MapView是展示地图视图的控件类,他继承于ViewGroup,并且实现了IMapView、 MapViewConstants和MuItiTouchObjectCanvas<Object>三个接口(现在的最新版本MapView是两个)。 在加载地图之前, 首先需要将地图视图绘制出来以容纳其他图层。
由于MapView继承ViewGroup,是个自定义View,就是可以在MapView 所以MapView视图绘制的过程分为:onMeasure(), onLayout()和dispatchDraw()。
3.地图控件交互机制
MapView允许用户可以在地图上添加比例尺、 定位图标、 信息提示框、 小地图等一些列的OverLayler图层。 当用户与地图发生交互时, 会产生相应的手势动作以及触摸事件。OSMdroid的MapView类中定义了MapViewGestureDetectorListener为内部类, 该类实现了OnGestureListener接口,而通过定义MapViewDoubleClickListener内部类实现了OnDoubleTapListener接口,通过复写接口中的方法来实现相应的触发动作事件。
4.地图渲染机制
首先了解什么是地图切片, 地图切片就是不同缩放级别下的地图都被切割所形成的256× 256像素大小的正方形区域。通过逐步加载地图切片,最终形成一个地图切片体系(TileSystem),OSMdroid在这个TileSystem类中定义了每一个缩放级别下的分辨率、 比例尺等计算方法, 以及切片坐标与像素坐标、 地理坐标之间的相互转换等算法。在OSMdroid中给我们定义TileLooper抽象类,类中有个loop( ) 方法,通过这个方法可以实现对当前屏幕下所需要显示的地图切片数目的计算, 其计算思想如下:
1, 首先获取当前屏幕下的矩形区域;
2, 将上述的矩形区域的左上角和右下角坐标转换到墨卡托投影下的像素坐标,即: 将屏幕坐标系下的左上角和右下角坐标转换成像素坐标系下坐标;
3, 将上述获取的像素坐标转换成切片坐标;
4, 按照切片坐标系下, 切片之间的排列规则, 利用for循环获取当前区域内从上到下, 从左到右的每一个切片信息。
通过上述四个步骤, 就能够循环计算出当前屏幕下需要显示的切片个数, 最后通过复写TileLooper类中的handleTile()方法来处理绘制计算出来的切片。