Android-osmdroid
参考工具
github: osmdroid/osmdroid
compile 'org.osmdroid:osmdroid-android:<VERSION>'
离线地图制作工具: Mobile Atlas Creator
离线地图工具类SampleOfflineOnly.java
操作步骤
离线地图制作
- 打开Mobile Atlas Creator工具
- 新建地图册(可选Osmdroid ZIP/SQLite/GEMF)
- 选择地图源
- 勾选图片转换,设置图块格式(重要,要和代码的设置一致)
- 设置缩放比例
- 地图上框选区域
- 在当前地图册点击添加选择区域
- 最后开始点击下载地图册
- 得到一个压缩文件,存储备用
离线地图自定义地图源(geoserver)
在Mobile Atlas Creator工具目录的
mapsources
目录添加地图源配置文件geoserver地图地图源配置文件
geoserver_maps.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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&</url>
<!-- 投影坐标系 -->
<coordinatesystem>EPSG:4326</coordinatesystem>
<aditionalparameters></aditionalparameters>
<backgroundColor>#000000</backgroundColor>
</customWmsMapSource>多图层配置
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
<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&hl=zh-CN&gl=CN&src=app&x={$x}&s=&y={$y}&z={$z}&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&lyrs=h@207000000&hl=zh-CN&gl=CN&src=app&x={$x}&y={$y}&z={$z}&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&transparent=TRUE&</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端口替换自己服务器的,其他不变 -->
<!-- 多参数,每个参数用&分开-->
<!-- 背景设置透明transparent=TRUE-->
<url>http://192.168.1.230:8082/geoserver/hws/wms?service=WMS&transparent=TRUE&</url>
</customWmsMapSource>
</layers>
</customMultiLayerMapSource>
离线地图自定义地图源(google地图)
在Mobile Atlas Creator工具目录的
mapsources
目录添加地图源配置文件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
<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&hl=zh-CN&gl=CN&src=app&x={$x}&s=&y={$y}&z={$z}&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&lyrs=h@207000000&hl=zh-CN&gl=CN&src=app&x={$x}&y={$y}&z={$z}&s=Galil</url>
</customMapSource>
</layers>
</customMultiLayerMapSource>地图源文件xml的设置搜索
Mobile Atlas Creator自定义地图源
IPad 離線地圖:「Mobile Atlas Creator + 地圖加加」,讓google map成為好用的離線地圖!!
Android代码设置
导包
compile 'org.osmdroid:osmdroid-android:<VERSION>'
手动设置离线地图的文件
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));上面那步基本就可以解析了,官方使用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();
}
常见问题
- 当mobac配置多图层时,geoserver wms不加
transparent=TRUE&
会有白色背景,设置透明度会导致最底层的地图上覆盖了一层半透明的白色,导致看不起低图 - mobac加载geoserver gwc连接,如果图层只有一部分,会导致Google map在图层之外的也加载不出来