Android开源地图项目 BigPlanetTracks 学习随笔
一、 app主体部分 [tyt.android.bigplanettracks]
二、 地图部分 [tyt.android.bigplanettracks.maps]
1、ui包
2、loader包 用来下载瓦片
3、maps包
4、storage包
三、 轨迹部分 [tyt.android.bigplanettracks.tracks]
一、 app主体部分 [tyt.android.bigplanettracks]
二、 地图部分 [tyt.android.bigplanettracks.maps]
1、ui包:界面部分
[1] MapControl.java 地图核心操作
最下边包含一个内部类:面板类Panel,继承自View。
[2] ZoomPanel.java 下方的缩放组件 *会用到*
[3] SmoothZoomEngine.java 平滑缩放引擎
包含一个Integer型的缩放队列:scaleQueue
有SmoothZoomEngine线程 使用synchronized加锁
[4] DoubleClickDetector.java 专门处理双击的类 包含双击判断
[5] OnDialogClickListener.java OnMapLongClickListener 监听器(基本空)
[6] BitmapUtils.java 处理位图的实用工具 用来绘制BACKGROUND_COLOR颜色的空背景 和带框线LINE_COLOR的背景
[7] AddBookmarkDialog.java 添加书签的对话框
2、loader包:下载瓦片
BaseLoader类定义了根据Tile去下载数据的瓦片RawTile数组tiles ,BaseLoader中很多都是使用抽象方法,这些方法在TileLoader中具体定义了。
[1] BaseLoader.java 是一个继承自Thread类的抽象类
[2] TileLoader.java 文件最下方有一个类ThreadLoader,继承自 BaseLoader,实现了BaseLoader中的抽象方法
3、maps包:地图相关类
[1] RawTile.java 瓦片类 可被序列化(Intent传数据会用到) 记录Tile的行,列,以及图层的信息。
包含 x, y, z, s四个主要变量
Tile(x,y)坐标中x,y分别乘以瓦片的大小(在此为256)就得到了该Tile瓦片左上角在整个地图的偏移
x , y 是瓦片坐标系的坐标值,z代表缩放级别,s则共有八个字符:空字符和Galileo的七个字符。
x , y 的值在 z 增加时会按级数递增,而s 的值很可能是 x , y , z 三个参数组合后的从 0 到 7 的一个索引值。
x , y , z 组合后与 8 求余即可得到 s 的值。
当 x = 0 时,y 增 1 时,s会同时增 1,与 z 值无关。
当 y = 0 时,x 增 1 时,s会同时增3 ,与 z 值无关。
从上面两条可以得出,x , y 很可能以 3*x + y 的方式组合,然后与 8 求余即得 s。
推测公式为:( 3*x + y )%8 = s
详见http://blog.csdn.net/mygisforum/article/details/7582449
[2] Preferences.java
保存软件的一些值,这些值都被声明为static final变量,类中包括每个值的put,get 方法。具体调用在BigPlanet类中。调用方式为Preferences.putGPSOffset();,Preferences.getGPSOffset(); 每次启动软件都先进行初始化
[3] Place.java 地点类
包括以下几个变量,以及它们的get set方法
名称 :name;
纬度latitude :lat;
经度longitude :lon;
位置 :location;
地址 :address;
[4] MarkerManager.java 标记物类
在MapControl.java 中有实例
构造函数中,将各个标记物对应的图片put入一个HashMap<Integer,MarkerImage> images中。
最下边两个类
MarkerImage 三个内部变量:
Bitmap image 标记物图片
int offsetX X轴偏移
int offsetY Y轴偏移
Marker
Place place; 地点
RawTile tile; 瓦片
Point offset; 偏移
boolean isGPS;
MarkerImage markerImage; 标记物图片
4、storage包:Cache缓存和文件缓存
[1] ExpiredHashMap.java 能够存储一定量的位图,会自动删除最早的部分。
包含一个HashMap<ExpRawTile, Bitmap> (大小size在构造函数中指定)
gc()方法:用于在高速缓存中删除最旧的部分
ExpRawTile类在ExpiredHashMap.java文件最下边, 继承自瓦片类RawTile,实现了Comparable<ExpRawTile>接口,包含一个参数addedOn。两个ExpRawTile可比较addedOn的大小
[2] BitmapCache.java 图片缓存类
包含一个ExpiredHashMap类型的变量 cacheMap
里边的函数,都是通过变量cacheMap调用ExpiredHashMap里的方法:清空clear(),get(), put()方法,gc()方法
[3] BitmapCacheWrapper.java
其中有一个BitmapCacheWrapper类型的 实例instance,通过getInstance()得到
包含“不缩放”和“缩放”两种类型的的图片缓存,它们是BitmapCache类型的变量 cache(大小CACHE_SIZE)和scaledCache(大小为20)。
put方法:
putToCache(RawTile tile, Bitmap bitmap) 放置一个位图切片到缓存
putToScaledCache(RawTile tile, Bitmap bitmap)放置一个缩放过的位图切片到缓存
get方法类似
public void gc(){
scaledCache.gc();
cache.gc();
}
public void clear() {
scaledCache.clear();
cache.clear();
}
[4] IlocalStorage 是个文件缓存的接口类,提供一些待实现接口
clear() 清空文件缓存
put() 在文件缓存保留瓦片
get() 返回指定的瓦片或空(如果没有找到)
[5] LocalStorage 实现IlocalStorage中的接口 **重要**
指定文件缓存的根目录 private static final String root_dir_location = "/sdcard/bigplanet/"; ****没找到此目录****
拥有一个ILocalStorage 类型的实例localStorage,通过getInstance()获取;
构造函数中初始化文件缓存(如果有必要);
clear() 清空文件缓存的函数,调用deleteDir()方法, 递归删除目录及其中的所有内容。
String buildPath(RawTile tile) 根据传入的RawTile对象,和根目录拼接,返回完整路径名称。
其中RawTile类中已重写toString函数。
@Override
public String toString() {
String path = s+"/"+z+"/"+x+"/"+y+"/";
return path;
}
void put(RawTile tile, byte[] data);
调用buildPath(tile)函数,通过tile构建完整路径,通过BufferedOutputStream输入流,将数据data写入文件中。
BufferedInputStream get(RawTile tile);
调用buildPath(tile)函数,通过tile构建完整路径,返回BufferdInputStrem输入流(带有缓冲区域的InputStream)。
[6] SQLLocalStorage.java 实现IlocalStorage中的接口
1) 将图片文件以二进制形式存到数据库中
2) 字段为:
x int,
y int,
z int,
s int,
image blob,
PRIMARY KEY (x,y,z,s)
3) 地图数据库的路径为/sdcard/RMaps/maps/
轨迹数据库的路径为/sdcard/BigPlanetTracks/
4) put函数,存入数据库
public void put(RawTile tile, byte[] data) {
ContentValues initialValues = new ContentValues();
initialValues.put(SQLLocalStorage.X_COLUMN, tile.x);
initialValues.put(SQLLocalStorage.Y_COLUMN, tile.y);
initialValues.put(SQLLocalStorage.Z_COLUMN, tile.z);
initialValues.put(SQLLocalStorage.S_COLUMN, tile.s);
initialValues.put(SQLLocalStorage.IMAGE_COLUMN, data);
db.insert(SQLLocalStorage.TILES_TABLE, null, initialValues);
}
其中
private static String X_COLUMN = "x";
private static String Y_COLUMN = "y";
private static String Z_COLUMN = "z";
private static String S_COLUMN = "s";
private static String IMAGE_COLUMN = "image";
图像通过byte[] data存储在数据库中
5) get函数
public BufferedInputStream get(RawTile tile)
返回的是 BufferedInputStream类型的 io变量
byte[] d = c.getBlob(c.getColumnIndex(SQLLocalStorage.IMAGE_COLUMN));
io = new BufferedInputStream(new ByteArrayInputStream(d), 4096);
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
6) SQLLocalStorage和LocalStorage中都有一个
private static ILocalStorage localStorage;实例
通过public static ILocalStorage getInstance() {
if (localStorage == null) {
localStorage = new SQLLocalStorage();
}
return localStorage;
} 函数读取
三、 轨迹部分 [tyt.android.bigplanettracks.tracks]
Android开源地图项目 BigPlanetTracks 学习随笔的更多相关文章
- 2015年十大热门Android开源新项目
2015年十大热门Android开源新项目 2015 即将结束,又到了大家喜闻乐见的年终盘点时刻啦,今天给大家盘点一下 2015 年 Android 开发领域新出现的 10 大热门开源项目.数据来自于 ...
- soul开源网关项目搭建学习
1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...
- Android开源库项目集锦
一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才開始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的全部平台. ...
- Android开源工具项目集合
最近因为要去外派了,工欲善其事,必先利其器!所以又回顾了一下自己github上所收藏的项目,也算是温故而知新吧. 最流行的Android组件大全 http://www.open-open.com/li ...
- Android开源经典项目
目前包括: Android开源项目第一篇--个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
- 10个经典的Android开源应用项目
Android开发又 将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧和 创造力.学习开源代码是掌握技术的 ...
- 9个完整android开源app项目
一.photoup 介绍: photoup 是一款开源的相册类app,主要功能是将本地图片提交到facebook上去,虽然他的功能和facebook的远程服务相关,但是本身是可以被当作一款 相册应用的 ...
- 140款Android开源优秀项目源码
BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beautifu ...
- Android开源client之LookAround学习(一)Application & 网络框架
之前看过开源clientLookAround(下载地址:http://download.csdn.net/detail/hualulove/7306807),链接:http://blog.csdn.n ...
随机推荐
- hibernate学习(2)
1 实体类编写规则 2 hibernate主键生成策略 3实体类操作 (1)crud操作 (2)实体对象状态 4 hibernate的一级缓存 5 hibernate事务操作 (1)事务代码规则写法 ...
- SSIS之数据流任务
数据流任务主要用于运行数据流以提取.转换.加载源数据.一个包中可以有多个数据流任务,也可以包含零个数据流任务.下面关系图显示含有一个数据流任务的包: 了解数据流任务后,我们就简要的学习一下如何创建数据 ...
- POJ - 2195 最小费用最大流
题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...
- Jenkins自动化部署及代码检查配置应用
首先jenkins是基于java开发的一种持续集成工具,它的存在和实际应用使得我们在开发过程中节省了很多宝贵时间,既然基于java,所以java环境是必须的. 其次Tomcat是针对Java的一个开源 ...
- 交换排序—快速排序(Quick Sort)原理以及Java实现
交换排序—快速排序(Quick Sort) 基本思想: 1)选择一个基准元素,通常选择第一个元素或者最后一个元素, 2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素 ...
- IntelliJ IDEA创建Maven+SSM+Tomcat+Git项目【全程详解】
记录一下整个创建项目的过程,其中包括: Maven 项目创建: SSM配置文件: Tomcat配置: Git配置: Git忽略文件Ignore配置: 图文讲解,通俗易懂,易上手. 一.创建Maven ...
- ionic2——环境配置篇
环境配置 安装nodeJS 配置cnpm 安装ionic2 安装cordova 安装java sdk 安装android sdk(在项目最后打包时app的时候会用到,前期是在浏览器环境测试开发暂时不需 ...
- hdu-1102-Constructing Roads(Prim算法模板)
题目链接 /* Name:hdu-1102-Constructing Roads Copyright: Author: Date: 2018/4/18 9:35:08 Description: pr ...
- PHP JSON文件解析并获取key、value,判断key是否存在
/****************************************************************************** * PHP JSON文件解析并获取key ...
- tensorflow 学习笔记-1
http://www.jianshu.com/p/e112012a4b2d 参考的网站 -------------------------------------------------------- ...