summaryrefslogtreecommitdiff
path: root/navit/script/osm/Geo/OSM/OsmReaderV5.pm
diff options
context:
space:
mode:
Diffstat (limited to 'navit/script/osm/Geo/OSM/OsmReaderV5.pm')
-rw-r--r--navit/script/osm/Geo/OSM/OsmReaderV5.pm249
1 files changed, 0 insertions, 249 deletions
diff --git a/navit/script/osm/Geo/OSM/OsmReaderV5.pm b/navit/script/osm/Geo/OSM/OsmReaderV5.pm
deleted file mode 100644
index 37a477b1a..000000000
--- a/navit/script/osm/Geo/OSM/OsmReaderV5.pm
+++ /dev/null
@@ -1,249 +0,0 @@
-##################################################################
-## OsmReader.pm - Library for reading OSM files ##
-## By Martijn van Oosterhout <kleptog@svana.org> ##
-## ##
-## Package that reads both OSM file format files. ##
-## The user creates the parse with a callback and the ##
-## loader will call the callback for each detected object. ##
-## Licence: LGPL ##
-##################################################################
-package Geo::OSM::OsmReader;
-
-use strict;
-use warnings;
-
-use Utils::File;
-use Utils::Math;
-use Utils::Debug;
-use XML::Parser;
-use Carp;
-
-use Geo::OSM::EntitiesV5;
-
-use constant STATE_INIT => 1;
-use constant STATE_EXPECT_ENTITY => 3;
-use constant STATE_EXPECT_BODY => 4;
-
-# With this initialiser, your process will get called with instantiated objects
-sub init
-{
- my $obj = bless{}, shift;
- my $proc = shift;
- my $prog = shift;
- if( ref $proc ne "CODE" )
- { die "init Geo::OSM::OsmReader requires a sub as argument\n" }
- $obj->{newproc} = $proc;
- if( defined $prog )
- { $obj->{progress} = $prog }
- return $obj;
-}
-
-sub _process
-{
- my($self, $entity, $attr, $tags, $members) = @_;
-
- my $ent;
- if( $entity eq "node" )
- {
- $ent = new Geo::OSM::Node( $attr, $tags );
- }
- if( $entity eq "relation" )
- {
- $ent = new Geo::OSM::Relation( $attr, $tags, $members );
- }
- if( $entity eq "way" )
- {
- $ent = new Geo::OSM::Way( $attr, $tags, $members );
- }
- croak "Unknown entity '$entity'" if not defined $ent;
-
- return $self->{newproc}->( $ent );
-}
-
-sub load($)
-{
- my ($self, $file_name) = @_;
-
- $self->{state} = STATE_INIT;
-
- my $start_time = time();
- my $P = new XML::Parser(Handlers => {Start => sub{ DoStart( $self, @_ )}, End => sub { DoEnd( $self, @_ )}});
- my $fh = data_open($file_name);
- die "Cannot open OSM File $file_name\n" unless $fh;
- $self->{input_length} = -s $fh;
- $self->{count}=0;
- eval {
- $P->parse($fh);
- };
- print "\n" if $DEBUG || $VERBOSE;
- if ( $VERBOSE) {
- printf "Read and parsed $file_name in %.0f sec\n",time()-$start_time;
- }
- if ( $@ ) {
- warn "$@Error while parsing\n $file_name\n";
- return;
- }
- if (not $P) {
- warn "WARNING: Could not parse osm data\n";
- return;
- }
-}
-
-sub parse($)
-{
- my ($self, $string) = @_;
-
- $self->{state} = STATE_INIT;
-
- my $start_time = time();
- my $P = new XML::Parser(Handlers => {Start => sub{ DoStart( $self, @_ )}, End => sub { DoEnd( $self, @_ )}});
- $self->{input_length} = length($string);
- $self->{count}=0;
- eval {
- $P->parse($string);
- };
- print "\n" if $DEBUG || $VERBOSE;
- if ( $VERBOSE) {
- printf "Read and parsed string in %.0f sec\n",time()-$start_time;
- }
- if ( $@ ) {
- warn "$@Error while parsing\n [$string]\n";
- return;
- }
- if (not $P) {
- warn "WARNING: Could not parse osm data\n";
- return;
- }
-}
-
-# Function is called whenever an XML tag is started
-sub DoStart
-{
-#print @_,"\n";
- my ($self, $Expat, $Name, %Attr) = @_;
-
- if( $self->{state} == STATE_INIT )
- {
- if($Name eq "osm"){
- $self->{state} = STATE_EXPECT_ENTITY;
-
- if( $Attr{version} ne "0.5" )
- { die "OsmReaderV5 can only read 0.5 files, found '$Attr{version}'\n" }
- } else {
- die "Expected 'osm' tag, got '$Name'\n";
- }
- }
- elsif( $self->{state} == STATE_EXPECT_ENTITY )
- {
- # Pick up the origin attribute from the bound tag
- if( $Name eq "bound" )
- {
- if( exists $Attr{origin} )
- {
- $self->{origin} = $Attr{origin};
- }
- return;
- }
- if($Name eq "node" or $Name eq "relation" or $Name eq "way"){
- $self->{entity} = $Name;
- $self->{attr} = {%Attr};
- $self->{tags} = [];
- $self->{members} = ($Name ne "node") ? [] : undef;
- $self->{state} = STATE_EXPECT_BODY;
- } else {
- die "Expected entity\n";
- }
- }
- elsif( $self->{state} == STATE_EXPECT_BODY )
- {
- if($Name eq "tag"){
- push @{$self->{tags}}, $Attr{"k"}, $Attr{"v"};
- }
- if($Name eq "nd"){
- push @{$self->{members}}, $Attr{"ref"};
- }
- if($Name eq "member"){
- push @{$self->{members}}, new Geo::OSM::Relation::Member( \%Attr );
- }
- }
-}
-
-# Function is called whenever an XML tag is ended
-sub DoEnd
-{
- my ($self, $Expat, $Name) = @_;
- if( $self->{state} == STATE_EXPECT_BODY )
- {
- if( $Name eq $self->{entity} )
- {
- $self->_process( $self->{entity}, $self->{attr}, $self->{tags}, $self->{members} );
- $self->{count}++;
- if( $self->{progress} and ($self->{count}%11) == 1)
- {
- $self->{progress}->($self->{count}, $Expat->current_byte()/$self->{input_length} );
- }
- $self->{state} = STATE_EXPECT_ENTITY;
- }
- return;
- }
- elsif( $self->{state} == STATE_EXPECT_ENTITY )
- {
- return if $Name eq "bound";
- if( $Name eq "osm" )
- {
- $self->{state} = STATE_INIT;
- } else {die}
- return;
- }
-}
-
-1;
-
-__END__
-
-=head1 NAME
-
-OsmReaderV5 - Module for reading OpenStreetMap V5 XML data files
-
-=head1 SYNOPSIS
-
- my $OSM = new Geo::OSM::OsmReader(\&process);
- $OSM->load("Data/changes.osc");
-
- sub process
- {
- my($OSM, $entity) = @_;
- print "Read $entity ".$entity->id."\n";
- my $tags = $entity->tags;
- while( my($k,$v) = splice @{$tags}, 0, 2 )
- { print " $k: $v\n" }
- if( $entity->type eq "way" )
- { print " Nodes: ", join(", ",@{$entity->nodes}),"\n"; }
- }
-
-=head1 AUTHOR
-
-Martijn van Oosterhout <kleptog@svana.org>
-based on OsmXML.pm written by:
-Oliver White (oliver.white@blibbleblobble.co.uk)
-
-=head1 COPYRIGHT
-
-Copyright 2007, Martijn van Oosterhout
-Copyright 2006, Oliver White
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-=cut