source: subversion/applications/editors/osmpedit/track.pm

Last change on this file was 843, checked in by tpersson, 14 years ago

added eval block for better errorchecking. Submitted by Joerg Ostertag (Joerg Ostertag)

File size: 3.4 KB
Line 
1#    Copyright (C) 2005 Tommy Persson, tpe@ida.liu.se
2#
3#    This program is free software; you can redistribute it and/or modify
4#    it under the terms of the GNU General Public License as published by
5#    the Free Software Foundation; either version 2 of the License, or
6#    (at your option) any later version.
7#
8#    This program is distributed in the hope that it will be useful,
9#    but WITHOUT ANY WARRANTY; without even the implied warranty of
10#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11#    GNU General Public License for more details.
12#
13#    You should have received a copy of the GNU General Public License
14#    along with this program; if not, write to the Free Software
15#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
16
17use Carp qw(confess);
18
19package track;
20
21use FindBin qw($RealBin);
22use lib "$RealBin/../perl";
23
24use trackpoint;
25
26use XML::TokeParser;
27
28use strict;
29
30
31sub new {
32    my $this = shift;
33    my $class = ref($this) || $this;
34    bless {
35        TRACK => [],
36        MAXLAT => -1000000,
37        MINLAT => 1000000,
38        MAXLON => -1000000,
39        MINLON => 1000000,
40        @_
41        }, $class;
42}
43
44sub add_track_point {
45    my $self = shift;
46    my $tp = shift;
47    my $lat = $tp->get_lat ();
48    my $lon = $tp->get_lon ();
49    $self->{MAXLAT} = $lat if ($lat > $self->{MAXLAT});
50    $self->{MINLAT} = $lat if ($lat < $self->{MINLAT});
51    $self->{MAXLON} = $lon if ($lon > $self->{MAXLON});
52    $self->{MINLON} = $lon if ($lon < $self->{MINLON});
53    push @{$self->{TRACK}}, $tp;
54}
55
56sub get_track_points {
57    my $self = shift;
58    return @{$self->{TRACK}};
59}
60
61sub get_center {
62    my $self = shift;
63    return (($self->{MAXLAT}+$self->{MINLAT})/2, 
64            ($self->{MAXLON}+$self->{MINLON})/2);
65}
66
67sub parse_file {
68    my $self = shift;
69    my $filename = shift;
70    print STDERR "Parse track: $filename\n";
71    my $p;
72    eval {
73       $p = XML::TokeParser->new("$filename");
74    };
75    if ( $@ ) {
76       print STDERR "WARNING: Could not parse file: $filename: $@\n";
77       return;
78    }
79    if (not $p) {
80        print STDERR "WARNING: Could not parse file: $filename\n";
81        return;
82    }
83    my $trkpt;
84    while (1) {
85        eval {
86            $trkpt = $p->get_tag("trkpt");
87        };
88        warn "error in gttrck(): $@" if $@;
89        last unless $trkpt;
90        my $attr = $trkpt->attr;
91        my $lat = $attr->{lat};
92        my $lon = $attr->{lon};
93#       print STDERR "$lat $lon\n";
94        my $tp = new trackpoint ();
95        $tp->set_lat ($lat);
96        $tp->set_lon ($lon);
97        $self->add_track_point ($tp);
98    }
99}
100
101sub draw {
102    my $self = shift;
103    my $landsat = shift;
104
105    my $can = $landsat->get_canvas ();
106    my $w = $landsat->get_pixel_width ();
107    my $h = $landsat->get_pixel_height ();
108    my ($west, $south, $east, $north) = $landsat->get_area ();
109    my $dx = $east-$west;
110    my $dy = $north-$south;
111   
112##    print STDERR "$north $south $east $west\n";
113
114    foreach my $t ($self->get_track_points ()) {
115        my $lat = $t->get_lat ();
116        my $lon = $t->get_lon ();
117        if ($lat > $north or $lat < $south or $lon > $east or $lon < $west) {
118            next;
119        }
120
121##      print STDERR "DRAW: $lat $lon\n";
122        my $x = ($lon-$west)/$dx*$w;
123        my $y = $h-($lat-$south)/$dy*$h;
124        $self->draw_point ($can, $x, $y);
125    }
126}
127
128sub draw_point {
129    my $self = shift;
130    my $can = shift;
131    my $x = shift;
132    my $y = shift;
133    my $r = 1;
134    my $obj = $can->create ('oval', $x-$r, $y-$r, $x+$r, $y+$r,
135                            -fill => "cyan",
136                            -outline => "cyan",
137                            -tag => "track");
138}
139
140
141return 1;
Note: See TracBrowser for help on using the repository browser.