source: subversion/utils/gpx-addbounds @ 2517

Last change on this file since 2517 was 243, checked in by pere, 15 years ago

New script to add bounds info into gpx files.

  • Property svn:executable set to *
File size: 1.9 KB
Line 
1#!/usr/bin/perl
2#
3# Author:  Petter Reinholdtsen
4# Date:    2005-03-23
5# License: GPL
6#
7# Parse a GPX file, and add lat/lon bounding information into the meta
8# header.
9
10use strict;
11use warnings;
12use XML::Parser;
13use vars qw($minlat $maxlat $minlon $maxlon);
14
15my $parser = new XML::Parser(Handlers => {Start => \&handle_start});
16
17for my $gpxfile (@ARGV) {
18    # Make sure to zero out the values for each file
19    undef $minlat; undef $maxlat; undef $minlon; undef $maxlon;
20
21    $parser->parsefile($gpxfile);
22    insert_bounds($gpxfile);
23}
24
25sub update_minmax {
26    my ($lat, $lon)  = @_;
27    $minlat = $lat if ! defined $minlat;
28    $maxlat = $lat if ! defined $maxlat;
29    $minlon = $lon if ! defined $minlon;
30    $maxlon = $lon if ! defined $maxlon;
31
32    $minlat = $lat if $lat < $minlat;
33    $maxlat = $lat if $lat > $maxlat;
34    $minlon = $lon if $lon < $minlon;
35    $maxlon = $lon if $lon > $maxlon;
36}
37
38sub handle_start {
39    my ($expat, $element, %attr) = @_;
40    if ("trkpt" eq $element || "wpt" eq $element) {
41        update_minmax($attr{'lat'}, $attr{'lon'});
42    }
43}
44
45#
46# Insert the calculated bounds into the GPX file.  Should be rewritten
47# to understand XML, instead of faking it by assuming the tags are on
48# separate lines.
49#
50sub insert_bounds {
51    my ($gpxfile) = @_;
52    open(OLD, "< $gpxfile") or die "Unable to read from $gpxfile";
53    open(NEW, "> $gpxfile.new") or die "Unable to write to $gpxfile.new";
54    my $inserted = 0;
55    while (<OLD>) {
56        if (!$inserted && m%^(.*)<bounds [^>]*>(.*)$%) {
57            $inserted = 1;
58            $_ = "$1<bounds minlat=\"$minlat\" minlon=\"$minlon\" maxlat=\"$maxlat\" maxlon=\"$maxlon\"/>$2\n";
59        }
60        if (!$inserted && m%^(.*)(</metadata>.*)$%i) {
61            $inserted = 1;
62            $_ = "$1<bounds minlat=\"$minlat\" minlon=\"$minlon\" maxlat=\"$maxlat\" maxlon=\"$maxlon\"/>\n$2\n";
63        }
64        print NEW or die "Unable to write";
65    }
66    close(NEW) or die "Unable to write";
67    close(OLD);
68    rename "$gpxfile.new","$gpxfile";
69}
Note: See TracBrowser for help on using the repository browser.