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本身有些地方也冗余的地方。
由于时间的关系,我就说简要说这些,有兴趣者可以一起交流。
上一篇: js全角字符转为半角字符
下一篇: ASP 3.0高级编程(十九)
推荐阅读
-
Oracle中利用10053事件来分析Oracle是如何做出最终的执行计划
-
CodeIgniter配置之routes.php用法实例分析,codeigniterroutes_PHP教程
-
如何分析口碑营销公司哪家好
-
加速PHP动态网站 关于MySQL索引分析优化
-
为什么数据分析一般用到java,而不是使用hadoop,flume,hive的api使用php来处理相关业务?
-
使用ajax+php模仿google功能源码
-
亚马逊大数据分析服务Redshift的优与劣
-
MYSQL性能调优及架构设计-影响MYSQL性能的相关因素之实例分析_MySQL
-
MySQL查询排序与查询聚合函数用法分析
-
深度剖析使用python抓取网页正文的源码