欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BigPlanetTracks源码分析

程序员文章站 2022-05-17 15:40:54
...

这段时间做了一个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本身有些地方也冗余的地方。

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