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

Last change on this file since 34714 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.