# # # # # # Copyright (C) 2010, Gerhard Schwanz # # 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 3 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, see # # requires osmdb.ini file in program directory for credentials containing two information # # user=NAME # password=PASSWORD # # TODO # # db size # # package OSM::osmDB ; my $DBuser = "" ; # to be read from ini file my $DBpassword = "" ; my $tempDir = "/tmp" ; use strict ; use warnings ; use DBI ; use OSM::osm ; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); $VERSION = '1.0' ; require Exporter ; @ISA = qw ( Exporter AutoLoader ) ; @EXPORT = qw ( bulkLoad dbConnect dbDisconnect deleteDBNode deleteDBWay deleteDBRelation getDBNode getDBWay getDBWayNodesCoords getDBRelation getTag initTableNodes initTableWays initTableRelations loopInitNodes loopGetNextNode loopInitRelations loopGetNextRelation loopInitWays loopGetNextWay printMaxValues storeDBNode storeDBWay storeDBRelation ) ; my $dbh ; my $sthLoopNodes ; my $sthLoopWays ; my $sthLoopRelations ; my $maxK = 0 ; my $maxV = 0 ; # ---------------------------------------------------------------------------- sub deleteDBNode { my $id = shift ; $dbh->do("DELETE FROM nodes WHERE id = $id") ; $dbh->do("DELETE FROM nodetags WHERE id = $id") ; } sub deleteDBWay { my $id = shift ; $dbh->do("DELETE FROM ways WHERE id = $id") ; $dbh->do("DELETE FROM waytags WHERE id = $id") ; $dbh->do("DELETE FROM waynodes WHERE id = $id") ; } sub deleteDBRelation { my $id = shift ; $dbh->do("DELETE FROM relations WHERE id = $id") ; $dbh->do("DELETE FROM relationtags WHERE id = $id") ; $dbh->do("DELETE FROM relationmembers WHERE id = $id") ; } # ---------------------------------------------------------------------------- sub storeDBNode { my ($aRef0, $aRef1) = @_ ; my %nodeProperties = %$aRef0 ; my @nodeTags = @$aRef1 ; my $id = $nodeProperties{'id'} ; my $lon = $nodeProperties{'lon'} ; my $lat = $nodeProperties{'lat'} ; my $user = $nodeProperties{'user'} ; my $version = $nodeProperties{'version'} ; my $timestamp = $nodeProperties{'timestamp'} ; my $uid = $nodeProperties{'uid'} ; my $changeset = $nodeProperties{'changeset'} ; $dbh->do("INSERT INTO nodes (id, lon, lat, user, version, timestamp, uid, changeset) VALUES ($id, $lon, $lat, '$user', $version, '$timestamp', $uid, $changeset)") ; my $nodeId = $nodeProperties{'id'} ; foreach my $t (@nodeTags) { my $k = $t->[0] ; my $v = $t->[1] ; if (length $k > $maxK) { $maxK = length $k ; } if (length $v > $maxV) { $maxV = length $v ; } $dbh->do("INSERT INTO nodetags (id, k, v) VALUES ($nodeId, '$k', '$v')") ; } } sub storeDBWay { my ($aRef0, $aRef1, $aRef2) = @_ ; my %wayProperties = %$aRef0 ; my @wayNodes = @$aRef1 ; my @wayTags = @$aRef2 ; my $id = $wayProperties{'id'} ; my $user = $wayProperties{'user'} ; my $version = $wayProperties{'version'} ; my $timestamp = $wayProperties{'timestamp'} ; my $uid = $wayProperties{'uid'} ; my $changeset = $wayProperties{'changeset'} ; $dbh->do("INSERT INTO ways (id, user, version, timestamp, uid, changeset) VALUES ($id, '$user', $version, '$timestamp', $uid, $changeset)") ; my $wayId = $wayProperties{'id'} ; foreach my $t (@wayTags) { my $k = $t->[0] ; my $v = $t->[1] ; if (length $k > $maxK) { $maxK = length $k ; } if (length $v > $maxV) { $maxV = length $v ; } $dbh->do("INSERT INTO waytags (id, k, v) VALUES ($wayId, '$k', '$v')") ; } my $i = 0 ; foreach my $n (@wayNodes) { $dbh->do("INSERT INTO waynodes (id, s, nodeid) VALUES ($wayId, $i, $n)") ; $i++ ; } } sub storeDBRelation { my ($aRef0, $aRef1, $aRef2) = @_ ; my %relationProperties = %$aRef0 ; my @relationMembers = @$aRef1 ; my @relationTags = @$aRef2 ; my $id = $relationProperties{'id'} ; my $user = $relationProperties{'user'} ; my $version = $relationProperties{'version'} ; my $timestamp = $relationProperties{'timestamp'} ; my $uid = $relationProperties{'uid'} ; my $changeset = $relationProperties{'changeset'} ; $dbh->do("INSERT INTO relations (id, user, version, timestamp, uid, changeset) VALUES ($id, '$user', $version, '$timestamp', $uid, $changeset)") ; my $relationId = $relationProperties{'id'} ; foreach my $t (@relationTags) { my $k = $t->[0] ; my $v = $t->[1] ; if (length $k > $maxK) { $maxK = length $k ; } if (length $v > $maxV) { $maxV = length $v ; } $dbh->do("INSERT INTO relationtags (id, k, v) VALUES ($relationId, '$k', '$v')") ; } my $i = 0 ; foreach my $m (@relationMembers) { my $type = $m->[0] ; my $mid = $m->[1] ; my $role = $m->[2] ; $dbh->do("INSERT INTO relationmembers (id, s, type, memberid, role) VALUES ($relationId, $i, '$type', $mid, '$role')") ; $i++ ; } } sub printMaxValues { print "\nmax key length = $maxK\n" ; print "max val length = $maxV\n\n" ; } # ---------------------------------------------------------------------------- sub loopInitNodes { my ($k, $v) = @_ ; my $kq = "" ; my $vq = "" ; my $and = "" ; if (defined $k) { $kq = " k = '$k'" ; } if (defined $v) { $vq = " v = '$v'" ; } if ( (defined $k) and (defined $v) ) { $and = " AND " ; } if ( (! defined $k) and (! defined $v) ) { $sthLoopNodes = $dbh->prepare("SELECT id FROM nodes ORDER BY id") or die "Couldn't prepare statement: " . $dbh->errstr ; } else { my $q = "SELECT id from nodetags WHERE $kq $and $vq ORDER BY id" ; $sthLoopNodes = $dbh->prepare("$q") or die "Couldn't prepare statement: " . $dbh->errstr ; } $sthLoopNodes->execute() or die "Couldn't execute statement: " . $sthLoopNodes->errstr ; } sub loopGetNextNode { my $id = undef ; my @data ; if (@data = $sthLoopNodes->fetchrow_array()) { $id = $data[0] ; } else { $sthLoopNodes->finish ; $id = undef ; } return $id ; } sub loopInitWays { my ($k, $v) = @_ ; my $kq = "" ; my $vq = "" ; my $and = "" ; if (defined $k) { $kq = " k = '$k'" ; } if (defined $v) { $vq = " v = '$v'" ; } if ( (defined $k) and (defined $v) ) { $and = " AND " ; } if ( (! defined $k) and (! defined $v) ) { $sthLoopWays = $dbh->prepare("SELECT id FROM ways ORDER BY id") or die "Couldn't prepare statement: " . $dbh->errstr ; } else { my $q = "SELECT id from waytags WHERE $kq $and $vq ORDER BY id" ; $sthLoopWays = $dbh->prepare("$q") or die "Couldn't prepare statement: " . $dbh->errstr ; } $sthLoopWays->execute() or die "Couldn't execute statement: " . $sthLoopWays->errstr ; } sub loopGetNextWay { my $id = undef ; my @data ; if (@data = $sthLoopWays->fetchrow_array()) { $id = $data[0] ; } else { $sthLoopWays->finish ; $id = undef ; } return $id ; } sub loopInitRelations { my ($k, $v) = @_ ; my $kq = "" ; my $vq = "" ; my $and = "" ; if (defined $k) { $kq = " k = '$k'" ; } if (defined $v) { $vq = " v = '$v'" ; } if ( (defined $k) and (defined $v) ) { $and = " AND " ; } if ( (! defined $k) and (! defined $v) ) { $sthLoopRelations = $dbh->prepare("SELECT id FROM relations ORDER BY id") or die "Couldn't prepare statement: " . $dbh->errstr ; } else { my $q = "SELECT id from relationtags WHERE $kq $and $vq ORDER BY id" ; $sthLoopRelations = $dbh->prepare("$q") or die "Couldn't prepare statement: " . $dbh->errstr ; } $sthLoopRelations->execute() or die "Couldn't execute statement: " . $sthLoopRelations->errstr ; } sub loopGetNextRelation { my $id = undef ; my @data ; if (@data = $sthLoopRelations->fetchrow_array()) { $id = $data[0] ; } else { $sthLoopRelations->finish ; $id = undef ; } return $id ; } # ---------------------------------------------------------------------------- sub getTag { my ($type, $id, $key) = @_ ; my $tag = undef ; my $tableName = "" ; if ($type eq "node") { $tableName = "nodetags" ; } if ($type eq "way") { $tableName = "waytags" ; } if ($type eq "relation") { $tableName = "relationtags" ; } if ($tableName ne "") { my $sth = $dbh->prepare("SELECT v FROM $tableName WHERE id = $id AND k='$key'") or die "Couldn't prepare statement: " . $dbh->errstr ; my @data ; $sth->execute() or die "Couldn't execute statement: " . $sth->errstr ; while (@data = $sth->fetchrow_array()) { $tag = $data[0] ; } $sth->finish ; } return $tag ; } sub getDBWayNodesCoords { my $wayId = shift ; my %lon = () ; my %lat = () ; my $sth = $dbh->prepare("SELECT nodes.id,lon,lat FROM waynodes, nodes WHERE waynodes.id=$wayId AND waynodes.nodeid=nodes.id") or die "Couldn't prepare statement: " . $dbh->errstr ; my @data ; $sth->execute() or die "Couldn't execute statement: " . $sth->errstr ; while (@data = $sth->fetchrow_array()) { my $id = $data[0] ; my $lo = $data[1] ; my $la = $data[2] ; $lon{$id} = $lo ; $lat{$id} = $la ; } return (\%lon, \%lat) ; } sub getDBNode { my $id = shift ; my $user = undef ; my $lon = undef ; my $lat = undef ; my $version = "0" ; my $timestamp = "" ; my $uid = 0 ; my $changeset = 0 ; my @nodeTags = () ; my $refTags = undef ; my %properties = () ; my $refProperties = undef ; my $sth = $dbh->prepare("SELECT * FROM nodes WHERE id = $id") or die "Couldn't prepare statement: " . $dbh->errstr ; my @data ; $sth->execute() or die "Couldn't execute statement: " . $sth->errstr ; while (@data = $sth->fetchrow_array()) { $lon = $data[1] ; $lat = $data[2] ; $user = $data[3] ; $version = $data[4] ; $timestamp = $data[5] ; $uid = $data[6] ; $changeset = $data[7] ; $properties{"user"} = $user ; $properties{"lon"} = $lon ; $properties{"lat"} = $lat ; $properties{"version"} = $version ; $properties{"timestamp"} = $timestamp ; $properties{"uid"} = $uid ; $properties{"changeset"} = $changeset ; } if ($sth->rows == 0) { print STDERR "ERROR: node $id not found in DB.\n\n" ; } $sth->finish ; my $sth2 = $dbh->prepare("SELECT * FROM nodetags WHERE id = $id") or die "Couldn't prepare statement: " . $dbh->errstr ; my @tagdata; $sth2->execute() or die "Couldn't execute statement: " . $sth->errstr ; my @data2 ; while (@data2 = $sth2->fetchrow_array()) { my $k = $data2[1] ; my $v = $data2[2] ; push @nodeTags, [$k, $v] ; } $sth2->finish ; $refTags = \@nodeTags ; $refProperties = \%properties ; return ($refProperties, $refTags) ; } sub getDBWay { my $id = shift ; my $user = undef ; my $version = "0" ; my $timestamp = "" ; my $uid = 0 ; my $changeset = 0 ; my @wayTags = () ; my @wayNodes = () ; my %properties = () ; my $refNodes = undef ; my $refTags = undef ; my $refProperties = undef ; my $sth = $dbh->prepare("SELECT * FROM ways WHERE id = $id") or die "Couldn't prepare statement: " . $dbh->errstr ; my @data ; $sth->execute() or die "Couldn't execute statement: " . $sth->errstr ; while (@data = $sth->fetchrow_array()) { $user = $data[1] ; $version = $data[2] ; $timestamp = $data[3] ; $uid = $data[4] ; $changeset = $data[5] ; $properties{"user"} = $user ; $properties{"version"} = $version ; $properties{"timestamp"} = $timestamp ; $properties{"uid"} = $uid ; $properties{"changeset"} = $changeset ; } if ($sth->rows == 0) { print STDERR "ERROR: node $id not found in DB.\n\n" ; } $sth->finish ; my $sth2 = $dbh->prepare("SELECT * FROM waytags WHERE id = $id") or die "Couldn't prepare statement: " . $dbh->errstr ; $sth2->execute() or die "Couldn't execute statement: " . $sth->errstr ; my @data2 ; while (@data2 = $sth2->fetchrow_array()) { my $k = $data2[1] ; my $v = $data2[2] ; push @wayTags, [$k, $v] ; } $sth2->finish ; my $sth3 = $dbh->prepare("SELECT * FROM waynodes WHERE id = $id ORDER BY s") or die "Couldn't prepare statement: " . $dbh->errstr ; $sth3->execute() or die "Couldn't execute statement: " . $sth->errstr ; my @data3 ; while (@data3 = $sth3->fetchrow_array()) { my $n = $data3[2] ; push @wayNodes, $n ; } $sth3->finish ; $refTags = \@wayTags ; $refNodes = \@wayNodes ; $refProperties = \%properties ; return ($refProperties, $refNodes, $refTags) ; } sub getDBRelation { my $id = shift ; my $user = undef ; my $version = "0" ; my $timestamp = "" ; my $uid = 0 ; my $changeset = 0 ; my @relationTags = () ; my @relationMembers = () ; my %properties = () ; my $refMembers = undef ; my $refTags = undef ; my $refProperties = undef ; my $sth = $dbh->prepare("SELECT * FROM relations WHERE id = $id") or die "Couldn't prepare statement: " . $dbh->errstr ; my @data ; $sth->execute() or die "Couldn't execute statement: " . $sth->errstr ; while (@data = $sth->fetchrow_array()) { $user = $data[1] ; $version = $data[2] ; $timestamp = $data[3] ; $uid = $data[4] ; $changeset = $data[5] ; $properties{"user"} = $user ; $properties{"version"} = $version ; $properties{"timestamp"} = $timestamp ; $properties{"uid"} = $uid ; $properties{"changeset"} = $changeset ; } if ($sth->rows == 0) { print STDERR "ERROR: node $id not found in DB.\n\n" ; } $sth->finish ; my $sth2 = $dbh->prepare("SELECT * FROM relationtags WHERE id = $id") or die "Couldn't prepare statement: " . $dbh->errstr ; $sth2->execute() or die "Couldn't execute statement: " . $sth->errstr ; my @data2 ; while (@data2 = $sth2->fetchrow_array()) { my $k = $data2[1] ; my $v = $data2[2] ; push @relationTags, [$k, $v] ; } $sth2->finish ; my $sth3 = $dbh->prepare("SELECT * FROM relationmembers WHERE id = $id ORDER BY s") or die "Couldn't prepare statement: " . $dbh->errstr ; $sth3->execute() or die "Couldn't execute statement: " . $sth->errstr ; my @data3 ; while (@data3 = $sth3->fetchrow_array()) { my $type = $data3[2] ; my $memId = $data3[3] ; my $role = $data3[4] ; push @relationMembers, [$type, $memId, $role] ; } $sth3->finish ; $refTags = \@relationTags ; $refMembers = \@relationMembers ; $refProperties = \%properties ; return ($refProperties, $refMembers, $refTags) ; } # ---------------------------------------------------------------------------- sub dbConnect { my $DBname = shift ; readINI() ; $dbh = DBI->connect("DBI:mysql:$DBname", $DBuser, $DBpassword) or die ("error connecting DB: $DBI::errstr\n") ; print STDERR "successfully connected to DB $DBname\n" ; } sub dbDisconnect { $dbh->disconnect() ; print STDERR "DB disconnected\n" ; } # ---------------------------------------------------------------------------- sub initTableNodes { $dbh->do("DROP TABLE nodes") ; $dbh->do("create table nodes ( id BIGINT, lon DOUBLE, lat DOUBLE, user VARCHAR(50), version INTEGER, timestamp VARCHAR(20), uid INTEGER, changeset INTEGER )") ; $dbh->do("CREATE UNIQUE INDEX i_nodeids ON nodes (id)") ; $dbh->do("DROP TABLE nodetags") ; $dbh->do("create table nodetags (id BIGINT, k VARCHAR(50), v VARCHAR(256))") ; $dbh->do("CREATE INDEX i_nodeids2 ON nodetags (id)") ; $dbh->do("CREATE INDEX i_nodekeys ON nodetags (k(12))") ; $dbh->do("CREATE INDEX i_nodevalues ON nodetags (v(12))") ; } sub initTableWays { $dbh->do("DROP TABLE ways") ; $dbh->do("create table ways (id BIGINT, user VARCHAR(50), version INTEGER, timestamp VARCHAR(20), uid INTEGER, changeset INTEGER)") ; $dbh->do("CREATE UNIQUE INDEX i_wayids ON ways (id)") ; $dbh->do("DROP TABLE waytags") ; $dbh->do("create table waytags (id BIGINT, k VARCHAR(50), v VARCHAR(256))") ; $dbh->do("CREATE INDEX i_wayids2 ON waytags (id)") ; $dbh->do("CREATE INDEX i_waykeys ON waytags (k(12))") ; $dbh->do("CREATE INDEX i_wayvalues ON waytags (v(12))") ; $dbh->do("DROP TABLE waynodes") ; $dbh->do("create table waynodes (id BIGINT, s INT, nodeid BIGINT)") ; $dbh->do("CREATE INDEX i_wayids3 ON waynodes (id)") ; } sub initTableRelations { $dbh->do("DROP TABLE relations") ; $dbh->do("create table relations (id BIGINT, user VARCHAR(50), version INTEGER, timestamp VARCHAR(20), uid INTEGER, changeset INTEGER)") ; $dbh->do("CREATE UNIQUE INDEX i_relationids ON relations (id)") ; $dbh->do("DROP TABLE relationtags") ; $dbh->do("create table relationtags (id BIGINT, k VARCHAR(50), v VARCHAR(256))") ; $dbh->do("CREATE INDEX i_relationids2 ON relationtags (id)") ; $dbh->do("CREATE INDEX i_relationkeys ON relationtags (k(12))") ; $dbh->do("CREATE INDEX i_relationvalues ON relationtags (v(12))") ; $dbh->do("DROP TABLE relationmembers") ; $dbh->do("create table relationmembers (id BIGINT, s INT, type VARCHAR(20), memberid BIGINT, role VARCHAR(20))") ; $dbh->do("CREATE INDEX i_relationids3 ON relationmembers (id)") ; } # -------------------------------------------------------------------------- sub readINI { my $file ; open ($file, "<", "osmdb.ini") or die ("ERROR: could not open ./osmdb.ini\n") ; my $line ; while ($line = <$file>) { my ($k, $v) = ( $line =~ /(.+)=(.+)/ ) ; if ((defined $k) and (defined $v)) { if ($k eq "password") { $DBpassword = $v ; } if ($k eq "user") { $DBuser = $v ; } } } close ($file) ; } # -------------------------------------------------------------------------- sub bulkLoad { my ($file, $dbName) = @_ ; my $nodeCount = 0 ; my $wayCount = 0 ; my $relationCount = 0 ; my $wayId ; my $wayId2 ; my $wayUser ; my @wayNodes ; my @wayTags ; my $nodeId ; my $nodeUser ; my $nodeLat ; my $nodeLon ; my @nodeTags ; my $relationId ; my $relationUser ; my @relationTags ; my @relationMembers ; my %nodeProperties ; my %wayProperties ; my %relationProperties ; my $aRef0 ; my $aRef1 ; my $aRef2 ; OSM::osm::openOsmFile ($file) ; print STDERR "INFO: processing nodes...\n" ; print STDERR "reading nodes...\n" ; open (my $nodesFile, ">", $tempDir . "/nodes.txt") ; open (my $nodetagsFile, ">", $tempDir . "/nodetags.txt") ; ($aRef0, $aRef1) = OSM::osm::getNode3 () ; if (defined $aRef0) { @nodeTags = @$aRef1 ; %nodeProperties = %$aRef0 ; } while (defined $aRef0) { $nodeCount++ ; print $nodesFile "$nodeProperties{'id'}\t$nodeProperties{'lon'}\t$nodeProperties{'lat'}\t" ; print $nodesFile "$nodeProperties{'user'}\t$nodeProperties{'version'}\t$nodeProperties{'timestamp'}\t" ; print $nodesFile "$nodeProperties{'uid'}\t$nodeProperties{'changeset'}\n" ; my $nodeId = $nodeProperties{'id'} ; foreach my $t (@nodeTags) { my $k = $t->[0] ; my $v = $t->[1] ; print $nodetagsFile "$nodeId\t$k\t$v\n" ; } # next ($aRef0, $aRef1) = OSM::osm::getNode3 () ; if (defined $aRef0) { @nodeTags = @$aRef1 ; %nodeProperties = %$aRef0 ; } } close ($nodesFile) ; close ($nodetagsFile) ; dbConnect ($dbName) ; initTableNodes() ; print STDERR "load nodes data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/nodes.txt' INTO TABLE nodes") ; print STDERR "load nodetags data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/nodetags.txt' INTO TABLE nodetags") ; dbDisconnect ($dbName) ; `rm $tempDir/nodes.txt` ; `rm $tempDir/nodetags.txt` ; print STDERR "INFO: $nodeCount nodes processed.\n" ; # ----------- print STDERR "INFO: processing ways...\n" ; print STDERR "reading ways...\n" ; open (my $waysFile, ">", $tempDir . "/ways.txt") ; open (my $waytagsFile, ">", $tempDir . "/waytags.txt") ; open (my $waynodesFile, ">", $tempDir . "/waynodes.txt") ; ($aRef0, $aRef1, $aRef2) = OSM::osm::getWay3 () ; if (defined $aRef0) { %wayProperties = %$aRef0 ; @wayNodes = @$aRef1 ; @wayTags = @$aRef2 ; } while (defined $aRef0) { $wayCount++ ; print $waysFile "$wayProperties{'id'}\t" ; print $waysFile "$wayProperties{'user'}\t$wayProperties{'version'}\t$wayProperties{'timestamp'}\t" ; print $waysFile "$wayProperties{'uid'}\t$wayProperties{'changeset'}\n" ; my $wayId = $wayProperties{'id'} ; foreach my $t (@wayTags) { my $k = $t->[0] ; my $v = $t->[1] ; print $waytagsFile "$wayId\t$k\t$v\n" ; } my $i = 0 ; foreach my $n (@wayNodes) { print $waynodesFile "$wayId\t$i\t$n\n" ; $i++ ; } # next way ($aRef0, $aRef1, $aRef2) = OSM::osm::getWay3 () ; if (defined $aRef0) { %wayProperties = %$aRef0 ; @wayNodes = @$aRef1 ; @wayTags = @$aRef2 ; } } close ($waysFile) ; close ($waytagsFile) ; close ($waynodesFile) ; dbConnect ($dbName) ; initTableWays() ; print STDERR "load ways data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/ways.txt' INTO TABLE ways") ; print STDERR "load waytags data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/waytags.txt' INTO TABLE waytags") ; print STDERR "load waynodes data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/waynodes.txt' INTO TABLE waynodes") ; dbDisconnect ($dbName) ; `rm $tempDir/ways.txt` ; `rm $tempDir/waytags.txt` ; `rm $tempDir/waynodes.txt` ; print STDERR "INFO: $wayCount ways processed.\n" ; # ----------- print STDERR "INFO: processing relations...\n" ; print STDERR "reading relations...\n" ; open (my $relationsFile, ">", $tempDir . "/relations.txt") ; open (my $relationtagsFile, ">", $tempDir . "/relationtags.txt") ; open (my $relationmembersFile, ">", $tempDir . "/relationmembers.txt") ; ($aRef0, $aRef1, $aRef2) = OSM::osm::getRelation3 () ; if (defined $aRef0) { %relationProperties = %$aRef0 ; @relationMembers = @$aRef1 ; @relationTags = @$aRef2 ; } while (defined $aRef0) { $relationCount++ ; print $relationsFile "$relationProperties{'id'}\t" ; print $relationsFile "$relationProperties{'user'}\t$relationProperties{'version'}\t$relationProperties{'timestamp'}\t" ; print $relationsFile "$relationProperties{'uid'}\t$relationProperties{'changeset'}\n" ; my $relationId = $relationProperties{'id'} ; foreach my $t (@relationTags) { my $k = $t->[0] ; my $v = $t->[1] ; print $relationtagsFile "$relationId\t$k\t$v\n" ; } my $n = 0 ; foreach my $m (@relationMembers) { my $t = $m->[0] ; my $i = $m->[1] ; my $r = $m->[2] ; print $relationmembersFile "$relationId\t$n\t$t\t$i\t$r\n" ; $n++ ; } #next ($aRef0, $aRef1, $aRef2) = OSM::osm::getRelation3 () ; if (defined $aRef0) { %relationProperties = %$aRef0 ; @relationMembers = @$aRef1 ; @relationTags = @$aRef2 ; } } close ($relationsFile) ; close ($relationtagsFile) ; close ($relationmembersFile) ; dbConnect ($dbName) ; initTableRelations() ; print STDERR "load relations data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/relations.txt' INTO TABLE relations") ; print STDERR "load relationtags data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/relationtags.txt' INTO TABLE relationtags") ; print STDERR "load relationmembers data...\n" ; $dbh->do("LOAD DATA LOCAL INFILE '$tempDir/relationmembers.txt' INTO TABLE relationmembers") ; dbDisconnect ($dbName) ; `rm $tempDir/relations.txt` ; `rm $tempDir/relationtags.txt` ; `rm $tempDir/relationmembers.txt` ; print STDERR "INFO: $relationCount relations processed.\n" ; OSM::osm::closeOsmFile () ; } 1 ;