我是一个新的linux/python用户,有.gpx文件(由GPS跟踪软件生成的输出文件),需要将值提取到csv/txt中,以便在GIS程序中使用。我已经在我的python开始的书,这个网站,和在线上查找了字符串和切片等。我使用了一个.gpx到.txt的转换器,可以将经度和纬度提取到一个文本文件中。我需要提取高程数据。文件顶部有六行文本,我只知道如何在emacs中打开这个文件(除了上传到网站上),这里是从第7行开始的文件。
最理想的情况是,我想知道如何通过python(或Perl)将所有值提取到csv或txt文件中。如果有人知道一个网站教程或一个样本脚本将不胜感激。
<metadata>
<time>2012-06-13T01:51:08Z</time>
</metadata>
<trk>
<name>Track 2012-06-12 19:51</name>
<trkseg>
<trkpt lat="43.49670697" lon="-112.03380961">
<ele>1403.0</ele>
<time>2012-06-13T01:53:44Z</time>
<extensions>
<ogt10:accuracy>34.0</ogt10:accuracy></extensions>
</trkpt>
<trkpt lat="43.49796612" lon="-112.03970968">
<ele>1410.9000244140625</ele>
<time>2012-06-13T01:57:10Z</time>
<extensions>
<gpx10:speed>3.75</gpx10:speed>
<ogt10:accuracy>13.0</ogt10:accuracy>
<gpx10:course>293.20001220703125</gpx10:course></extensions>
</trkpt>
<trkpt lat="43.49450857" lon="-112.04477274">
<ele>1406.5</ele>
<time>2012-06-13T02:02:24Z</time>
<extensions>
<ogt10:accuracy>12.0</ogt10:accuracy></extensions>
</trkpt>
</trkseg>
<trkseg>
<trkpt lat="43.49451057" lon="-112.04480354">
<ele>1398.9000244140625</ele>
<time>2012-06-13T02:54:55Z</time>
<extensions>
<ogt10:accuracy>10.0</ogt10:accuracy></extensions>
</trkpt>
<trkpt lat="43.49464813" lon="-112.04472215">
<ele>1414.9000244140625</ele>
<time>2012-06-13T02:56:06Z</time>
<extensions>
<ogt10:accuracy>7.0</ogt10:accuracy></extensions>
</trkpt>
<trkpt lat="43.49432573" lon="-112.04489684">
<ele>1410.9000244140625</ele>
<time>2012-06-13T02:57:27Z</time>
<extensions>
<gpx10:speed>3.288236618041992</gpx10:speed>
<ogt10:accuracy>21.0</ogt10:accuracy>
<gpx10:course>196.1999969482422</gpx10:course></extensions>
</trkpt>
<trkpt lat="43.49397445" lon="-112.04505216">
<ele>1421.699951171875</ele>
<time>2012-06-13T02:57:30Z</time>
<extensions>
<gpx10:speed>3.0</gpx10:speed>
<ogt10:accuracy>17.0</ogt10:accuracy>
<gpx10:course>192.89999389648438</gpx10:course></extensions>
</trkpt>
<trkpt lat="43.49428702" lon="-112.04265923">
<ele>1433.0</ele>
<time>2012-06-13T02:58:46Z</time>
<extensions>
<gpx10:speed>4.5</gpx10:speed>
<ogt10:accuracy>18.0</ogt10:accuracy>
<gpx10:course>32.400001525878906</gpx10:course></extensions>
</trkpt>
<trkpt lat="43.49444603" lon="-112.04263691">
<ele>1430.199951171875</ele>
<time>2012-06-13T02:58:50Z</time>
<extensions>
<gpx10:speed>4.5</gpx10:speed>
<ogt10:accuracy>11.0</ogt10:accuracy>
<gpx10:course>29.299999237060547</gpx10:course></extensions>
</trkpt>
<trkpt lat="43.49456961" lon="-112.04260058">
<ele>1430.4000244140625</ele>
<time>2012-06-13T02:58:52Z</time>
<extensions>
<gpx10:speed>4.5</gpx10:speed>
<ogt10:accuracy>8.0</ogt10:accuracy>
<gpx10:course>28.600000381469727</gpx10:course></extensions>
</trkpt>
<trkpt lat="43.49570131" lon="-112.04001132">
<ele>1418.199951171875</ele>
<time>2012-06-13T03:00:08Z</time>
<extensions>
你可以安装GPXpy
那就用图书馆吧:
更多信息:https://pypi.python.org/pypi/gpxpy
问候
GPX is an XML format,所以使用合适的模块,如lxml或包含的ElementTree XML API来解析数据,然后使用python ^{} module 输出到CSV。
涵盖这些概念的教程:
我还发现了一个名为gpxpy的python GPX解析库,它可能为GPX文件中包含的数据提供了一个更高级的接口。
由于Martijn发布了一个Python答案,并说Perl会变成行噪声,我觉得也需要Perl答案。
在Perl模块目录CPAN上,有一个名为Geo::Gpx的模块。正如Martijn所说,GPX是一种XML格式。但幸运的是,有人已经将它制作成一个模块,为我们处理解析。我们要做的就是加载那个模块。
有几个模块可用于CSV处理,但是这个XML文件中的数据相当简单,因此我们不需要一个。我们可以通过内置的功能自己完成。
请考虑以下脚本。我马上解释。
让我们分步骤进行:
use Geo::Gpx
和use DateTime
是我们使用的模块。Geo::Gpx
将为我们处理解析。我们需要DateTime
将unix时间戳转换为可读的日期和时间。$fh_in
是保存文件句柄的变量。我们要读取的GPX文件是fellsúloop.GPX我冒昧地从topografix.com借用了这个文件。您可以在perlopentut中找到有关open
的更多信息。$gpx
的新Geo::Gpx
对象,并使用filehandle$fh_in
告诉它从哪里读取XML数据。new
方法由具有面向对象接口的所有Perl模块提供。open
有一个>
来告诉Perl我们要写入这个文件句柄。print
文件句柄。注意,文件句柄后面没有逗号。\n
是换行符。^{} loop 接受} 打印,则如下所示:
Geo::Gpx
对象的waypoints
-方法的返回值。此值是数组引用。把它看作一个保存数组的数组(如果您想了解更多关于引用的信息,请参见perlref)。在循环的每次迭代中,数组ref的下一个元素(表示GPX数据中的一个航路点)将被放入$wp
。如果用^{现在后缀^{} 有点棘手。正如我们刚才看到的,hashref中有8个键。不幸的是,他们中的一些人有时失踪了。因为我们有
use warnings
,所以如果我们试图访问这些丢失的值之一,就会收到警告。我们必须创建这些键并在其中放置一个空字符串''
。在Perl中,} 是带引号的单词的缩写,它就是这样做的:它返回字符串列表,但带引号。我们也可以说
foreach
和for
是完全可互换的,而且这两种语言也可以在单个表达式后面的postfix语法中使用。我们使用qw
-操作符创建for
将迭代的列表。^{('time', 'lat', 'long'... )
。在表达式中,我们访问} operator 才为它赋值。
$wp
的每个键。$_
是循环变量。在第一次迭代中,它将保存“time”,然后保存“lat”等等。由于$wp
是hashref,我们需要->
来访问它的键。大括号表示它是hashref。只有当hash ref元素不是真值时,^{现在,如果有一个时间值(如果没有设置日期,我们刚刚分配的空字符串将被视为“没有”),我们将用正确的日期替换unix时间戳。DateTime帮助我们做到这一点。
from_epoch
方法获取unix时间戳作为参数。它返回一个DateTime
对象,我们可以直接使用它调用iso8601
函数。这叫做链锁。一些模块可以做到这一点。它类似于jQuery的JavaScript对象。hashref中的unix时间戳替换为
DateTime
操作的结果。print
到我们的文件句柄。^{close
文件句柄。总而言之,我觉得这很简单,也很可读,不是吗?我试图使它成为一个健康的混合体,包含了过于冗长的语法和带有Perl风格的语法。
相关问题 更多 >
编程相关推荐