source: subversion/applications/rendering/orp/SAXOsmHandler.pm @ 7201

Last change on this file since 7201 was 7153, checked in by frederik, 12 years ago

fix polygons with holes in or/p... this time for real!

File size: 5.8 KB
Line 
1package SAXOsmHandler;
2
3#=====================================================================
4
5=head1 NAME
6
7SAXOsmHandler - Osmrender implementation
8
9=head1 SYNOPSIS
10
11 my $handler = SAXOsmHandler->new($node, $way, $relation);
12 my $parser  = XML::Parser::PerlSAX->new(Handler => $handler);
13
14=head2 DESCRIPTION
15
16This module contains a SAX handler code that can be used in conjunction
17with L<XML::Parser::PerlSAX> to parse OSM XML files.
18
19=cut
20
21#=====================================================================
22
23use strict;
24use warnings;
25
26
27#=====================================================================
28
29=head1 OBJECT CREATION AND DESTRUCTION
30
31=cut
32
33#=====================================================================
34
35#--------------------------------------------------------------------
36
37=head2 new( $node, $way, $relation )
38
39Creates a new L<SAXOsmHandler> instance.
40
41=cut
42
43#--------------------------------------------------------------------
44sub new 
45{
46    my ($type, $node, $way, $relation) = @_;
47   
48    return bless {current  => undef,
49                  node     => $node,
50                  way      => $way,
51                  relation => $relation }, $type;
52}
53
54
55#=====================================================================
56
57=head1 METHODS
58
59=cut
60
61#=====================================================================
62
63#--------------------------------------------------------------------
64
65=head2 start_element( $element )
66
67=cut
68
69#--------------------------------------------------------------------
70sub start_element 
71{
72    my ($self, $element) = @_;
73
74    if ($element->{Name} eq 'node') 
75    {
76        undef $self->{current};
77        return if defined $element->{'Attributes'}{'action'}
78               && $element->{'Attributes'}{'action'} eq 'delete';
79               
80        my $id = $element->{Attributes}{id};
81       
82        $self->{node}{$id} =
83          $self->{current} = {id        => $id,
84                              layer     => 0, 
85                              lat       => $element->{'Attributes'}{'lat'}, 
86                              lon       => $element->{'Attributes'}{'lon'}, 
87                              user      => $element->{'Attributes'}{'user'}, 
88                              timestamp => $element->{'Attributes'}{'timestamp'}, 
89                              ways      => [],
90                              relations => [] };
91        bless $self->{current}, 'node';
92    }
93    elsif ($element->{Name} eq 'way')
94    {
95        undef $self->{curr};
96        return if defined $element->{'Attributes'}{'action'}
97               && $element->{'Attributes'}{'action'} eq 'delete';
98               
99        my $id = $element->{'Attributes'}{'id'};
100        $self->{way}{$id}  =
101          $self->{current} = {id    => $id,
102                              layer => 0, 
103                              user      => $element->{'Attributes'}{'user'}, 
104                              timestamp => $element->{'Attributes'}{'timestamp'}, 
105                              nodes => [],
106                              relations => [] };
107
108        bless $self->{current}, 'way';
109       
110    }
111    elsif ($element->{Name} eq 'relation')
112    {
113        undef $self->{current};
114        return if defined $element->{'Attributes'}{'action'}
115               && $element->{'Attributes'}{'action'} eq 'delete';
116       
117        my $id = $element->{'Attributes'}{'id'};
118        $self->{relation}{$id} =
119              $self->{current} = {id        => $id, 
120                                  user      => $element->{'Attributes'}{'user'}, 
121                                  timestamp => $element->{'Attributes'}{'timestamp'}, 
122                                  members   => [],
123                                  relations => [] };
124             
125        bless $self->{current}, 'relation';
126    }
127    elsif (($element->{Name} eq 'nd') and (ref $self->{current} eq 'way'))
128    {
129        push(@{$self->{current}{'nodes'}},
130             $self->{node}{$element->{'Attributes'}->{'ref'}})
131            if defined($self->{node}{$element->{'Attributes'}->{'ref'}});
132    }
133    elsif (($element->{Name} eq 'member') and (ref $self->{current} eq 'relation'))
134    {
135        # relation members are temporarily stored as symbolic references (e.g. a
136        # string that contains "way:1234") and only later replaced by proper
137        # references.
138       
139        push(@{$self->{current}{'members'}}, 
140            [ $element->{Attributes}{role}, 
141              $element->{Attributes}{type}.':'.
142              $element->{Attributes}{ref } ]);
143    }
144    elsif ($element->{Name} eq 'tag')
145    {
146        # store the tag in the current element's hash table.
147        # also extract layer information into a direct hash member for ease of access.
148       
149        $self->{current}{tags }{ $element->{Attributes}{k} }= $element->{Attributes}{v};
150        $self->{current}{layer} = $element->{Attributes}{v}
151            if $element->{Attributes}{k} eq "layer";
152    }
153    else
154    {
155        # ignore for now
156    }
157}
158
159
160#--------------------------------------------------------------------
161
162=head2 characters( )
163
164=cut
165
166#--------------------------------------------------------------------
167sub characters 
168{
169    # osm data format has no plain character data
170}
171
172
173#--------------------------------------------------------------------
174
175=head2 end_element( )
176
177=cut
178
179#--------------------------------------------------------------------
180sub end_element 
181{
182    # no
183}
184
185
186#--------------------------------------------------------------------
187
188=head2 start_document( )
189
190=cut
191
192#--------------------------------------------------------------------
193sub start_document 
194{
195}
196
197
198#--------------------------------------------------------------------
199
200=head2 end_document( )
201
202=cut
203
204#--------------------------------------------------------------------
205sub end_document 
206{
207}
208
209
2101;
211__END__
212
213=head1 SEE
214
215L<XML::Parser::PerlSAX>
216
217=head1 VERSION
218
219$Id: SAXOsmHandler.pm 4 2008-03-11 15:24:12Z thomas $
220
221=cut
222
223
Note: See TracBrowser for help on using the repository browser.