source: subversion/applications/utils/gary68/useractivity.pl @ 17581

Last change on this file since 17581 was 17581, checked in by gary68, 10 years ago

new version useractivity

  • Property svn:executable set to *
File size: 17.6 KB
Line 
1#
2#
3# useractivity.pl by gary68
4#
5#
6#
7# Copyright (C) 2009, Gerhard Schwanz
8#
9# 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
10# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
16#
17#
18
19use strict ;
20use warnings ;
21
22use OSM::osm ;
23use File::stat;
24use Time::localtime;
25
26my $program = "useractivity.pl" ;
27my $usage = $program . " file1.osm file2.osm out.htm" ;
28my $version = "1.0 BETA" ;
29
30my $topMax = 10 ;
31
32my $wayId1 ; my $wayUser1 ; my @wayNodes1 ; my @wayTags1 ;
33my $wayId2 ; my $wayUser2 ; my @wayNodes2 ; my @wayTags2 ;
34
35my $nodeId1 ; my $nodeUser1 ; my $nodeLat1 ; my $nodeLon1 ; my @nodeTags1 ; my $nodeVersion1 ; my $nodeTimestamp1 ; my $nodeUid1 ; my $nodeChangeset1 ;
36my $nodeId2 ; my $nodeUser2 ; my $nodeLat2 ; my $nodeLon2 ; my @nodeTags2 ; my $nodeVersion2 ; my $nodeTimestamp2 ; my $nodeUid2 ; my $nodeChangeset2 ;
37my $aRef1 ; my $aRef2 ;
38
39my $time0 = time() ; 
40
41my $html ; my $htmlName ;
42my $osm1Name ; my $osm2Name ;
43
44my $file1 ; my $file2 ; my $bz1 ; my $bz2 ; my $isBz21 ; my $isBz22 ; my $line1 ; my $line2 ; my $bzerrno ;
45my $file1Name ; my $file2Name ;
46
47my %minLon ; my %minLat ; my %maxLon ; my %maxLat ; # per user
48my $deletedNodes = 0 ;
49my %nodesAdded ; my %nodesMovedNumber ; my %nodesMovedDistance ; my %nodesMovedMax ;
50my %tagsAdded ; my %tagsDeleted ; my %tagsRenamed ; my %tagsReclassified ;
51my %tagsDeletedName ;
52my %renames ; 
53
54###############
55# get parameter
56###############
57$osm1Name = shift||'';
58if (!$osm1Name)
59{
60        die (print $usage, "\n");
61}
62
63$osm2Name = shift||'';
64if (!$osm2Name)
65{
66        die (print $usage, "\n");
67}
68
69$topMax = shift||'';
70if (!$topMax)
71{
72        $topMax = 10 ;
73}
74
75print "\n$program $version for files:\n" ;
76print stringFileInfo ($osm1Name), "\n"  ;
77print stringFileInfo ($osm2Name), "\n\n"  ;
78
79# test ways 1
80# expand way fields
81# test ways
82# copy ways file 2
83# test ways file 2
84
85
86#------------------------------------------------------------------------------------
87# Main
88#------------------------------------------------------------------------------------
89
90openOsm1File ($osm1Name) ;
91($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
92if ($nodeId1 != -1) {
93        @nodeTags1 = @$aRef1 ;
94}
95openOsm2File ($osm2Name) ;
96($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
97if ($nodeId2 != -1) {
98        @nodeTags2 = @$aRef1 ;
99}
100processNodes() ;
101processWays() ;
102closeOsm1File () ;
103closeOsm2File () ;
104outputConsole() ;
105outputHTML() ;
106
107
108#-------
109# FINISH
110#-------
111
112print "\n$program finished after ", stringTimeSpent (time()-$time0), "\n\n" ;
113
114
115#------------------------------------------------------------------------------------
116# Node procesing
117#------------------------------------------------------------------------------------
118
119sub processNodes {
120        print "processing nodes...\n" ;
121        while ( ($nodeId1 > -1) or ($nodeId2 > -1) ) {
122                # print "while $nodeId1     $nodeId2\n" ;
123                if ($nodeId1 == -1) {
124                        # get rest from file 2, new nodes
125                        while ( $nodeId2 != -1 ) {
126                                # print "$nodeId1     $nodeId2   2-NEW\n" ;
127                                $nodesAdded{$nodeUser2}++ ;
128                                userArea ($nodeUser2, $nodeLon2, $nodeLat2) ;
129                                ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
130                                if ($nodeId2 != -1) {
131                                        @nodeTags2 = @$aRef1 ;
132                                }
133                        }
134                }
135
136                if ($nodeId2 == -1) {
137                        # get rest from file 1, deleted nodes
138                        while ( $nodeId1 != -1 ) {
139                                $deletedNodes++ ;
140                                ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
141                                if ($nodeId1 != -1) {
142                                        @nodeTags1 = @$aRef1 ;
143                                }
144                        }
145                }
146
147                if ( ($nodeId1 == $nodeId2) and ($nodeId1 != -1) ) {
148                        # print "equal $nodeId1     $nodeId2\n" ;
149                        # position...
150                        if ( ($nodeLon1 != $nodeLon2) or ($nodeLat1 != $nodeLat2) ) {
151                                $nodesMovedNumber{$nodeUser2}++ ;
152                                my ($d) = distance ($nodeLon1, $nodeLat1, $nodeLon2, $nodeLat2) ;
153                                $nodesMovedDistance{$nodeUser2} += $d ;
154                                if (defined $nodesMovedMax{$nodeUser2}) {
155                                        if ($nodesMovedMax{$nodeUser2} < $d) { $nodesMovedMax{$nodeUser2} = $d ; }
156                                }
157                                else {
158                                        $nodesMovedMax{$nodeUser2} = $d ;
159                                }
160                                userArea ($nodeUser2, $nodeLon1, $nodeLat1) ;
161                                userArea ($nodeUser2, $nodeLon2, $nodeLat2) ;
162                        } # moved
163
164                        # process tags
165                        my ($added, $deleted, $renamed, $reclassified) = compareTags (\@nodeTags1, \@nodeTags2) ; 
166                        if ($added) { $tagsAdded{$nodeUser2} += $added ; }
167                        if ($deleted) { $tagsDeleted{$nodeUser2} += $deleted ; }
168                        if ($renamed) { $tagsRenamed{$nodeUser2} += $renamed ; }
169                        # 2x next
170                        ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
171                        if ($nodeId2 != -1) {
172                                @nodeTags2 = @$aRef1 ;
173                        }
174                        ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
175                        if ($nodeId1 != -1) {
176                                @nodeTags1 = @$aRef1 ;
177                        }
178                }
179
180                if ( ($nodeId1 > $nodeId2) and ($nodeId2 != -1) ) {
181                        # print "1 > 2 $nodeId1     $nodeId2   2-NEW\n" ;
182                        # id 2 not found in file 1, nodeId2 new
183                        $nodesAdded{$nodeUser2}++ ;
184                        userArea ($nodeUser2, $nodeLon2, $nodeLat2) ;
185                        # move file2 until id2>=id1
186                        while ( ($nodeId2 < $nodeId1) and ($nodeId2 != -1) ) {
187                                ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
188                                if ($nodeId2 != -1) {
189                                        @nodeTags2 = @$aRef1 ;
190                                }
191                        }
192                }
193
194                if ( ($nodeId1 < $nodeId2) and ($nodeId1 != -1) ) {
195                        # print "1 < 2 $nodeId1     $nodeId2   1-DELETED\n" ;
196                        # id 1 not found in file 2, nodeId1 deleted
197                        $deletedNodes++ ;
198                        # move file1 until id1>=id2
199                        while ( ($nodeId1 < $nodeId2) and ($nodeId1 != -1) ) {
200                                ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
201                                if ($nodeId1 != -1) {
202                                        @nodeTags1 = @$aRef1 ;
203                                }
204                        }
205                }
206        }
207        print "finished.\n" ;
208}
209
210#------------------------------------------------------------------------------------
211# Way procesing
212#------------------------------------------------------------------------------------
213
214sub processWays {
215
216}
217
218#------------------------------------------------------------------------------------
219# Output functions
220#------------------------------------------------------------------------------------
221
222sub outputConsole {
223        print "\nResult\n------\n" ;
224        print "DELETED NODES: $deletedNodes\n\n" ;
225        my @a = () ;
226        foreach my $e (keys %nodesMovedNumber) { push @a, [$e, $nodesMovedNumber{$e}] ; }
227        printTop ("MOVED NODES NUMBER", 0, @a) ;
228        @a = () ;
229        foreach my $e (keys %nodesMovedDistance) { push @a, [$e, $nodesMovedDistance{$e}] ; }
230        printTop ("MOVED NODES TOTAL DISTANCE (km)", 1, @a) ;
231        @a = () ;
232        foreach my $e (keys %nodesMovedDistance) { push @a, [$e, $nodesMovedDistance{$e}/$nodesMovedNumber{$e}] ; }
233        printTop ("MOVED NODES AVERAGE DISTANCE (km)", 1, @a) ;
234        @a = () ;
235        foreach my $e (keys %nodesMovedMax) { push @a, [$e, $nodesMovedMax{$e}] ; }
236        printTop ("MOVED NODES MAXIMUM DISTANCE (km)", 1, @a) ;
237
238        @a = () ;
239        foreach my $u (keys %maxLon) {
240                # print "USER: $u\n" ;
241                push @a, [$u, distance ($minLon{$u}, $minLat{$u}, $minLon{$u}, $maxLat{$u}) * distance ($minLon{$u}, $minLat{$u}, $maxLon{$u}, $minLat{$u})] ;
242        }
243        printTop ("WORK AREAS (km²)", 1, @a) ;
244
245        @a = () ;
246        foreach my $e (keys %tagsAdded) { push @a, [$e, $tagsAdded{$e}] ; }
247        printTop ("TAGS ADDED", 0, @a) ;
248
249        @a = () ;
250        foreach my $e (keys %tagsRenamed) { push @a, [$e, $tagsRenamed{$e}] ; }
251        printTop ("OBJECTS RENAMED", 0, @a) ;
252
253        my (@list) = @a ; @list = reverse (sort {$a->[1]<=>$b->[1]} @list) ;
254        # if (scalar @list > $topMax) { @list = @list[0..$topMax-1] ; }
255        print "\n\nRENAMES BY ALL USERS\n\n" ;
256        foreach my $e (@list) {
257                foreach my $t (keys %{$renames{$e->[0]}}) {
258                        printf "%-25s %-80s %5i\n" , $e->[0], $t, $renames{$e->[0]}{$t} ;
259                }
260                print "\n" ;
261        }
262
263        @a = () ;
264        foreach my $e (keys %tagsDeleted) { push @a, [$e, $tagsDeleted{$e}] ; }
265        printTop ("TAGS DELETED", 0, @a) ;
266
267        @list = @a ; @list = reverse (sort {$a->[1]<=>$b->[1]} @list) ;
268        if (scalar @list > $topMax) { @list = @list[0..$topMax-1] ; }
269        print "\n\nTAGS REMOVED BY TOP USERS\n\n" ;
270        foreach my $e (@list) {
271                foreach my $t (keys %{$tagsDeletedName{$e->[0]}}) {
272                        printf "%-25s %-50s %5i\n" , $e->[0], $t, $tagsDeletedName{$e->[0]}{$t} ;
273                }
274                print "\n" ;
275        }
276        print "\n" ;
277
278
279
280        #@a = () ;
281        #foreach my $e (keys %tagsReclassified) { push @a, [$e, $tagsReclassified{$e}] ; }
282        #printTop ("Highways reclassified", @a) ;
283
284}
285
286sub printTop {
287        my ($heading, $decimal, @list) = @_ ;
288        print "\n\n$heading\n\n" ;
289        @list = reverse (sort {$a->[1]<=>$b->[1]} @list) ;
290        if (scalar @list > $topMax) { @list = @list[0..$topMax-1] ; }
291        foreach my $e (@list) {
292                if ($decimal) { 
293                        printf "%-20s %8.3f\n", $e->[0], $e->[1] ;
294                }
295                else {
296                        printf "%-20s %8i\n", $e->[0], $e->[1] ;
297                }
298        } 
299        print "\n" ;
300}
301
302sub outputHTML {
303
304}
305
306#------------------------------------------------------------------------------------
307# some functions
308#------------------------------------------------------------------------------------
309
310sub userArea {
311        my ($u, $lon, $lat) = @_ ;
312        if (! defined $maxLon{$u}) {
313                $minLon{$u} = $lon ;
314                $minLat{$u} = $lat ;
315                $maxLon{$u} = $lon ;
316                $maxLat{$u} = $lat ;
317        }
318        else {
319                if ($lon > $maxLon{$u}) { $maxLon{$u} = $lon ; }
320                if ($lon < $minLon{$u}) { $minLon{$u} = $lon ; }
321                if ($lat > $maxLat{$u}) { $maxLat{$u} = $lat ; }
322                if ($lat < $minLat{$u}) { $minLat{$u} = $lat ; }
323        }
324}
325
326sub compareTags {
327        my ($aRef1, $aRef2) = @_ ;
328        my $added = 0 ; my $deleted = 0 ; my $renamed = 0 ; my $reclassified = 0 ;
329        my (@tags1) = @$aRef1 ; my (@tags2) = @$aRef2 ;
330
331        # RENAMED?
332        my $nameGiven = 0 ;
333        my $nameOld = "" ; 
334        my $nameNew = "" ;
335        foreach my $t (@tags1) { 
336                if ($t->[0] eq "name") { $nameGiven = 1 ; $nameOld = $t->[1] ; }
337        }
338        foreach my $t (@tags2) { 
339                if ($t->[0] eq "name") { $nameNew = $t->[1] ; }
340        }
341        if ( ($nameGiven == 1) and ($nameNew ne $nameOld) ) { 
342                $renamed = 1 ; 
343                $renames{$nodeUser2}{$nameOld . " -> " . $nameNew} ++ ;
344        }
345       
346        # RECLASSIFIED?
347        my $highwayGiven = 0 ;
348        my $highwayOld = "" ;
349        my $highwayNew = "" ;
350        foreach my $t (@tags1) { 
351                if ($t->[0] eq "highway") { $highwayGiven = 1 ; $highwayOld = $t->[1] ; }
352        }
353        foreach my $t (@tags2) { 
354                if ($t->[0] eq "highway") { $highwayNew = $t->[1] ; }
355        }
356        if ( ($highwayGiven == 1) and ($highwayNew ne $highwayOld) ) { $reclassified = 1 ; }
357
358        # ADDED?
359        foreach my $t2 (@tags2) {
360                my $found = 0 ;
361                foreach my $t1 (@tags1) {
362                        if ( ($t1->[0] eq $t2->[0]) and ($t1->[1] eq $t2->[1]) ) { $found = 1 ; }
363                }
364                if ($found == 0) { $added++ ; }
365        }
366
367        # DELETED?
368        foreach my $t1 (@tags1) {
369                my $found = 0 ;
370                foreach my $t2 (@tags2) {
371                        if ( ($t1->[0] eq $t2->[0]) and ($t1->[1] eq $t2->[1]) ) { $found = 1 ; }
372                }
373                if ($found == 0) { 
374                        $deleted++ ; 
375                        $tagsDeletedName{$nodeUser2}{$t1->[0].":".$t1->[1]}++ ;
376                }
377        }
378
379        return ($added, $deleted, $renamed, $reclassified) ;
380} # compareTags
381
382#------------------------------------------------------------------------------------
383# Basic object operations
384#------------------------------------------------------------------------------------
385
386sub getNode1 {
387        my ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) ;
388        my @gTags = () ;
389        if($line1 =~ /^\s*\<node/) {
390                if ( (grep /user=/, $line1) and (grep /uid=/, $line1) ) {
391                        ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) = 
392                        ($line1 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+uid=[\'\"](.+)[\'\"].+user=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
393                }
394                else {
395                        ($id, $version, $timestamp, $changeset, $lat, $lon) = 
396                        ($line1 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
397                        $user = "unknown" ; $uid = 0 ;
398                }
399                if (!defined $user) { $user = "unknown" ; }
400                if (!defined $uid) { $uid = 0 ; }
401
402                if (!$id or (! (defined ($lat))) or ( ! (defined ($lon))) ) {
403                        print "WARNING reading osm file, line follows (expecting id, lon, lat and user for node):\n", $line1, "\n" ; 
404                }
405                else {
406                        if ( (grep (/">/, $line1)) or (grep (/'>/, $line1)) ) {                  # more lines, get tags
407                                nextLine1() ;
408                                while (!grep(/<\/node>/, $line1)) {
409                                        my ($k, $v) = ($line1 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
410                                        if ( (defined ($k)) and (defined ($v)) ) {
411                                                my $tag = [$k, $v] ; push @gTags, $tag ;
412                                        }
413                                        else { 
414                                                #print "WARNING tag not recognized: ", $line1, "\n" ;
415                                        }
416                                        nextLine1() ;
417                                }
418                                nextLine1() ;
419                        }
420                        else {
421                                nextLine1() ;
422                        }
423                }
424        }
425        else {
426                return (-1, -1, -1, -1, -1) ; 
427        } # node
428        return ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon, \@gTags) ; # in main @array = @$ref
429} # getNode1
430
431sub getNodeFile2 {
432        my ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) ;
433        my @gTags = () ;
434        if($line2 =~ /^\s*\<node/) {
435                if ( (grep /user=/, $line2) and (grep /uid=/, $line2) ) {
436                        ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) = 
437                        ($line2 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+uid=[\'\"](.+)[\'\"].+user=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
438                }
439                else {
440                        ($id, $version, $timestamp, $changeset, $lat, $lon) = 
441                        ($line2 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
442                        $user = "unknown" ; $uid = 0 ;
443                }
444                if (!defined $user) { $user = "unknown" ; }
445                if (!defined $uid) { $uid = 0 ; }
446
447                if (!$id or (! (defined ($lat))) or ( ! (defined ($lon))) ) {
448                        print "WARNING reading osm file 2, line follows (expecting id, lon, lat and user for node):\n", $line2, "\n" ; 
449                }
450                else {
451                        if ( (grep (/">/, $line2)) or (grep (/'>/, $line2)) ) {                  # more lines, get tags
452                                nextLine2() ;
453                                while (!grep(/<\/node>/, $line2)) {
454                                        my ($k, $v) = ($line2 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
455                                        if ( (defined ($k)) and (defined ($v)) ) {
456                                                my $tag = [$k, $v] ; push @gTags, $tag ;
457                                        }
458                                        else { 
459                                                #print "WARNING tag not recognized file 2: ", $line2, "\n" ;
460                                        }
461                                        nextLine2() ;
462                                }
463                                nextLine2() ;
464                        }
465                        else {
466                                nextLine2() ;
467                        }
468                }
469        }
470        else {
471                return (-1, -1, -1, -1, -1) ; 
472        } # node
473        return ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon, \@gTags) ; # in main @array = @$ref
474} # getNodeFile2
475
476
477
478# TODO copy 1->2
479sub getWay1 {
480        my $gId ; my $gU ; my @gTags ; my @gNodes ;
481        if($line1 =~ /^\s*\<way/) {
482                my ($id)   = ($line1 =~ /^\s*\<way id=[\'\"](\d+)[\'\"]/); # get way id
483                my ($u) = ($line1 =~ /^.+user=[\'\"](.*)[\'\"]/);       # get value // REGEX???
484                if (!$u) { $u = "unknown" ; }
485                if (!$id) { print "ERROR reading osm file, line follows (expecting way id):\n", $line1, "\n" ; }
486                unless ($id) { next; }
487                nextLine1() ;
488                while (not($line1 =~ /\/way>/)) { # more way data
489                        my ($node) = ($line1 =~ /^\s*\<nd ref=[\'\"](\d+)[\'\"]/); # get node id
490                        my ($k, $v) = ($line1 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
491                        if ($node) {
492                                push @gNodes, $node ;
493                        }
494                        if ($k and defined($v)) { my $tag = [$k, $v] ; push @gTags, $tag ; }
495                        nextLine1() ;
496                }
497                nextLine1() ;
498                $gId = $id ; $gU = $u ;
499        }
500        else {
501                return (-1, -1, -1, -1) ;
502        }
503        return ($gId, $gU, \@gNodes, \@gTags) ;
504} # getWay1
505
506
507
508
509#------------------------------------------------------------------------------------
510# Basic file operations
511#------------------------------------------------------------------------------------
512
513sub openOsm1File {
514        $file1Name = shift ;
515        if (grep /.bz2/, $file1Name) { $isBz21 = 1 ; } else { $isBz21 = 0 ; }
516        if ($isBz21) {
517                $bz1 = bzopen($file1Name, "rb") or die "Cannot open $file1Name: $bzerrno\n" ;
518        }
519        else {
520                open ($file1, "<", $file1Name) || die "can't open osm file1" ;
521        }
522        nextLine1() ;           
523        while ( ! (grep /\<node/, $line1) ) {
524                nextLine1() ;
525        }
526        return 1 ;
527}
528
529sub closeOsm1File {
530        if ($isBz21) { $bz1->bzclose() ; }
531        else { close ($file1) ; }
532}
533
534sub nextLine1 {
535        if ($isBz21) { $bz1->bzreadline($line1) ; }
536        else { $line1 = <$file1> ; }
537}
538
539sub openOsm2File {
540        $file2Name = shift ;
541        if (grep /.bz2/, $file2Name) { $isBz22 = 1 ; } else { $isBz22 = 0 ; }
542        if ($isBz22) {
543                $bz2 = bzopen($file2Name, "rb") or die "Cannot open $file2Name: $bzerrno\n" ;
544        }
545        else {
546                open ($file2, "<", $file2Name) || die "can't open osm file2" ;
547        }
548        nextLine2() ;           
549        while ( ! (grep /\<node/, $line2) ) {
550                nextLine2() ;
551        }
552        return 1 ;
553}
554
555sub closeOsm2File {
556        if ($isBz22) { $bz2->bzclose() ; }
557        else { close ($file2) ; }
558}
559
560sub nextLine2 {
561        if ($isBz22) { $bz2->bzreadline($line2) ; }
562        else { $line2 = <$file2> ; }
563}
564
Note: See TracBrowser for help on using the repository browser.