The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use 5.010;
use strict;
$Geo::Openstreetmap::Parser::VERSION = '0.03';
# ABSTRACT: Openstreetmap XML dump parser
use autodie;
sub new
{
my ($class, %callback) = @_;
my $self = bless { callback => \%callback }, $class;
$self->_init_parser();
return $self;
}
sub parse
{
my ($self, $fh) = @_;
$self->{parser}->parse($fh);
return;
}
sub _init_parser
{
my ($self) = @_;
my @path;
$self->{parser} = XML::Parser->new( Handlers => {
Start => sub {
my ($expat, $el, %attr) = @_;
push @path, { attr => \%attr };
},
End => sub {
my ($expat, $el) = @_;
my $obj = pop @path;
if ($el eq 'tag') { $path[-1]->{$el}->{$obj->{attr}->{k}} = $obj->{attr}->{v} }
if ($el eq 'nd') { push @{$path[-1]->{$el}}, $obj->{attr}->{ref} }
if ($el eq 'member') { push @{$path[-1]->{$el}}, $obj->{attr} }
if (my $cb = $self->{callback}->{$el}) { $cb->($obj) }
},
});
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Geo::Openstreetmap::Parser - Openstreetmap XML dump parser
=head1 VERSION
version 0.03
=head1 METHODS
=head2 new
Creates a parser object
my $parser = Geo::Openstreetmap::Parser->new( node => \&process_node, ... );
sub process_node {
my ($obj) = @_;
...
}
Callbacks are possible for any tag, but useful for osm primitives:
node
way
relation
Callback function receives hash with params:
attr - hash with xml attributes
tag - hash with osm tags
nd - array of node_ids (for ways)
member - array of hashes like { type => 'way', role => 'from', ref => '-1' } (for relations)
=head2 parse
Parses XML input, executing defined callback functions for OSM objects
$parser->parse( *STDIN );
=head1 AUTHOR
liosha <liosha@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by liosha.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut