source: subversion/applications/utils/conv05/05to04.pl @ 34747

Last change on this file since 34747 was 4832, checked in by gabriel, 12 years ago

Import conv05.

  • Property svn:executable set to *
File size: 3.6 KB
Line 
1#!/usr/bin/env perl
2# Copyright (C) 2007  Gabriel Ebner
3#
4# Permission is hereby granted, free of charge, to any person
5# obtaining a copy of this software and associated documentation
6# files (the "Software"), to deal in the Software without
7# restriction, including without limitation the rights to use,
8# copy, modify, merge, publish, distribute, sublicense, and/or sell
9# copies of the Software, and to permit persons to whom the
10# Software is furnished to do so, subject to the following
11# conditions:
12#
13# The above copyright notice and this permission notice shall be
14# included in all copies or substantial portions of the Software.
15#
16# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23# OTHER DEALINGS IN THE SOFTWARE.
24
25use XML::Parser;
26use HTML::Entities;
27
28sub esc { HTML::Entities::encode_numeric( $_[0] || $_ ) }
29
30my $p = XML::Parser->new;
31
32my $new_seg_id = -1;
33my %segs;
34our ( $id, $user, $timestamp, %tags, $lat, $lon, @nodes, @members );
35
36sub obj_init($) {
37    my %attr = %{ $_[0] };
38    ( $id, $user, $timestamp, $visible ) = @attr{qw(id user timestamp visible)};
39    $user      = '' unless defined $user;
40    $visible   = 1  unless defined $visible;
41    $timestamp = '' unless defined $timestamp;
42    %tags = @nodes = @members = ();
43}
44
45sub fmt_std_tags {
46    sprintf qq(id="%s" user="%s" visible="%s" timestamp="%s"), map esc, $id,
47      $user, $visible, $timestamp;
48}
49
50sub write_tags {
51    while ( my ( $k, $v ) = each %tags ) {
52        printf qq(    <tag k="%s" v="%s"/>\n), map esc, $k, $v;
53    }
54}
55
56$p->setHandlers(
57    Start => sub {
58        my ( $p, $name, %attr ) = @_;
59        if ( $name eq 'tag' ) {
60            $tags{ $attr{'k'} } = $attr{'v'};
61        }
62        elsif ( $name eq 'nd' ) {
63            push @nodes, $attr{'ref'};
64        }
65        elsif ( $name eq 'node' ) {
66            obj_init \%attr;
67            ( $lat, $lon ) = @attr{qw(lat lon)};
68        }
69        elsif ( $name eq 'member' ) {
70            push @members, [ @attr{qw(type ref role)} ];
71        }
72        elsif ( $name eq 'way' or $name eq 'relation' ) {
73            obj_init \%attr;
74        }
75    },
76    End => sub {
77        my ( $p, $name ) = @_;
78        if ( $name eq 'node' ) {
79            printf qq(  <node %s lat="%s" lon="%s">\n), fmt_std_tags, map esc,
80              $lat, $lon;
81            write_tags;
82            printf qq(  </node>\n);
83        }
84        elsif ( $name eq 'way' ) {
85            my @segs;
86            for my $i ( 0 .. ( @nodes - 2 ) ) {
87                my ( $from, $to ) = @nodes[ $i, $i + 1 ];
88                unless ( defined $segs{"$from,$to"} ) {
89                    local $id = $new_seg_id--;
90                    printf qq(  <segment %s from="%s" to="%s"/>\n),
91                      fmt_std_tags, map esc, $from, $to;
92                    $segs{"$from,$to"} = $id;
93                }
94                push @segs, $segs{"$from,$to"};
95            }
96            printf qq(  <way %s>\n), fmt_std_tags;
97            printf qq(    <seg id="%s"/>\n), $_ for @segs;
98            write_tags;
99            printf qq(  </way>\n);
100        }
101        elsif ( $name eq 'relation' ) {
102
103            # drop relations
104        }
105    },
106);
107
108print qq(<?xml version="1.0"?>\n<osm version="0.4" generator="05to04.pl">\n);
109if (@ARGV) {
110    $p->parsefile($_) for @ARGV;
111}
112else {
113    $p->parse( \*STDIN );
114}
115print qq(</osm>\n);
Note: See TracBrowser for help on using the repository browser.