我是linux/python的新用户,有.gpx文件(从GPS跟踪软件生成的输出文件),需要将值提取到csv/txt中,以便在地理信息系统程序中使用。我已经在我刚开始的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>发布于 2016-06-19 04:20:18
您可以安装GPXpy
sudo pip install gpxpy然后使用这个库:
import gpxpy
import gpxpy.gpx
gpx_file = open('input_file.gpx', 'r')
gpx = gpxpy.parse(gpx_file) \
for track in gpx.tracks:
for segment in track.segments:
for point in segment.points:
print 'Point at ({0},{1}) -> {2}'.format(point.latitude, point.longitude, point.elevation)
for waypoint in gpx.waypoints:
print 'waypoint {0} -> ({1},{2})'.format(waypoint.name, waypoint.latitude, waypoint.longitude)
for route in gpx.routes:
print 'Route:' 有关更多信息,请访问:https://pypi.python.org/pypi/gpxpy
问候
发布于 2012-06-20 00:54:24
因此,使用lxml之类的拟合模块或包含的ElementTree XML API来解析数据,然后使用GPX is an XML format csv module输出到CSV。
涵盖以下概念的教程:
我还发现了一个名为gpxpy的python GPX解析库,它可能为GPX文件中包含的数据提供了更高级别的接口。
发布于 2012-06-20 05:18:56
因为Martijn发布了一个Python答案,并说Perl将转向线路噪声,所以我觉得也需要一个Perl答案。
在Perl模块目录CPAN上,有一个名为Geo::Gpx的模块。正如Martijn已经说过的,GPX是一种XML格式。但幸运的是,有人已经把它变成了一个模块,为我们处理解析。我们所要做的就是加载这个模块。
有几个模块可用于CSV处理,但此XML文件中的数据相当简单,因此我们并不真正需要一个。我们可以使用内置的功能自行完成。
请考虑以下脚本。我马上给你一个解释。
use strict;
use warnings;
use Geo::Gpx;
use DateTime;
# Open the GPX file
open my $fh_in, '<', 'fells_loop.gpx';
# Parse GPX
my $gpx = Geo::Gpx->new( input => $fh_in );
# Close the GPX file
close $fh_in;
# Open an output file
open my $fh_out, '>', 'fells_loop.csv';
# Print the header line to the file
print $fh_out "time,lat,lon,ele,name,sym,type,desc\n";
# The waypoints-method of the GEO::GPX-Object returns an array-ref
# which we can iterate in a foreach loop
foreach my $wp ( @{ $gpx->waypoints() } ) {
# Some fields seem to be optional so they are missing in the hash.
# We have to add an empty string by iterating over all the possible
# hash keys to put '' in them.
$wp->{$_} ||= '' for qw( time lat lon ele name sym type desc );
# The time is a unix timestamp, which is hard to read.
# We can make it an ISO8601 date with the DateTime module.
# We only do it if there already is a time, though.
if ($wp->{'time'}) {
$wp->{'time'} = DateTime->from_epoch( epoch => $wp->{'time'} )
->iso8601();
}
# Join the fields with a comma and print them to the output file
print $fh_out join(',', (
$wp->{'time'},
$wp->{'lat'},
$wp->{'lon'},
$wp->{'ele'},
$wp->{'name'},
$wp->{'sym'},
$wp->{'type'},
$wp->{'desc'},
)), "\n"; # Add a newline at the end
}
# Close the output file
close $fh_out;让我们一步一步来看:
我们使用的模块是
use strict和use warnings,它们执行诸如声明变量之类的规则,并告诉您最难find.use Geo::Gpx和use DateTime的常见错误。Geo::Gpx将为我们处理解析。我们需要DateTime将unix时间戳转换成可读的日期和时间。open函数打开一个文件。$fh_in是保存文件句柄的变量。我们要读取的GPX文件是我从topografix.com借来的fells_loop.gpx。您可以在perlopentut.open的更多信息,创建一个名为$gpx的新Geo::Gpx对象,并使用我们的文件句柄$fh_in告诉它从何处读取$gpx数据。所有具有面向对象的interface.close的Perl模块都提供了文件句柄关闭filehandle.open有一个>来告诉Perl我们想要写这个print到一个文件句柄,把它作为print的第一个参数。请注意,文件句柄后面没有逗号。\n是一个换行符,foreach loop接受Geo::Gpx对象的waypoints-method的返回值。该值是数组引用。可以将其视为包含数组的数组(如果您想了解更多关于引用的信息,请参阅perlref )。在循环的每次迭代中,数组ref的下一个元素(表示GPX数据中的路点)将被放入$wp。如果使用Data::Dumper打印,则如下所示:$VAR1 ={ 'ele‘=> '64.008000','lat’=> '42.455956','time‘=> 991452424,'name’=> 'SOAPBOX','sym‘=> 'Cemetery','desc’=> 'Soap Box Derby Track','lon‘=> '-71.107483','type’=> 'Intersection‘};
for有点棘手。正如我们刚刚看到的,hashref中有8个键。不幸的是,它们中的一些有时会丢失。因为我们有use warnings,所以如果我们试图访问这些缺失值中的一个,我们将得到一个警告。我们必须创建这些键并在其中放入一个空字符串''。foreach和for在Perl语言中完全可以互换,也可以在单个表达式后面的后缀语法中使用。我们使用qw-operator来创建for将迭代的列表。qw是quoted words的缩写,它就是这样做的:它返回其中的字符串列表,但被引用。我们也可以说('time', 'lat', 'long'... )。
在表达式中,我们访问$wp的每个键。$_是循环变量。在第一次迭代中,它将保存“time”,然后是“lat”,依此类推。因为$wp是一个hashref,所以我们需要->来访问它的密钥。大括号告诉我们它是一个hashref。
from_epoch方法以参数的形式获取unix时间戳。它返回一个DateTime对象,我们可以直接使用该对象来调用它的iso8601函数。这被称为链式。有些模块可以做到这一点。它类似于jQuery的JavaScript对象的作用。我们的hashref中的unix时间戳被替换为我们再次print到文件句柄的DateTime operation.
join用于将逗号放在值之间。我们还再次在末尾添加了一个换行符。循环完成后,我们将完成filehandle.
总而言之,我想说这很简单,也很容易阅读,不是吗?我试图使它成为过度冗长的语法和_Perl_ish风格的健康组合。
https://stackoverflow.com/questions/11105663
复制相似问题