`

BigPlanetTracks源码分析

阅读更多

这段时间做了一个android项目,我负责的是地图模块,由于客户要求具体离线地图的功能,后来经一师兄推荐参考BigPlanetTracks源码,然后就只有认真查看源码,共有15个包,要理清软件的思路不是那么容易,下面我简要说下我读到这份源码的一些东西。

BigPlanetTracks只要分为两块:地图和轨迹。只要理清地图的那部分就行了。

Big几乎没有使用到android地图开发的什么控件(获取Location除外),Big地图显示的基本思想很简单:获取Location,计算出对应的Tile(瓦片),然后就是从服务器下载数据。

我们先简单说下地图,地图是球形的,而我们平时见到的地图是平面长方形的,将球形的地图转换成平面的矩形就是Gerardus Mercator投影,然后就是讲平面地图分割成瓦片。

瓦片地图就是将从地图图片的左上角开始,从左至右、从上到下进行切割,分割成相同大小(比如256x256像素)的正方形地图瓦片,形成第0层瓦片矩阵;在第0层地图图片的基础上,按每2x2像素合成为一个像素的方法生成第1层地图图片,并对其进行分块,分割成与下一层相同大小的正方形地图瓦片,如此下去就形成了不同分辨率的图层。

RawTile就是瓦片类记录Tile的行,列,以及图层的信息。Big用了很多坐标,地理坐标,Tile坐标,Tile上偏移坐标,屏幕坐标,其中,Tile(x,y)坐标中x,y分别乘以瓦片的大小(Big使用256)就得到了该Tile瓦片左上角在整个地图的偏移,Big还使用了globalOffset表示的该瓦片左上角的到手机屏幕左上角的距离的相反数,至于GPSoffset其实是地理坐标的矫正位移。

GeoUtils类是将经纬度转换对应的Tile,还可以就算出该经纬度点在对应Tile(地图图片)的偏移。

provider包就是提供数据源,其实就是服务器地址,我们只需要将传入Tile的(x,y,z)信息就可以获得对应的URL。

loader包实现的是下载Tile 数据的操作,其中BaseLoader类就是定义了根据Tile去下载数据data数组,BaseLoader中很多都是使用抽象方法,这些方法在TileLoader中具体定义了。

storage包完成Tile数据的本地存储,存到数据库里。存储记录了Tile的信息,以及images(其实就是下载下来的data)。storage包中的BitmapCache以及其的包装类BitmapCacheWrap还实现了从当前缓存下来的HashMap中根据Tile获取对应的图片。

Tile的显示的相关类是:MapControl和PhysicMap,前者负责显示很相应用户的操作,后者负责具体数据的操作,其实就是View和Control的分离。其实核心就是操作Tile,每次显示的都是计算出左上角第一个Tile然后根据屏幕的大小获取对应的Bitmap数组,这也是这个软件自适应屏幕尺寸的原理。至于显示Marker和GeoBookMark其实就是讲对应的图片View显示在对应的位置。

其他一些类,BigPlanetApp和Preferences其实为了保存软件的一些值,每次启动软件都先进行初始化。

BigPlanetTracks不仅让我学习了地图的一些基本东西,还让我学到了软件设计的一些思想,当然Big本身有些地方也冗余的地方。

由于时间的关系,我就说简要说这些,有兴趣者可以一起交流。

 

 

 

分享到:
评论
3 楼 路飞用小妖 2012-10-02  
是mapControl的doDraw那部分吗
2 楼 路飞用小妖 2012-10-02  
楼主能否给点指点
哪里是复杂绘制当前屏幕范围显示的地图
还有求相反数那个作用是什么?
感谢
1 楼 wa114d 2012-09-03  
楼主很强大,还没毕业就学习这么多了,厉害

相关推荐

Global site tag (gtag.js) - Google Analytics