我是一个新的linux/python用户,拥有.gpx文件(从GPS跟踪软件中制作的输出文件),需要将值提取到csv/txt中,以便在GIS程序中使用。我已经在我开始的Python书中查找了字符串和切片etc.,这个网站,和在线。我已经使用了一个。gpx到。txt转换器,可以拉出经度和纬度到一个文本文件。我需要提取高程数据。文件顶部有六行文本,我只知道如何在emacs中打开这个文件(除了上传到网站上)。
最理想的是,我想知道如何通过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>
6条答案
按热度按时间vjhs03f71#
您可以安装GPXpy
然后就使用库:
如需更多信息:https://pypi.python.org/pypi/gpxpy
此致
xiozqbni2#
GPX is an XML format,因此使用lxml或包含的ElementTree XML API等拟合模块解析数据,然后使用python
csv
module输出到CSV。涵盖以下概念的教程:
我还发现了一个名为gpxpy的python GPX解析库,它可能为GPX文件中包含的数据提供了一个更高级的接口。
pvabu6sv3#
由于Martijn发布了一个Python答案,并说Perl将转向行噪声,我觉得也需要一个Perl答案。
在CPAN,Perl模块目录下,有一个模块叫做Geo::Gpx。正如Martijn所说,GPX是一种XML格式。但幸运的是,已经有人把它做成了一个模块,为我们处理解析。我们所要做的就是加载这个模块。
有几个模块可用于CSV处理,但是这个XML文件中的数据相当简单,所以我们并不需要。我们可以使用内置的功能自己处理。
请考虑下面的脚本。我将在一分钟内给予解释。
让我们分几步来看:
use strict
和use warnings
执行声明变量等规则,并告诉您最难发现的常见错误。use Geo::Gpx
和use DateTime
是我们使用的模块。Geo::Gpx
将为我们处理解析。我们需要DateTime
将unix时间戳转换为可读的日期和时间。open
函数打开一个文件。$fh_in
是保存文件句柄的变量。我们要读取的GPX文件是fells_loop.gpx,我冒昧地从topografix.com中借用了这个文件。你可以在perlopentut中找到关于open
的更多信息。Geo::Gpx
对象$gpx
,并使用文件句柄$fh_in
告诉它从哪里读取XML数据。close
会关闭档案控制代码。open
有一个>
,它告诉Perl我们要写入这个文件句柄。print
作为print的第一个参数,把它作为一个文件句柄。注意文件句柄后面没有逗号。\n
是一个换行符。foreach
循环接受Geo::Gpx
对象的waypoints
-方法的返回值。该值是一个数组引用。可以将其视为保存数组的数组(如果你想了解更多关于引用的信息,请参阅perlref)。在循环的每次迭代中,数组ref的下一个元素(表示GPX数据中的一个航点)将被放入$wp
。如果使用Data::Dumper
打印,则如下所示:for
有点棘手。正如我们刚才看到的,hashref中有8个键。不幸的是,其中一些有时会丢失。因为我们有use warnings
,如果我们试图访问这些丢失的值之一,我们会得到一个警告。我们必须创建这些键,并在其中放入一个空字符串''
。foreach
和for
在Perl中是完全可以互换的,并且两者都可以在单个表达式后面的 postfix 语法中使用。我们使用qw
-运算符来创建for
将迭代的列表。qw
是引号中的单词的缩写,它的作用就是:它返回一个字符串列表,但用引号括起来,我们也可以用('time', 'lat', 'long'... )
.在表达式中,我们访问
$wp
的每个键。$_
是循环变量。在第一次迭代中,它将保存“time”,然后保存“lat”,依此类推。由于$wp
是一个hashref,我们需要->
来访问它的键。花括号表示它是一个hashref。||=
运算符只在哈希ref元素不是真值时才给它赋值。from_epoch
方法将unix时间戳作为一个参数。它返回一个DateTime
对象,我们可以直接用它来调用iso8601
函数。这被称为链接,有些模块可以做到,这类似于jQuery的JavaScript对象所做的,我们的hashref中的unix时间戳被替换为
DateTime
操作的结果。print
添加到文件句柄中。join
用于在值之间添加逗号。我们还在末尾添加了一个换行符。close
文件句柄。总而言之,我想说这是相当简单的,也是相当可读的,不是吗?我试图使它成为一个健康的混合过于冗长的语法与一个_Perl_ish风格。
ccrfmcuu4#
每次我尝试这样做的时候,我都会在互联网上搜索解决方案,最后写出我自己的regex解析器。
这会给出一个格式为的数组:
然后你可以用它做任何你想做的事情。
yhxst69z5#
虽然
gpxpy
是python最流行的答案,我自己也找到了这个答案并尝试了一下,但我发现很难(如果不是不可能的话)得到像heartrate这样的扩展类型数据,而且仍然必须循环遍历各种嵌套的xml祖先/子代,所以我编写了gpxcsv。简单如:
对于dataframe,或者存在命令行工具来仅仅创建csv或json文件,在trackpoint中保留它使用标签作为列名找到的尽可能多的列。
项目on github的源代码。
cbeh67ev6#
Geopandas也可以再次依赖GDAL将.gpx文件作为 Dataframe 打开(查看他们的supported vector formats)。由于.gpx是一种XML格式,.gpx也比普通的 Dataframe 更嵌套。这就是为什么你必须定义要打开的层。
要将元数据保存在具有单行的 Dataframe 中(您可能已经将整个轨道存储为线串,因此没有时间戳):
要获取实际轨迹,其中每个轨迹点等于一行,请执行以下操作: