简介:这是一款基于Java开发的Android导航客户端,专门用于加载OziExplorer的ozf2、ozfx3格式地图,适合徒步、寻宝、越野、帆船等户外场景。使用者需对OziExplorer或自制地图有一定了解,资源面向有户外导航需求的开发者与爱好者,可从源码层面学习地图解析、定位与轨迹显示等实现思路。压缩包为zip格式,约19.24MB;由于上游未提供文件总数与类型明细,简介不强行列举。项目配套常见问题解答与文档,支持翻译贡献和GitHub拉取请求,代码仓库完整并带有BitBucket镜像,便于对照学习与二次开发。目前已有753人学习下载,适合希望研究Android地图导航应用结构、或想在现有客户端上扩展功能的Java开发者。
1. Androzic 是什么:Android 上跑 OziExplorer 地图的老路子
手里攒了几年 OziExplorer 地图的人,换到 Android 手机后几乎都会卡在同一个问题上:这份地图还能怎么用?Androzic 就是专门解决这个问题的 Android 导航应用,它直接读取 ozf2、ozfx3 这两种 OziExplorer 栅格地图格式,配合同名的 .map 校准文件完成坐标绑定,不联网也能定位、导航、记录航迹。户外无信号场景下它的价值很直接:地图不依赖在线图源,校准信息全部在本地,GPS 一开就能接着用。适合手里有存量 OziExplorer 地图资源的人,或者想把离线地图终端落地到 Android 设备的野外巡检、徒步、测绘辅助场景。下面按我自己做过的路径,把格式选型、地图转换、加载配置和踩坑排查讲清楚。
2. 先看地图格式:ozf2 和 ozfx3 差在哪,怎么选
2.1 ozf2 与 ozfx3 的格式差异
ozf2 是老版本 OziExplorer 使用的栅格地图格式,它的特点是分块存储、支持 RLE 无损压缩,文件里的每个图块可以直接定位解码。ozf2 的兼容性最好,从老电脑到 Android 端的解析库都能识别。代价是压缩率一般,一张几十 MB 的 tif 导成 ozf2 可能只缩小到一半左右,文件大、读盘次数多。
ozfx3 是后来推出的替代格式,核心改动有两点:一是图块尺寸可以配置,二是引入了有损压缩选项。实际使用中,ozfx3 在同等视觉精度下文件体积能比 ozf2 小一半以上,加载时从闪存读取的数据量减少,冷启动打开一张大图的速度明显更快。但这不代表 ozfx3 全面优于 ozf2。有损压缩在等高线地图上容易把细线压出锯齿,如果源图本身就是扫描的纸质地形图,压缩痕迹会被放大。
还有一个容易被忽略的差异是文件内部的组织方式。ozf2 的文件头信息和图块索引结构比较固定,而 ozfx3 的图块偏移表更灵活,这导致个别转换工具生成的 ozfx3 虽然在电脑端能打开,放在 Android 端解析时却会出现“文件头能读、图块读不出来”的情况。这个坑我后面在避障章节专门展开。
为什么不直接把 tif 文件丢进手机里?因为 tif 是整幅图像,导航时每画一帧都要把整张图重采样,内寸和时间消耗都不小。ozf2/ozfx3 的分块机制让应用只解码当前视口对应的那几块,这是这套格式能跑在十几年前硬件上的直接原因。理解了这一点,后面设置分块参数时才不会乱来。
说白了,格式本身不是越新越好。老地图资源大多是 ozf2,没必要为了“升级”去批量转换;新导出的地图用 ozfx3 省空间。设备层面,低内存老手机建议用 ozf2,因为它的解码路径更老也更稳;新设备直接上 ozfx3。
2.2 .map 校准文件是怎么把像素坐标绑到经纬度的
地图文件本身只是一张带分块的图片,Androzic 能把它当导航图用,靠的是同名 .map 文本文件。这个文件记录了像素坐标和地理坐标的对应关系,以及投影、坐标系、地图边界等信息。看一个典型结构:
OziExplorer Map Data File Version 2.2 <地图名>.map 1 # 地图类型:栅格 3 # 校准点数 1,<像素x>,<像素y>,<经度>,<纬度>,0,0,0 # 校准点 1 2,<像素x>,<像素y>,<经度>,<纬度>,0,0,0 # 校准点 2 3,<像素x>,<像素y>,<经度>,<纬度>,0,0,0 # 校准点 3 <投影参数段> <坐标系与基准面段> <地图边界段>校准点的作用是一个仿射变换:两个像素坐标和两个经纬度就能算出一张图的旋转、比例、平移参数,所以一般至少要 3 个点,覆盖左上、右下、中间,目的是把图片变形误差摊平。投影参数段则说明这张图用的是经纬度直投还是 UTM 这类投影坐标。地图在屏幕上绘制时,Androzic 会根据当前设备坐标反算出屏幕中心对应地图的哪个像素。
判断一份 .map 是否靠谱的最快方法:用文本编辑器打开,看校准点里的经纬度有没有明显乱跳,以及投影段写的坐标系名称跟你制作时选的是否一致。映射基准面不一致是后期地图偏移的一大来源,这一条在后面的避障章节会反复出现。
另外记住一个硬性约定:.map 文件必须和地图图像文件同名、同目录。比如地图文件叫 林场地形图.ozfx3,那校准文件必须是 林场地形图.map,两个文件缺一不可。拷贝时只拿图像文件不拿校准文件,是新手最常犯的错。
2.3 格式选型:看来源、设备与纠错成本
选 ozf2 还是 ozfx3,我一般按三条线走。第一是来源。手里的原始地图如果是别人给的 ozf2,直接保留,不转;如果是自己从 tif 做的,默认导出 ozfx3。第二是设备。Android 设备内存低于 2GB 的我会转回 ozf2,因为 ozfx3 解码逻辑在低配机器上更容易触发整块内存峰值。第三是纠错成本。转换后一定先在户外或已知地标下核对一次,发现偏移要能回到制作环节重做,保留源图比反复转换更重要。
这里有个实际经验:同一张源图分别导出 ozf2 和 ozfx3,放在同一个设备上对比加载时间,ozfx3 通常快 20% 到 40%,但如果你用的转换参数把图块调得过大,这个优势会消失,甚至更慢。表格里是我自己常用的参数参考,用于自己制作地图时:
| 场景 | 格式 | 图块尺寸 | 压缩方式 |
|---|---|---|---|
| 等高线地形图 | ozfx3 | 512x512 | 无损 |
| 卫星影像底图 | ozfx3 | 1024x1024 | 有损中等 |
| 老设备兼容 | ozf2 | 512x512 | RLE |
参数会随源图分辨率和设备不同而变化,不是固定公式。重点是理解图块尺寸越小,单次解码内存越低,但索引条目越多,打开和滚动时计算量越大;图块越大则相反。这个平衡在下一章的转换环节还会展开。
多说一句为什么要守这套老方案:在线地图在山区、林场这些地方经常没有信号,商业图源在特定比例尺下的道路和小径更新并不及时。OziExplorer 生态里积累了大量地方测绘或个人校准过的历史图资,这些图用 Androzic 在 Android 上继续用,等于把过去的测量成果无缝带到手机上。这也是我至今没放弃这套方案的原因。
3. 地图转换:把原始影像变成 Androzic 能认的格式
3.1 从 tif/jpg 导出 ozf2/ozfx3 的常规步骤
先把话说清楚:Androzic 本身不做转换,它是地图的消费者。制作 ozf2、ozfx3 和 .map 的常见做法是用 OziExplorer 打开地图文件,在软件里执行导出操作,这个过程是图形界面的,没有命令行可走。OziExplorer 会先用 .map 里的校准信息把图片配准,再按你选择的格式和压缩参数重新编码输出。
一个完整的制作流程我通常这么走。第一步,准备源图和对应的 .map 文件,二者放同一目录、同名。第二步,在 OziExplorer 中打开地图,此时如果源图有投影信息,软件会自动读取;如果只有像素图和手工校准点,它会基于校准点做仿射配准。第三步,打开导出地图图像的功能,选择输出目录、文件名、目标格式 ozf2 或 ozfx3。第四步,设置分块大小、压缩质量、是否跳过空白区域,点击导出。第五步,把生成的 ozf2/ozfx3 连同原 .map 一起拷到 Android 设备。
转换前做一次文件核对很有必要,命令如下:
# 转换前的文件核对(配合 OziExplorer 的导出操作使用) ls -lh 林场_地形图.tif 林场_地形图.map # 确认两个文件在同目录且同名,再建输出目录 mkdir -p output_ozfx3/这一步的坑很常见:有人只拷了 .ozfx3,忘记拷贝同名的 .map,结果 Androzic 里能看到文件列表,但地图打开就报校准信息缺失。记住一个原则,转换生成的图像文件和原 .map 永远是一对,拷贝时别拆散。
如果手里没有 OziExplorer,也有别的影像处理工具能完成类似工作,但那些工具大多只能输出带地理信息的 tif,不能直接生成 ozfx3。我的建议是别绕路,直接按这个软件的流程做,因为它输出的 .map 文件格式和 Androzic 的解析逻辑是匹配的,绕路的代价最后还是花在调格式上。
3.2 转换参数怎么设:分块、压缩与空白裁剪
导出参数里最影响运行体验的是分块大小和压缩方式。分块大小决定了 Androzic 单次解码的粒度。以我自己常用的设置为例:
分块尺寸:512x512(默认保守,适配多数 Android 设备) 压缩方式:无损(等高线)/ 中等有损(卫星影像) 空白裁剪:开启,自动跳过图像边缘的纯色区域分块尺寸的选择逻辑:对一台内存 3GB、屏幕 1080p 的设备,1024x1024 的分块在大部分场景没问题;但如果地图本身是几万像素的超长宽图,滚动时并行的解码任务会把内存打满,出现闪退。我的习惯是图幅超过 20000x20000 像素就退回 512x512。压缩方式方面,等高线、地物边界这类靠线条表达的地图别用有损;影像图可以接受有损,因为传感器噪声本来就在。
有个参数容易被忽略:地图投影与基准面。导出时 OziExplorer 会把你选择的坐标系统写进 .map,这个值会直接影响后来手机定位的落点。如果你源图是地方坐标系,建议在导出前先重投影到 WGS84 经纬度,不要试图让 Androzic 去做坐标系换算,Android 端对地方坐标系的支持非常有限,硬上很容易出现整体偏移。
导出完成后的检查清单我也固定下来:一是看生成文件的体积是否和源图匹配,明显异常小说明转换中途中断了;二是用 OziExplorer 重新打开生成的 ozf2/ozfx3,能正常显示才算通过;三是对比 .map 里的尺寸字段和源图尺寸,防止图幅被截断。这三项检查用不了两分钟,能省掉户外白跑一趟的麻烦。
批量转换时要控制节奏。几十张图一次性丢进去跑,如果中间某张图坐标异常,任务会中断,前面的成果也跟着受影响。我一般一次只导 5 张,导完抽查一张,确认地图边界和校准点都正常再继续下一批。
3.3 没有 .map 文件时的补救:手工校准
拿到一张老扫描图,没有配套 .map,想做成 Androzic 能用的离线地图,也不是完全没救。常见做法是在 OziExplorer 里增加校准点:找一个有明显地标的位置,比如道路交叉口、独栋建筑角点,分别在地图上点选并输入图上标注的坐标,至少三个点覆盖图幅的角落和中心,然后保存为新 .map。这个过程不建议少于 5 个点,因为扫描图纸变形大,点数太少,边缘区域会歪得很明显。
手工校准要特别小心坐标系统一:地图上的坐标如果是经纬度就用经纬度,如果图上标注的是公里网坐标,要先确认投影带。吃过一次亏之后,我的习惯是保存前把所有点的原始坐标记录到文本里,一旦后期发现偏移,直接用这些原始值重新生成 .map,不用再点一遍。校准之后输出目标格式,流程和 3.1 节一致。
提示:手工校准的地图在户外验证时,优先用交叉路口、桥梁这类线性地物做目视确认,别用人名地名类标注点,文字标注在扫描图里往往本来就是偏的。
做手工校准前,先确认这张图值不值得救。如果图幅边缘已经皱褶、扫描比例失真严重,校准后也只是“能用”而不是“好用”,这种情况下我宁愿找一张同区域的新图源重新配准,不在烂图上反复折腾。
4. Android 端落地:安装、目录规划与首次加载
4.1 地图文件放哪里:目录结构、命名规则
Androzic 读取地图不是靠系统扫描全部存储,它有自己的地图目录约定和文件选择界面。常见做法是把地图放在内部存储的 /Androzic/maps 目录下,也有版本支持自定义地图目录。首次使用前建议先建好目录结构:
# 在 Android 设备上创建 Androzic 地图目录 mkdir -p /storage/emulated/0/Androzic/maps mkdir -p /storage/emulated/0/Androzic/routes mkdir -p /storage/emulated/0/Androzic/tracks这三个目录分别放地图、航线和航迹,事先分好类,等地图数量多起来你就知道这个习惯的价值了。地图文件命名有个容易被忽视的约束:.ozfx3 或 .ozf2 必须与 .map 同名,且放在同一目录。比如某林场地形图的完整文件应该是 林场地形图.map 与 林场地形图.ozfx3。如果文件名里带中文空格或者特殊符号,个别旧版 Android 文件管理器和解析库会出现读取异常,我一般用拼音或英文短名,避免玄学问题。
文件传输也有讲究。大几 GB 的 ozfx3 走 USB 拷贝过程中容易中断,拷完先校验文件大小再拔线,这算血泪经验,丢过一次完整地图才知道难受。有条件就走局域网传输,传输完成后对比两边文件大小一致再断开连接。
4.2 首次加载与校准检查
把地图文件放进目录后,打开 Androzic,进入地图加载界面,选择对应文件。加载成功后先别急着去户外,我习惯先做三个检查。第一,屏幕上地图是否能按预期比例尺显示,缩小放大是否流畅。第二,开启内置网格显示,观察地图边缘和网格线是否对齐,如果边缘歪斜,说明 .map 的仿射参数和地图像素不匹配。第三,在已知坐标的位置模拟定位,看十字光标是否落在图上正确位置。
如果地图打开一片空白或者只显示网格背景,常见原因有两个:文件没有正确配对,或者格式解析失败。优先检查 .map 和图像文件是否同名同目录;如果文件配对正确,再考虑把 .ozfx3 用转换工具另存为 .ozf2 试试,这一步能确认问题出在解析端还是文件端。
注意:Android 11 之后存储权限收紧,Androzic 如果读不到 /Androzic/maps 里的文件,去应用设置里确认文件访问权限是否已授予。这个问题常见,但排查起来快,别一上来就重装应用。
首次加载建议在室内先把地图浏览一遍,确认方向和比例尺。地图旋转后建议打开“地图随航向旋转”选项,不然屏幕朝向和地图朝向不一致时,在复杂地形里特别容易看反方向。
4.3 GPS 与导航设置:让地图跟着人走
地图加载正常后,把 GPS 设置项过一遍。我一般会把位置精度阈值调到 10 米以内,低于这个精度的定位点不参与航迹记录,避免在城市峡谷或者树荫下走出大量野点。Androzic 的定位信息会显示当前卫星数和水平精度,这个数字可以作为是否开始记录航迹的参考。
正式出发前做一次“静止校准”:人站在已知地标上,等 GPS 精度数值稳定下来,看地图上的十字光标偏离多远。如果偏了几十米而精度显示只有 3 米,那几乎可以断定是地图校准或坐标系问题,不是信号问题,这时候回转换环节修,不要试图在手机上硬调。
航迹记录界面里还有个“记录间隔”选项,按时间和按距离触发两种模式。徒步场景我习惯按距离触发,每 10 米记一个点,轨迹平滑又不至于数据量太大;车载场景改成按时间触发,每 5 秒一个点。这个参数没有标准答案,但会影响航迹文件的大小和后续在桌面端分析时的平滑度。
地图文件多了之后,按区域建子目录管理。比如同一个省内分东区和西区两个目录,文件列表会按目录名显示,野外切图时不用在一堆文件名里翻。目录名用能看懂的区域简称,别用日期,因为日期无法表达地理位置。
5. Androzic 使用避坑:加载失败、偏移与卡顿排查
5.1 ozfx3 文件加载后白屏黑块
现象:Androzic 能识别文件,但打开后大面积为空白或出现黑色块状区域。
原因:ozfx3 的图块索引偏移计算方式和某些转换工具的默认分块设置不兼容。尤其是分块尺寸不等于 2 的幂时,解析端的偏移表计算会错位,图块拿不到正确位置就显示成空白或黑块。
解决:把图块尺寸改回 512x512 或 1024x1024 重新导出,优先 512x512。如果重导仍白屏,改为导出 ozf2,这是兼容性最稳的格式。排查时先确认文件大小正常,再确认分块参数,不要反复卸载重装应用,问题根本不在应用端。
5.2 地图显示整体偏移
现象:十字光标落在图上某条路的旁边,实际人站在离路几十米外的空地;或者图上地物整体往同一个方向移动。
原因:.map 中的投影或基准面与 GPS 接收的 WGS84 坐标不一致。校准阶段把地方坐标系当作经纬度直投保存,GPS 坐标按 WGS84 换算后自然整体平移。
解决:在转换环节把源图重投影到 WGS84 经纬度并重新生成 .map。不要试图在应用里硬调偏移量,那只能救局部,救不了图幅边缘区域。这个坑最容易出现在手工校准的老图上,校准点用的坐标系和 GPS 实际用的坐标系不是一回事,后面所有的偏移都是从这里开始的。
5.3 打开大图卡顿甚至闪退
现象:两万像素量级的大图,地图打开后拖动有明显掉帧,点击缩放时应用直接退出。
原因:单张图的分块尺寸太大,解码时单块数据量高;加上地图滚动会同时解码相邻多块,内存峰值瞬间顶满。低内存设备上更明显,有时连续缩放几下就崩了。
解决:在转换工具里把分块调成 512x512,压缩方式从无损改为中等有损,图像尺寸不变但单块解码压力骤减。如果还闪退,把这张大图拆分成多个小图,按区域分别校准,使用时只加载当前区域。拆分虽然多了几步操作,但能换来稳定的滚动体验,值得。
5.4 航迹漂在道路一侧
现象:GPS 和地图各自看着都对,但记录的航迹始终平行偏移,沿路走却落在路一侧。
原因:混合使用了两套校准体系的地图。比如一个区域内有一张手工校准图和一张标准投影图,两套 .map 的投影参数不一致,切换地图时航迹自然跳变。航迹本身是连续的,地图换了基准,看起来就像漂移。
解决:把同一个工作区的地图统一到同一投影基准。先确认每一张图的 .map 投影段内容一致,不一致的图重做校准,不要混用。这个问题的隐蔽之处在于单张图看都正常,只有跨图使用时才暴露,所以我在新区域开工前会统一检查一遍所有地图的投影段文本。
6. 进阶:航迹管理、路点规划与地图精度验证习惯
航迹和路点管理是 Androzic 比单纯看图更值钱的地方。每次外业结束,我习惯把当天的航迹导出为 GPX 格式,存到按日期命名的目录,和电脑端 OziExplorer 互相倒腾很方便。路点记录也别忽略:在关键位置打点,标注过桥、岔路、补水点,导出时带上类别字段,回到桌面端就能直接进项目管理流程。
日常使用中我最看重的还是那张“精度验证清单”。拿到新地图、新设备或者换新手机,出发前花五分钟做三个验证:找一处已知坐标的地标,对比十字光标和实际站立位置;沿一条笔直道路走一百米,看航迹是否和道路平行;在地图边缘区域再验证一次,确认没有整体偏移。误差在 10 米以内才把它当导航图用,超过这个数就回到转换环节修校准,不在手机上硬调。
做过几次偏移事故之后,我的习惯固定下来了:转换用的源图长期保留,转换参数记在本子上,每次户外前做一次静态验证。这套流程不复杂,但能避开白天迷路、晚上找路的尴尬,也让我敢在陌生区域信任手机导航。希望帮到你。
本文还有配套的精品资源,点击获取