使用Ruby绘制GPS信息

5
我正在寻找以编程方式将我的GPS日志转换为图像的方法,并希望在Ruby中完成...如果这是一种可接受的工具。我完全没有GIS背景,但作为程序员,我认为这是一个有趣的问题。
到目前为止,我想到了以下解决方案。首先,您需要某种类型的绘图库。我选择了gnuplot,因为我找到了一个Ruby binding,但R最近很流行。我创建了一个小脚本,将GPX文件转换并将数据提供给gnuplot,得出了像这样的结果:alt text http://dl.dropbox.com/u/45672/gpslog.png 这看起来不错,但gnuplot似乎只是一个用于创建图形而不是空间数据的工具。这是正确的方法还是有更好的解决方案可用?

这里有另一个示例,你有想法如何构建类似的东西吗?


GPS日志长什么样?你有经纬度信息吗? - Mark Thomas
我正在使用GPX文件,所以它们包含纬度/经度信息。我想你可以在绘图之前将文件转换为另一种格式。 - Cimm
6个回答

4

第一个问题的答案

由于你说过“如果可以的话,我想用Ruby来完成这个任务...”,因此我假设你可能会接受非Ruby解决方案,只要它符合你的其他要求。

我建议使用Python,主要是因为在Beginning Python Visualization的第一章中,作者Shai Vaingast通过读取GPS接收器的GPS数据并绘制结果的示例进行了说明。如果你愿意尝试基于Python的解决方案,这本书将是一个很好的资源。

以下是用于读取和绘制GPS数据的Python软件包:

  • pySerial:从串行端口读取GPS数据
  • matplotlib:用于绘制数据。“matplotlib是一个用于在Python中制作2D数组图的库。虽然它起源于模拟MATLAB®图形命令,但它独立于MATLAB,并且可以以Pythonic、面向对象的方式使用。”

以下是Shai Vaingast创建的一个示例图,展示了matplotlib绘制GPS数据的不同能力。

alt text

如果你不想使用Python,而更喜欢Ruby——无论出于何种原因——我理解。我试图寻找与matplotlib相当的Ruby库,但我没有找到相应的软件包。

最后一个问题的答案

这里有另一个例子,你知道如何创建这样的东西吗?

从右下角看,似乎使用了DISLIN来创建该图像。虽然DISLIN可用于许多编程语言,但DISLIN软件要求页面并未显示支持Ruby。

alt text

根据DISLIN网站上的信息,

DISLIN是一个高级绘图库,可将数据显示为曲线、极坐标图、条形图、饼图、3D彩色图、曲面、等高线和地图。该软件可在UNIX、Linux、FreeBSD、OpenVMS、Windows、Mac OSX和MS-DOS等多个操作系统上使用,并支持多种C、Fortran 77和Fortran 90/95编译器。DISLIN程序非常独立于系统,可以在不进行任何更改的情况下从一个操作系统移植到另一个操作系统。对于某些操作系统,DISLIN还支持Perl、Python、Java和C/C++解释器Ch等编程语言。所有支持的操作系统都可以使用DISLIN解释器DISGCL。请参阅支持的操作系统和编译器的完整列表。

1

谢谢Daryn,但是是的,我确实想要图片。我不喜欢使用Google地图,因为我不喜欢限制(例如,您无法删除标志或版权信息),而且我想学习自己绘制这些东西,那就是目标。 - Cimm

1

我认为从任何编程语言使用gnuplot是一个很好的起点。

然而,我强烈建议在您的代码中添加set size ratio -1 gnuplot命令,因为这将使绘图中的x和y轴比例尺相等,这非常重要。

您还可以通过在时间上等间隔地增加非常小的点标记(假设您的数据中有时间信息,或者至少知道行是以规则的时间间隔采样的),以便感受到运动的速度,否则就会丢失(即,线上间距较大的点标记表示移动更快)。显然,您应该选择一个使它们适当间隔的时间间隔,或者自动计算这样的时间间隔:即通过计算曲线的长度,将其转换为像素单位,并除以10到100之间的任何值,以获得您想要放置的总点数。然后,时间间隔由轨迹的总时间除以该点数给出。对于相当规则的运动,这应该能够稳健地工作。

另一个选择是使用不同于gnuplot的图表系统,它功能强大但有点过时。我所知道的选项包括:

  • Gruff,适用于Ruby,但似乎缺少2D绘图功能(这是一个明显的要求)。
  • XML/SWF Charts,功能强大且灵活,但是商业化。在这种情况下,您可以使用Ruby或任何其他编程语言生成一个XML文件,然后将其解释为交互式图形。
  • Google Chart API,可以通过您的代码中的适当GET或POST请求返回图表图像。在这种情况下,您可能对lxy图表类型感兴趣,可能与scatter图表结合使用以进行点标记。

第三个选项似乎最有趣。


谢谢,这是迄今为止最完整的答案。对我来说,第一和第二个选项都不可行(因为你列出的原因),所以只剩下 Google 图表了。可悲的是,Google 图表仍然不能给我想要的灵活性。例如,Google 图表无法完成以下任务:http://www.lvzc.be/charronline/igc/2010/1095ljd71.png - Cimm
你说得对,我以为使用谷歌图表可以制作包括地图和xy线的复合图表,但显然不行。真遗憾!不过,我相信可以使用某种位图背景或使用不同的线来表示地图本身来完成它。 我看到在另一个评论中提到的DISLIN是一个我不知道的有趣选择。 我还想添加Matlab Mapping Toolbox,这可能是最强大和灵活的选项之一,但是商业化且可能非常昂贵。 - Lale

1

GDAL是非常受欢迎的开源GIS工具包,它有Ruby绑定。如果你想要地图数据,开放街道地图非常有用。将OSM和GPS进行组合绘图将会得到非常好的结果。GDAL/OGR Api 教程在这里。


0

谢谢Michael,我会看看R。有没有适合GIS新手的教程? - Cimm

0

也许你已经听说过Processing,但你听说过Ruby-Processing吗?

来自Ruby-Processing的自述:

Ruby-Processing是一个用于Processing代码艺术框架的Ruby封装。

如果你认为与Ruby共度美好的下午是一件愉快的事情,或者你有进入代码艺术这个快节奏而又不完全残酷的世界的雄心壮志,那么Ruby-Processing可能是你应该尝试的东西。

Processing是由MIT开发的一个框架,用于制作小型代码艺术品、动画、可视化等,最初由Ben Fry和Casey Reas开发,得到了一支小型开源贡献者团队的支持。
Processing已成为视觉导向编程的一种标准,强烈影响了Nodebox、Shoes、Arduino和其他类似项目的设计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接