• 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]

  • 相关阅读:
    codeforces 672B B. Different is Good(水题)
    codeforces 672A A. Summer Camp(水题)
    poj-1273 Drainage Ditches(最大流基础题)
    hdu-3592 World Exhibition(差分约束)
    poj-1201 Intervals(差分约束)
    解决Windows只能打英文输入法图标不见不显示问题
    Windows查看MD5码
    Windows中类似 linux netstat grep命令
    清空所有账户回收站
    PLSQL dev字符集乱码设置
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/3160165.html
Copyright © 2020-2023  润新知