最近自己制作了几个iphone4使用的离线地图,总结一下经验:
1. 原始地图下载
使用Global Map Download Tool 下载,网上教程很多。
2. 转为iPhone格式
使用GMDL的‘->iPhone' 功能,选择firmware2.2 & 3,生成MapTiles.sqlitedb。
3. 转为iPhone4格式
使用Mapv4v5Converter转为iPhone4格式,生成新的MapTiles.sqlitedb。
对于iPhone4,iOS4.2.1,此时生成的MapTiles.sqlitedb的version信息是不对的(郁闷)。
由iPhone4地图应用自身产生的MapTiles.sqlitedb的version表是这样的:
$sqlite3 MapTiles.sqlitedb
SQLite version 3.6.23.2
Enter ".help" for instructions
sqlite> select * from version;
11|zh_CN
-32519|
sqlite>
而由Mapv4v5Converter生成的MapTiles.sqlitedb是这样的:
$sqlite3 MapTiles.sqlitedb
SQLite version 3.6.23.2
Enter ".help" for instructions
sqlite> select * from version;
10|zh_CN
0|
sqlite>
其中的locale,即zh_CN也有可能是其他的值。因此,需要将这个表改为与原来一样:
sqlite> update version set version=-32519 where version=0;
sqlite> update version set locale='zh_CN' where version=10;
sqlite> update version set version='11' where version=10;
sqlite3可以在iPhone上装,也可以在PC上装。
4. 地图初始点
需要用com.apple.Maps.plist确定初始视点。使用经纬度查询工具确定地图中心点即可。
从iPhone4的/var/mobile/Library/Preferences目录下下载com.apple.Maps.plist,使用
plist文件编辑工具,改为下面内容即可(其中的Latitude和Longitude是北京的经纬度,应替换为
地图城市中心的经纬度):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LastViewMode</key>
<integer>0</integer>
<key>LastViewedLatitude</key>
<real>39.908711</real>
<key>LastViewedLongitude</key>
<real>116.397506</real>
<key>LastViewedZoomScale</key>
<real>11</real>
</dict>
</plist>
5. 地图安装
与每个地图相关的文件只有MapTiles.sqlitedb和com.apple.Maps.plist,它们的分别在:
/var/mobile/Library/Caches/Maps/MapTiles 和 /var/mobile/Library/Preferences 路径下。
因此,只要将制作好的文件上传到以上路径下即可。注意这两个文件的权限应为644,用户/组为mobile/mobile
(chmod 644 FILE; chown mobile:mobile FILE)。
6. 多地图管理
由于iPhone只能使用一个地图文件,因此管理多个离线地图比较麻烦。
offlinemaps采用的方式是将地图文件放在/var/mobile/Media/Maps目录下,切换地图是复制到目标目录。
当然最直接的想法是创建符号链接到目标目录下,但经过实验发现不好使(原因不明)。
但是,如果在/var/mobile/Library/Caches/Maps/MapTiles目录下创建目录放置地图文件,
然后创建符号链接到该目录下,则不会有问题。因此,可以在/var/mobile/Library/Caches/Maps/MapTiles目录下
创建不同的目录,如Beijing,Harbin,放置MapTiles.sqlitedb和com.apple.Maps.plist。
需要使用离线地图时,使用iFile为MapTiles.sqlitedb创建符号链接到/var/mobile/Library/Caches/Maps/MapTiles目录下,
并将com.apple.Maps.plist复制到/var/mobile/Library/Preferences 目录下即可。
7. 在线 - 离线切换
如果在在线状态下使用离线地图,地图应用会修改MapTiles.sqlitedb,
产生sqlitedb的journal文件(原因不明),导致反应迟缓,甚至崩溃(Shame!)。
因此尽量不要在在线状态使用离线地图。只需删掉指向MapTiles.sqlitedb的符号链接即可。
此时地图应用会产生新的MapTiles.sqlitedb。
8. 自动化
我不会iPhone应用开发,希望能有高人将上述方法实现为应用就最好了。
既然offlinemaps是python脚本程序,搞搞这些应该很简单啊,
不明白老大们为啥非得copy地图,期待能搞个好用的东西出来造福群众啊。
注:
1. Map Enhancer在iPhone4上不好使。
2. iphoneofflinemaps只能copy(orz),多占一倍空间,不爽。