source: subversion/editors/osmpedit/osmnode.pm @ 1105

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

Fixed bug with non unique id

File size: 4.1 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
17package osmnode;
18
19use FindBin qw($RealBin);
20use lib "$RealBin/../perl";
21
22use XML::TokeParser;
23
24use strict;
25
26use osmutil;
27
28sub new {
29    my $this = shift;
30    my $class = ref($this) || $this;
31    my $obj = bless {
32        LAT => 0,
33        LON => 0,
34        UID => 0,
35        TAGS => "",
36        FROMS => [],
37        TOS => [],
38        KEYVALUE => {},
39        @_
40        }, $class;
41    return $obj;
42}
43
44
45sub add_key_value {
46    my $self = shift;
47    my $key = shift;
48    my $value = shift;
49##    print STDERR "SETTAGS: $key - $value\n";
50    $self->{KEYVALUE}->{$key} = $value;
51}
52
53sub key_value_hash {
54    my $self = shift;
55    return $self->{KEYVALUE}
56}
57
58sub have_key_values {
59    my $self = shift;
60    if ($self->{TAGS}) {
61        return 1;
62    } else {
63        return 0;
64    }
65}
66
67sub set_lat {
68    my $self = shift;
69    my $val = shift;
70    $self->{LAT} = $val;
71}
72
73sub get_lat {
74    my $self = shift;
75    return $self->{LAT};;
76}
77
78sub set_lon {
79    my $self = shift;
80    my $val = shift;
81    $self->{LON} = $val;
82}
83
84sub get_lon {
85    my $self = shift;
86    return $self->{LON};
87}
88
89sub set_uid {
90    my $self = shift;
91    my $val = shift;
92    $self->{UID} = $val;
93}
94
95sub get_uid {
96    my $self = shift;
97    return $self->{UID};
98}
99
100sub get_osmuid {
101    my $self = shift;
102    my $res = $self->{UID};
103    $res =~ s/n//;
104    return $res;
105}
106
107sub get_tags {
108    my $self = shift;
109    return $self->{KEYVALUE};
110}
111
112sub add_from {
113    my $self = shift;
114    my $uid = shift;
115    print STDERR "ADDING FROM: $uid\n";
116    push @{$self->{FROMS}}, $uid;
117}
118
119sub add_to {
120    my $self = shift;
121    my $uid = shift;
122    print STDERR "ADDING TO: $uid\n";
123    push @{$self->{TOS}}, $uid;
124}
125
126sub get_froms {
127    my $self = shift;
128    return @{$self->{FROMS}};
129}
130
131sub get_tos {
132    my $self = shift;
133    return @{$self->{TOS}};
134}
135
136
137sub print {
138    my $self = shift;
139    my $lat = $self->get_lat ();
140    my $lon = $self->get_lon ();
141    my $uid = $self->get_uid ();
142    my $tags = $self->get_tags ();
143    print "OSMNODE: $lat $lon $uid: ";
144    foreach my $k (keys %{$tags}) {
145        my $val = $tags->{$k};
146        print "$k - $val; ";
147    }
148    print "\n";
149}
150
151sub parse_waypoint {
152    my $self = shift;
153    my $filename = shift;
154    my $class = shift;
155    my $creator = shift;
156    if (-f "$filename") {
157        my $p = XML::TokeParser->new("$filename");
158        if (not $p) {
159            print STDERR "WARNING: Could not parse waypoint\n";
160            return 0;
161        }
162        my $wpname = "unspecified";
163        while (my $t = $p->get_tag()) {
164            if ($t->is_start_tag) {
165                my $name = "$t->[0]";
166                if ($name eq "wpt") {
167                    my $attr = $t->attr;
168                    my $lat = $attr->{lat};
169                    my $lon = $attr->{lon};
170                    $self->set_lat ($lat);
171                    $self->set_lon ($lon);
172                    next;
173                }
174                if ($name eq "name") {
175                    $wpname = $p->get_trimmed_text ("/name");
176                }
177            }
178            if ($t->is_end_tag) {
179                my $name = "$t->[0]";
180                if ($name eq "/wpt") {
181###                 $self->set_tags ("name=$wpname;class=$class;creator=$creator");
182                }
183            }
184        }
185    }
186    return 1;
187}
188
189sub upload_osm_node {
190    my $self = shift;
191    my $username = shift;
192    my $password = shift;
193
194    my $lat = $self->get_lat ();
195    my $lon = $self->get_lon ();
196    my $tags = $self->get_tags ();
197
198    my $uid = $self->get_osmuid ();
199    if ($uid) {
200        return osmutil::update_node ($uid, $lat, $lon, $tags, $username,
201                                     $password);
202    } else {
203        my $uid = osmutil::create_node ($lat, $lon, $tags, $username,
204                                        $password);
205        if ($uid < 0) {
206            return 0;
207        } else {
208            return $uid;
209        }
210    }
211}
212
213
214return 1;
Note: See TracBrowser for help on using the repository browser.