在少数派及周围好友的案例后,我疯狂地迷上了「世界迷雾」这款 app,在极其享受「我爱画地图」的快感的同时,这款世界迷雾 app 本身的诸多问题也给我带来了很多苦恼。
But! Geek 生来就是为了折腾。我在不断折腾的过程中积累了许多世界迷雾和许多其他 app 通过 .gpx和 .kml文件配合使用的方法,以此贡献给我深爱的少数派社区。
为什么不直接使用世界迷雾?
- 首先,世界迷雾 app 本身的功能决定了它只能记录你走过的地点,而当想回忆某个时刻你在哪儿时,就得需要其他 app 的协助了;
- 其次,且一直需要在后台记录位置数据,担心电量与隐私的同学可能十分苦恼;
- 然后,在记录的过程中,随时可能出现 GPS 信号中断的情况(比如高铁经过山洞之类),或根本没有 GPS 信号(比如某些型号的高铁列车会屏蔽 GPS 信号,以及坐飞机时座位不在窗边),这时就需要手动补全 & 导入轨迹数据了。
开始之前啰嗦一句,路径导入功能只是给我们提供了一种补全的方式,那么拿它可以「作弊」吗?当然可以啦~
但这样的话,这个 app 的乐趣也就没有了呢(^_-)。
Google Earth 桌面版 - 指哪补哪
人民群众的好朋友 Google 的明星产品 Google Earth 支持直接导出 .kml路径文件(事实上 KML 文件就是 Google Earth 专用的),因此我们可以利用这一点补全 GPS 信号弱时,或手机没电关机时的路径。
(Ps. 少数派的另一篇文章中提到过 GPX Builder 这个 app,然而在实际体验后,此 app 的闪退、绘制不够精确、价格等问题让我觉得,还是免费好用的 Google Earth更加适合我这类「伪强迫症」。)
手动绘制路径
当自动记录的路径出现断点时,我们可以手动画线来解决。(建议配合下文中提到的 Moves Export 导出 .gpx文件后点击 Google Earth 的「工具」——「GPS」,然后选择「从文件导入」,这样会标示出你原来的路径,方便补全断点)。
首先点击工具栏上的「添加路径」按钮(或菜单栏上的「添加」——「路径」),填入一个名称后,将弹出的窗口拖到一边,即可在地图上画线了,一些操作的小技巧有:
- 单击鼠标左键添加一个点
- 使用键盘的方向键或触控板的双指移动可以移动地图
- 使用鼠标滚轮或触控板捏合手势可以移动/缩放地图
你可以随便画出一些奇怪的东西…比如
接下来,在左侧的「我的地点」中右键单击你刚刚创建的路径,选择「将位置另存为…」就可以导出 .kml文件啦(注意选择文件格式)。
导出导航路线
由于某些高铁列车对 GPS 信号有屏蔽,我们无法记录此时的轨迹,这个时候 Google Earth 的导航路线查找功能就派上用场了。
我们点击左侧的「获取路线」,输入你的起点和目的地,再点击左下角的「将当前搜索结果复制到“我的地点”」,再在下方的「位置」——「我的地点」文件夹中展开所搜索导航路线的文件夹(命名可能比较鬼畜…),就会发现刚才搜索的路线已经乖乖躺在这儿了。
但是有的时候导航路径并不唯一,我们可以通过去除各个路径前方的✔来在右侧的地图中隐藏或显示一条路径,这会帮助你选择正确的轨迹。
找到我们的路径后,展开这个文件夹,在其下方找到名为「Route」,右键,点击「将位置另存为…」,即可获得该路径的 .kml文件(依然要注意选择文件格式)。
Flightradar24 + 一些代码 - 补全你飞过的每一个城市
根据 CAAC 的规定,国内航线的飞机,任何手机是不允许开机的,而即使是国际航班,也只有窗边的位置能收到零星的 GPS 信号(况且上飞机就睡觉的我一般都不太愿意把手机一直举在窗边…)。
这个时候,Flightradar24 所提供的航线导出功能就派上用场啦。
我们打开 Flightradar24(需要购买 Pro 账号,可免费试用),在顶端的搜索框中搜索一个航班号,然后展开你的乘机日期,在最下方会有三个按钮,我们点击右侧的「Downloads」,即可获得此次飞行的 .kml文件(是真的飞行轨迹哦)。
然而事情并没有这么简单,再导入到世界迷雾里后,你会发现仅有飞机方向发生改变的点被添加了,实际的轨迹并没有添加成功。
在观察了 Flightradar24 导出的 .kml文件和 Moves Export 导出的 .gpx文件结构后,我决定自己动手 - 丰衣足食 - 写几行代码来搞定这个小事情(^_-)
Hmm…什么语言简单好写,对 XML (KML 和 GPX 本质上都是 XML)友善,运行又不需要安装附加软件呢…就决定是你啦——JavaScript!
// 以下为代码片段,仅保留了核心代码部分GPX += ' <trkseg>\n';if (kmlContent) { for (var i=0; i <kmlContent.length; i++) { c = kmlContent[i].innerHTML; c = c.replace("\n", ""); c = c.replace(/^\s+/, ""); //删除多余的换行符、制表符 s = c.split(" ")[0].split(","); lon[0] = s[0]; lat[0] = s[1]; s = c.split(" ")[1].split(","); lon[1] = s[0]; lat[1] = s[1]; GPX += ' <trkpt lat="'+lat[0]+'" lon="'+lon[0]+'"></trkpt>\n';}GPX += ' <trkpt lat="'+lat[1]+'" lon="'+lon[1]+'"></trkpt>\n'; } GPX += " </trkseg>"; document.getElementById("kml").value = GPX; downloadFile(rName+"_export.gpx",GPX);} else { alert('没有找到点数据');}
嗯好了,提交 .kml文件,得到 .gpx文件,导入一下试试吧…
起飞降落都正常…但是…为什么中间都是单个的点…?
好吧,在世界迷雾的「常见问题」里找到了答案:
我可以手动添加轨迹吗?
是的。你可以使用…………请注意,为了避免导入不够精确的数据,世界迷雾会忽略两个连续 GPS 坐标点之间大于 10 公里的部分轨迹。
对此,飞机表示:怪我飞太快咯
好吧我认输。加上判断距离的代码,如果大于 6 千米,则在其间添加平分点。
if (distance > 6) { x = Math.floor(distance / 6.0) + 1; for (n=0; n<x-1; n++) { latFill = parseFloat(lat[0]) + (parseFloat(lat[1]) - parseFloat(lat[0])) * (n + 1) / x; lonFill = parseFloat(lon[0]) + (parseFloat(lon[1]) - parseFloat(lon[0])) * (n + 1) / x; GPX += ' <trkpt lat="'+latFill+'" lon="'+lonFill+'"></trkpt>\n'; }}GPX += ' <trkpt lat="'+lat[1]+'" lon="'+lon[1]+'"></trkpt>\n';
导出 .gpx,导入世界迷雾——搞定!收工。嗯,完整的代码请点击这里^_^
几个备注:
- Chrome 测试一切正常;
- Safari 貌似不支持
<a>
的download
属性,请将下载得到的文件手动添加.gpx
扩展名; - 部分浏览器出于安全考虑不允许远程网页访问本地文件,因此直接打开此链接的话,可能只能手动复制 KML 代码到输入框里;将 HTML 代码保存到本地再打开后即可使用打开 KML 文件功能;
- 此代码仅针对 Flightradar24 导出的 .kml文件。
Moves - 记录你的每一天 & 导出轨迹至世界迷雾
Moves 的大名,已经不用过多介绍,其玩法也有很多。
借助 Moves,我们可以完整地记录每一天的生活轨迹,而且其支持导出世界迷雾所支持的 .kml或 .gpx路径文件。我们完全可以禁止世界迷雾的后台功能,使用 Moves 记录轨迹数据,再导入到世界迷雾里。
然而在实际体验过后,我发现了两个致命的问题:
- 你欢天喜地地打开 Moves 官网,导出完 .kml或 .gpx数据后,会发现世界迷雾导入始终没法完成;
- Moves 始终会导出所有数据,因此你无法快速找到你想导入的数据,且随着记录时间的增加,无论是 Moves 网站的导出还是世界迷雾的导入都会越…来……越………慢…………
好在国外友人已经为我们提供了完美的解决方案,那就是——Moves Export。网站如其名,专门为导出 Moves 数据而生。
初次打开 Moves Export,需要登陆你的 Google 账号,然后需要在你的 Moves app 里输入一个验证码,就可以链接你的 Moves 账号了。
接下来只需要点击上方的「Your Storylines」,即可轻松导出每一天的 .gpx文件了。此外,Moves Export 还支持每天自动导出至 Dropbox,极其方便。
最后
还希望世界迷雾多多更新呀(^_-)
以及祝自己俄罗斯之行一切顺利
附世界迷雾截图×1