Android-osmdroid

参考工具

github: osmdroid/osmdroid

compile 'org.osmdroid:osmdroid-android:<VERSION>'

离线地图制作工具: Mobile Atlas Creator

使用Mobile Atlas Creator

wiki map sources

离线地图工具类SampleOfflineOnly.java

离线地图官方教程Offline-Map-Tiles

操作步骤

离线地图制作
  1. 打开Mobile Atlas Creator工具
  2. 新建地图册(可选Osmdroid ZIP/SQLite/GEMF)
  3. 选择地图源
  4. 勾选图片转换,设置图块格式(重要,要和代码的设置一致)
  5. 设置缩放比例
  6. 地图上框选区域
  7. 在当前地图册点击添加选择区域
  8. 最后开始点击下载地图册
  9. 得到一个压缩文件,存储备用
离线地图自定义地图源(geoserver)
  1. Mobile Atlas Creator工具目录的mapsources目录添加地图源配置文件

  2. geoserver地图地图源配置文件geoserver_maps.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customWmsMapSource>
    <name>My Geoserver WMS</name>
    <minZoom>0</minZoom>
    <maxZoom>18</maxZoom>
    <tileType>PNG</tileType>
    <version>1.1.1</version>
    <!-- 图层名字hws(工作空间):china_net(图层名字) -->
    <layers>hws:china_net</layers>
    <!-- hws替换为自己的工作区间,ip端口替换自己服务器的,其他不变 -->
    <url>http://192.168.1.230:8082/geoserver/hws/wms?service=WMS&amp;</url>
    <!-- 投影坐标系 -->
    <coordinatesystem>EPSG:4326</coordinatesystem>
    <aditionalparameters></aditionalparameters>
    <backgroundColor>#000000</backgroundColor>
    </customWmsMapSource>
  3. 多图层配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customMultiLayerMapSource>
    <name>多图层自定义</name>
    <tileType>png</tileType>
    <backgroundColor>#000000</backgroundColor>
    <!-- 0~1由透明到不透明,1.0是设置对底层的图层,0.5是设置底层上一层图层,以此类推n图层以此设置即可-->
    <layersAlpha>1.0 1.0 0.5 1.0</layersAlpha>
    <layers>
    <customMapSource>
    <name>Google 卫星图</name>
    <minZoom>0</minZoom>
    <maxZoom>20</maxZoom>
    <tileType>PNG</tileType>
    <tileUpdate>None</tileUpdate>
    <url>http://mt0.google.cn/vt/lyrs=s@124&amp;hl=zh-CN&amp;gl=CN&amp;src=app&amp;x={$x}&amp;s=&amp;y={$y}&amp;z={$z}&amp;s=Galileo</url>
    <backgroundColor>#000000</backgroundColor>
    </customMapSource>

    <customMapSource>
    <name>Google 地名图</name>
    <minZoom>0</minZoom>
    <maxZoom>20</maxZoom>
    <tileType>PNG</tileType>
    <tileUpdate>None</tileUpdate>
    <url>http://mt0.google.cn/vt/imgtp=png32&amp;lyrs=h@207000000&amp;hl=zh-CN&amp;gl=CN&amp;src=app&amp;x={$x}&amp;y={$y}&amp;z={$z}&amp;s=Galil</url>
    </customMapSource>

    <customWmsMapSource>
    <name>林班界</name>
    <minZoom>0</minZoom>
    <maxZoom>20</maxZoom>
    <tileType>PNG</tileType>
    <tileUpdate>None</tileUpdate>
    <layers>hws:linbanjie</layers>
    <url>http://192.168.1.230:8082/geoserver/hws/wms?service=WMS&amp;transparent=TRUE&amp;</url>
    <!-- 投影坐标系 -->
    <coordinatesystem>EPSG:4326</coordinatesystem>
    <aditionalparameters></aditionalparameters>
    </customWmsMapSource>

    <customWmsMapSource>
    <name>巡护路线</name>
    <minZoom>0</minZoom>
    <maxZoom>20</maxZoom>
    <tileType>PNG</tileType>
    <tileUpdate>None</tileUpdate>
    <!-- 图层名字hws(工作空间):china_net(图层名字) -->
    <layers>hws:xunhuluxian</layers>
    <!-- hws替换为自己的工作区间,ip端口替换自己服务器的,其他不变 -->
    <!-- 多参数,每个参数用&amp;分开-->
    <!-- 背景设置透明transparent=TRUE-->
    <url>http://192.168.1.230:8082/geoserver/hws/wms?service=WMS&amp;transparent=TRUE&amp;</url>
    </customWmsMapSource>
    </layers>
    </customMultiLayerMapSource>
离线地图自定义地图源(google地图)
  1. Mobile Atlas Creator工具目录的mapsources目录添加地图源配置文件

  2. google地图地图源配置文件google_maps.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <customMultiLayerMapSource>
    <name>Google 卫星</name>
    <tileType>PNG</tileType>
    <layers>
    <customMapSource>
    <name>Google 卫星图</name>
    <minZoom>0</minZoom>
    <maxZoom>20</maxZoom>
    <tileType>PNG</tileType>
    <tileUpdate>None</tileUpdate>
    <url>http://mt0.google.cn/vt/lyrs=s@124&amp;hl=zh-CN&amp;gl=CN&amp;src=app&amp;x={$x}&amp;s=&amp;y={$y}&amp;z={$z}&amp;s=Galileo</url>
    <backgroundColor>#000000</backgroundColor>
    </customMapSource>
    <customMapSource>
    <name>Google 地名图</name>
    <minZoom>0</minZoom>
    <maxZoom>20</maxZoom>
    <tileType>PNG</tileType>
    <tileUpdate>None</tileUpdate>
    <url>http://mt0.google.cn/vt/imgtp=png32&amp;lyrs=h@207000000&amp;hl=zh-CN&amp;gl=CN&amp;src=app&amp;x={$x}&amp;y={$y}&amp;z={$z}&amp;s=Galil</url>
    </customMapSource>
    </layers>
    </customMultiLayerMapSource>
  3. 地图源文件xml的设置搜索Mobile Atlas Creator自定义地图源

    IPad 離線地圖:「Mobile Atlas Creator + 地圖加加」,讓google map成為好用的離線地圖!!

Android代码设置

  1. 导包compile 'org.osmdroid:osmdroid-android:<VERSION>'

  2. 手动设置离线地图的文件

    1
    2
    3
    4
    5
    6
    7
    //路径压缩包的路径放在存储目录下/osmdroid/Google Maps(世界墨卡托).zip这个是刚刚用工具制作得到的压缩文件
    String path=Environment.getExternalStorageDirectory().getAbsolutePath() + "/osmdroid/"+"Google Maps(世界墨卡托).zip";
    //设置为离线工作模式。路径一定要对,而且只支持 ZIP/SQLite/GEMF
    mapView.setTileProvider(new OfflineTileProvider(new SimpleRegisterReceiver(this),new File[]{new File(path)}));
    //这里Google Map为压缩文件的第一层目录名,一定要一致,.png.tile为最内层目录的文件后缀名一点定要一致,一般是png,这里比较特殊
    mapView.setTileSource(new XYTileSource("Google Map", 7, 16,
    256, ".png.tile", null));
  3. 上面那步基本就可以解析了,官方使用SampleOfflineOnly.java做自动解析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    //设置离线地图的路径
    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/osmdroid/");
    if (f.exists()) { //判断目录是否存在
    File[] list = f.listFiles(); //得到该目录下的文件
    if (list != null) {
    for (int i = 0; i < list.length; i++) { //遍历的得到的所有目录和文件
    if (list[i].isDirectory()) { //目录跳过
    continue;
    }
    String name = list[i].getName().toLowerCase();
    if (!name.contains(".")) { //没有后缀跳过
    continue; //skip files without an extension
    }
    name = name.substring(name.lastIndexOf(".") + 1); //得到后缀名
    if (name.length() == 0) {
    continue;
    }
    if (ArchiveFileFactory.isFileExtensionRegistered(name)) { //后缀名是否是ZIP/SQLite/GEMF其中一个
    try {
    OfflineTileProvider tileProvider = new OfflineTileProvider(new SimpleRegisterReceiver(this),
    new File[]{list[i]}); //如果是把该文件作为离线地图的提供者
    mapView.setTileProvider(tileProvider); // <重要>
    String source = "";
    IArchiveFile[] archives = tileProvider.getArchives();
    if (archives.length > 0) {
    Set<String> tileSources = archives[0].getTileSources();
    if (!tileSources.isEmpty()) {
    source = tileSources.iterator().next(); //活动压缩文件第一级目录的目录名
    //自定义设置 <重要> ,其中文件后缀名要和压缩文件内的后缀一致
    this.mapView.setTileSource(new FileBasedTileSource(source,0, 18, 256, ".png", null));
    // this.mapView.setTileSource(FileBasedTileSource.getSource(source)); //默认设置
    } else {
    this.mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
    }
    } else {
    this.mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
    }
    this.mapView.invalidate();
    return;
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }
    }
    Toast.makeText(this, f.getAbsolutePath() + " did not have any files I can open! Try using MOBAC", Toast.LENGTH_SHORT).show();
    } else {
    Toast.makeText(this, f.getAbsolutePath() + " dir not found!", Toast.LENGTH_SHORT).show();
    }

常见问题

  1. 当mobac配置多图层时,geoserver wms不加transparent=TRUE&amp;会有白色背景,设置透明度会导致最底层的地图上覆盖了一层半透明的白色,导致看不起低图
  2. mobac加载geoserver gwc连接,如果图层只有一部分,会导致Google map在图层之外的也加载不出来
参考

How to use Custom map in MOBAC?