diff options
Diffstat (limited to 'navit/script/osm/Geo/OSM/EntitiesV6.pm')
-rw-r--r-- | navit/script/osm/Geo/OSM/EntitiesV6.pm | 404 |
1 files changed, 0 insertions, 404 deletions
diff --git a/navit/script/osm/Geo/OSM/EntitiesV6.pm b/navit/script/osm/Geo/OSM/EntitiesV6.pm deleted file mode 100644 index 8747c17f0..000000000 --- a/navit/script/osm/Geo/OSM/EntitiesV6.pm +++ /dev/null @@ -1,404 +0,0 @@ -################################################################## -## EntitiesV3.pm - Wraps entities used by OSM ## -## By Martijn van Oosterhout <kleptog@svana.org> ## -## ## -## Package that wraps the entities used by OSM into Perl ## -## object, so they can be easily manipulated by various ## -## packages. ## -## ## -## Licence: LGPL ## -################################################################## - -use XML::Writer; -use strict; - -############################################################################ -## Top level Entity type, parent of all types, includes stuff relating to ## -## tags and IDs which are shared by all entity types ## -############################################################################ -package Geo::OSM::Entity; -use POSIX qw(strftime); - -use Carp; - -sub _new -{ - bless {}, shift; -} - -sub _get_writer -{ - my($self,$res) = @_; - return new XML::Writer(OUTPUT => $res, NEWLINES => 0, ENCODING => 'utf-8'); -} - -sub add_tag -{ - my($self, $k,$v) = @_; - push @{$self->{tags}}, $k, $v; -} - -sub add_tags -{ - my($self, @tags) = @_; - if( scalar(@tags)&1 ) - { croak "add_tags requires an even number of arguments" } - push @{$self->{tags}}, @tags; -} - -sub set_tags -{ - my($self,$tags) = @_; - if( ref($tags) eq "HASH" ) - { $self->{tags} = [%$tags] } - elsif( ref($tags) eq "ARRAY" ) - { $self->{tags} = [@$tags] } - else - { croak "set_tags must be HASH or ARRAY" } -} - -sub tags -{ - my $self = shift; - return [@{$self->{tags}}]; # Return copy -} - -sub tag_xml -{ - my ($self,$writer) = @_; - my @a = @{$self->{tags}}; - - my $str = ""; - - while( my($k,$v) = splice @a, 0, 2 ) - { - $writer->emptyTag( "tag", 'k' => $k, 'v' => $v ); - } -} - -our $_ID = -1; - -sub set_id -{ - my($self,$id) = @_; - - if( not defined $id ) - { $id = $_ID-- } - $self->{id} = $id; -} - -sub id -{ - my $self = shift; - return $self->{id}; -} - -sub set_timestamp -{ - my($self,$time) = @_; - if( defined $time ) - { $self->{timestamp} = $time } - else - { $self->{timestamp} = strftime "%Y-%m-%dT%H:%M:%S+00:00", gmtime(time) } -} - -sub timestamp -{ - my $self = shift; - return $self->{timestamp}; -} - -sub set_changeset -{ - my($self,$changeset) = @_; - $self->{changeset} = $changeset; -} - -sub changeset -{ - shift->{changeset}; -} - -sub set_version -{ - my($self,$version) = @_; - $self->{version} = $version; -} - -sub version -{ - shift->{version}; -} - -sub full_xml -{ - my $self = shift; - return qq(<?xml version="1.0"?>\n<osm version="0.6">\n).$self->xml()."</osm>\n"; -} - -package Geo::OSM::Way; -our @ISA = qw(Geo::OSM::Entity); -use Carp; - -sub new -{ - my($class, $attr, $tags, $nodes) = @_; - - my $obj = bless $class->SUPER::_new(), $class; - - $obj->set_tags($tags); - $obj->set_nodes($nodes); - $obj->set_id($attr->{id} ); - $obj->set_timestamp( $attr->{timestamp} ); - $obj->set_changeset( $attr->{changeset} ); - $obj->set_version( $attr->{version} ); - - return $obj; -} - -sub type { return "way" } - -sub set_nodes -{ - my($self,$nodes) = @_; - if( not defined $nodes ) - { $nodes = [] } - if( ref($nodes) ne "ARRAY" ) - { $nodes = [$nodes] } - if( scalar( grep { (ref($_) ne "")?$_->type ne "node":$_ !~ /^-?\d+/ } @$nodes ) ) - { croak "Expected array of nodes" } - $self->{nodes} = [map { ref($_)?$_->id:$_ } @$nodes]; -} - -sub nodes -{ - my $self = shift; - return [@{$self->{nodes}}]; # Return a copy -} - -sub xml -{ - my $self = shift; - my $str = ""; - my $writer = $self->_get_writer(\$str); - - $writer->startTag( "way", id => $self->id, timestamp => $self->timestamp, changeset => $self->changeset, version => $self->version); - $self->tag_xml( $writer ); - for my $node (@{$self->nodes}) - { - $writer->emptyTag( "nd", ref => $node ); - } - $writer->endTag( "way" ); - $writer->end; - return $str; -} - -sub map -{ - my($self,$mapper) = @_; - my $incomplete = 0; - my ($new_id) = $mapper->map('way',$self->id); # Determine mapped ID - # It is ok for the new_id to be incomplete; it may be a create request - - my @new_nodes = map { [ $mapper->map('node',$_) ] } @{$self->nodes}; - map { $incomplete |= $_->[1] } @new_nodes; - # incomplete tracks if any of the segs are incomplete - - my $new_ent = new Geo::OSM::Way( {id=>$new_id, timestamp=>$self->timestamp}, $self->tags, [map {$_->[0]} @new_nodes] ); - return($new_ent,$incomplete); -} - -package Geo::OSM::Relation::Member; -use Carp; -# Relation reference can be specified in several ways: -# { type => $type, ref => $id [ , role => $str ] } -# { ref => $obj [ , role => $str ] } -# [ $type, $id [,$role] ] -# [ $obj, [,$role] ] -sub new -{ - my $class = shift; - my $arg = shift; - return $arg if ref($arg) eq $class; # Return if already object - if( ref($arg) eq "ARRAY" ) - { - if( ref $arg->[0] ) - { $arg = { ref => $arg->[0], role => $arg->[1] } } - else - { $arg = { type => $arg->[0], ref => $arg->[1], role => $arg->[2] } } - } - if( ref($arg) eq "HASH" ) - { - if( ref $arg->{ref} ) - { $arg = [ $arg->{ref}->type, $arg->{ref}->id, $arg->{role} ] } - else - { $arg = [ $arg->{type}, $arg->{ref}, $arg->{role} ] } - } - else - { croak "Relation reference must be array or hash" } - croak "Bad type of member '$arg->[0]'" - unless $arg->[0] =~ /^(way|node|relation)$/; - croak "Bad member id '$arg->[1]'" - unless $arg->[1] =~ /^-?\d+$/; - $arg->[2] ||= ""; - - return bless $arg, $class; -} - -sub member_type { shift->[0] } -sub ref { shift->[1] } -sub role { shift->[2] } - -sub type { return "relation:member" } - -sub _xml -{ - my $self = shift; - my $writer = shift; - - $writer->emptyTag( "member", type => $self->member_type, ref => $self->ref, role => $self->role ); -} - -sub map -{ - my($self,$mapper) = @_; - my ($new_ref,$incomplete) = $mapper->map($self->member_type,$self->ref); - my $new_member = new Geo::OSM::Relation::Member( { type => $self->member_type, ref => $new_ref, role => $self->role } ); - return($new_member,$incomplete); -} - -package Geo::OSM::Relation; -our @ISA = qw(Geo::OSM::Entity); - -sub new -{ - my($class, $attr, $tags, $members) = @_; - - my $obj = bless $class->SUPER::_new(), $class; - - $obj->set_tags($tags); - $obj->set_members($members); - $obj->set_id($attr->{id} ); - $obj->set_timestamp( $attr->{timestamp} ); - $obj->set_changeset( $attr->{changeset} ); - $obj->set_version( $attr->{version} ); - - return $obj; -} - -sub set_members -{ - my($self,$members) = @_; - if( not defined $members ) - { $members = [] } - if( ref($members) ne "ARRAY" ) - { $members = [$members] } - $self->{members} = [map { new Geo::OSM::Relation::Member($_) } @$members]; -} - -sub members -{ - my $self = shift; - return [@{$self->{members}}]; -} - -sub type { return "relation" } - -sub xml -{ - my $self = shift; - my $str = ""; - my $writer = $self->_get_writer(\$str); - - $writer->startTag( "relation", id => $self->id, timestamp => $self->timestamp, changeset => $self->changeset, version => $self->version ); - $self->tag_xml( $writer ); - # Write members - foreach my $member (@{$self->{members}}) - { $member->_xml( $writer ) } - $writer->endTag( "relation" ); - $writer->end; - return $str; -} - -sub map -{ - my($self,$mapper) = @_; - my $incomplete = 0; - - my ($new_id) = $mapper->map('relation',$self->id); - my @new_members = map { [ $_->map($mapper) ] } @{$self->members}; - map { $incomplete |= $_->[1] } @new_members; - # incomplete tracks if any of the members are incomplete - my $new_ent = new Geo::OSM::Relation( {id=>$new_id, timestamp=>$self->timestamp}, $self->tags, [map {$_->[0]} @new_members] ); - return($new_ent,$incomplete); -} - -package Geo::OSM::Node; -use Carp; -use Data::Dumper; -our @ISA = qw(Geo::OSM::Entity); - -sub new -{ - my($class, $attr, $tags) = @_; - - my $obj = bless $class->SUPER::_new(), $class; - - $obj->set_tags($tags); - $obj->set_id($attr->{id} ); - $obj->set_timestamp( $attr->{timestamp} ); - $obj->set_changeset( $attr->{changeset} ); - $obj->set_version( $attr->{version} ); - if( $attr->{lon} !~ /^[-+]?\d+(\.\d+)?([eE][+-]?\d+)?$/ or - $attr->{lat} !~ /^[-+]?\d+(\.\d+)?([eE][+-]?\d+)?$/ ) - { - croak "Invalid lat,lon values ($attr->{lat},$attr->{lon})\n"; - } - $obj->{lon} = $attr->{lon}; - $obj->{lat} = $attr->{lat}; - - return $obj; -} - -sub type { return "node" } - -sub set_latlon -{ - my($self,$lat,$lon) = @_; - $self->{lat} = $lat; - $self->{lon} = $lon; -} - -sub lat -{ - shift->{lat}; -} -sub lon -{ - shift->{lon}; -} - -sub xml -{ - my $self = shift; - my $str = ""; - my $writer = $self->_get_writer(\$str); - - $writer->startTag( "node", id => $self->id, lat => $self->lat, lon => $self->lon, timestamp => $self->timestamp, changeset => $self->changeset, version => $self->version); - $self->tag_xml( $writer ); - $writer->endTag( "node" ); - $writer->end; - return $str; -} - -sub map -{ - my($self,$mapper) = @_; - my ($new_id) = $mapper->map('node',$self->id); - my $new_ent = new Geo::OSM::Node( {id=>$new_id, timestamp=>$self->timestamp, lat=>$self->lat, lon=>$self->lon}, $self->tags ); - return($new_ent,0); -} - - - -1; |