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

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

new version useractivity

  • Property svn:executable set to *
File size: 20.7 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 [numTopUsers]" ;
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 ; my $deletedNodesWithTags = 0 ;
49my %nodesAdded ; my %nodesMovedNumber ; my %nodesMovedDistance ; my %nodesMovedMax ;
50my %tagsAdded ; my %tagsDeleted ; my %tagsRenamed ; my %tagsReclassified ;
51my %tagsDeletedName ;
52my %renames ; 
53my @deletedNodesIds = () ; my %deletedNodesTags = () ;
54my %versionJumpsNodes = () ;
55
56###############
57# get parameter
58###############
59$osm1Name = shift||'';
60if (!$osm1Name)
61{
62        die (print $usage, "\n");
63}
64
65$osm2Name = shift||'';
66if (!$osm2Name)
67{
68        die (print $usage, "\n");
69}
70
71$htmlName = shift||'';
72if (!$htmlName)
73{
74        die (print $usage, "\n");
75}
76
77$topMax = shift||'';
78if (!$topMax)
79{
80        $topMax = 10 ;
81}
82
83print "\n$program $version for files:\n\n" ;
84print stringFileInfo ($osm1Name), "\n"  ;
85print stringFileInfo ($osm2Name), "\n\n"  ;
86
87# test ways 1
88# expand way fields
89# test ways
90# copy ways file 2
91# test ways file 2
92
93
94#------------------------------------------------------------------------------------
95# Main
96#------------------------------------------------------------------------------------
97
98openOsm1File ($osm1Name) ;
99($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
100if ($nodeId1 != -1) {
101        @nodeTags1 = @$aRef1 ;
102}
103openOsm2File ($osm2Name) ;
104($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
105if ($nodeId2 != -1) {
106        @nodeTags2 = @$aRef1 ;
107}
108processNodes() ;
109
110# TODO get first ways
111processWays() ;
112
113closeOsm1File () ;
114closeOsm2File () ;
115
116output() ;
117
118#-------
119# FINISH
120#-------
121
122print "\n$program finished after ", stringTimeSpent (time()-$time0), "\n\n" ;
123
124
125#------------------------------------------------------------------------------------
126# Node procesing
127#------------------------------------------------------------------------------------
128
129sub processNodes {
130        print "processing nodes...\n" ;
131        while ( ($nodeId1 > -1) or ($nodeId2 > -1) ) {
132                # print "while $nodeId1     $nodeId2\n" ;
133                if ($nodeId1 == -1) {
134                        # get rest from file 2, new nodes
135                        while ( $nodeId2 != -1 ) {
136                                # print "$nodeId1     $nodeId2   2-NEW\n" ;
137                                $nodesAdded{$nodeUser2}++ ;
138                                userArea ($nodeUser2, $nodeLon2, $nodeLat2) ;
139                                ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
140                                if ($nodeId2 != -1) {
141                                        @nodeTags2 = @$aRef1 ;
142                                }
143                        }
144                }
145
146                if ($nodeId2 == -1) {
147                        # get rest from file 1, deleted nodes
148                        while ( $nodeId1 != -1 ) {
149                                $deletedNodes++ ;
150                                if (scalar @nodeTags1 > 0) { 
151                                        $deletedNodesWithTags++ ; 
152                                        push @deletedNodesIds, $nodeId1 ;
153                                        @{$deletedNodesTags{$nodeId1}} = @nodeTags1 ;
154                                }
155                                ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
156                                if ($nodeId1 != -1) {
157                                        @nodeTags1 = @$aRef1 ;
158                                }
159                        }
160                }
161
162                if ( ($nodeId1 == $nodeId2) and ($nodeId1 != -1) ) {
163                        # print "equal $nodeId1     $nodeId2\n" ;
164                        # position...
165                        if ( ($nodeLon1 != $nodeLon2) or ($nodeLat1 != $nodeLat2) ) {
166                                $nodesMovedNumber{$nodeUser2}++ ;
167                                my ($d) = distance ($nodeLon1, $nodeLat1, $nodeLon2, $nodeLat2) ;
168                                $nodesMovedDistance{$nodeUser2} += $d ;
169                                if (defined $nodesMovedMax{$nodeUser2}) {
170                                        if ($nodesMovedMax{$nodeUser2} < $d) { $nodesMovedMax{$nodeUser2} = $d ; }
171                                }
172                                else {
173                                        $nodesMovedMax{$nodeUser2} = $d ;
174                                }
175                                userArea ($nodeUser2, $nodeLon1, $nodeLat1) ;
176                                userArea ($nodeUser2, $nodeLon2, $nodeLat2) ;
177                        } # moved
178
179                        if ($nodeVersion2 - $nodeVersion1 > 2) { 
180                                push @{$versionJumpsNodes{$nodeUser2}}, [$nodeId2, $nodeVersion2 - $nodeVersion1] ;
181                        }
182
183                        # process tags
184                        my ($added, $deleted, $renamed, $reclassified) = compareTags (\@nodeTags1, \@nodeTags2) ; 
185                        if ($added) { $tagsAdded{$nodeUser2} += $added ; }
186                        if ($deleted) { $tagsDeleted{$nodeUser2} += $deleted ; }
187                        if ($renamed) { $tagsRenamed{$nodeUser2} += $renamed ; }
188                        # 2x next
189                        ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
190                        if ($nodeId2 != -1) {
191                                @nodeTags2 = @$aRef1 ;
192                        }
193                        ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
194                        if ($nodeId1 != -1) {
195                                @nodeTags1 = @$aRef1 ;
196                        }
197                }
198
199                if ( ($nodeId1 > $nodeId2) and ($nodeId2 != -1) ) {
200                        # print "1 > 2 $nodeId1     $nodeId2   2-NEW\n" ;
201                        # id 2 not found in file 1, nodeId2 new
202                        $nodesAdded{$nodeUser2}++ ;
203                        userArea ($nodeUser2, $nodeLon2, $nodeLat2) ;
204                        # move file2 until id2>=id1
205                        while ( ($nodeId2 < $nodeId1) and ($nodeId2 != -1) ) {
206                                ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNodeFile2 () ;
207                                if ($nodeId2 != -1) {
208                                        @nodeTags2 = @$aRef1 ;
209                                }
210                        }
211                }
212
213                if ( ($nodeId1 < $nodeId2) and ($nodeId1 != -1) ) {
214                        # print "1 < 2 $nodeId1     $nodeId2   1-DELETED\n" ;
215                        # id 1 not found in file 2, nodeId1 deleted
216                        $deletedNodes++ ;
217                        if (scalar @nodeTags1 > 0) { 
218                                $deletedNodesWithTags++ ; 
219                                push @deletedNodesIds, $nodeId1 ;
220                                @{$deletedNodesTags{$nodeId1}} = @nodeTags1 ;
221                        }
222
223
224                        # move file1 until id1>=id2
225                        while ( ($nodeId1 < $nodeId2) and ($nodeId1 != -1) ) {
226                                ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
227                                if ($nodeId1 != -1) {
228                                        @nodeTags1 = @$aRef1 ;
229                                }
230                        }
231                }
232        }
233        print "finished.\n" ;
234}
235
236#------------------------------------------------------------------------------------
237# Way procesing
238#------------------------------------------------------------------------------------
239
240sub processWays {
241
242}
243
244#------------------------------------------------------------------------------------
245# Output functions
246#------------------------------------------------------------------------------------
247
248sub output {
249        open ($html, ">", $htmlName) or die ("can't open html output file") ;
250        printHTMLHeader ($html, "UserActvity by Gary68") ;
251        print $html "<H1>UserActvity by gary68</H1>" ;
252        print $html "<p>", stringFileInfo ($osm1Name), "</p>\n"  ;
253        print $html "<p>", stringFileInfo ($osm2Name), "</p>\n"  ;
254        print $html "<H1>Results</H1>" ;
255        print $html "<p>DELETED NODES: $deletedNodes</p>\n" ;
256        print $html "<p>DELETED NODES WITH TAGS: $deletedNodesWithTags (details see further down)</p>\n" ;
257
258        my @a = () ;
259        foreach my $e (keys %nodesMovedNumber) { push @a, [$e, $nodesMovedNumber{$e}] ; }
260        printTop ("TOP moved nodes number", 0, @a) ;
261        @a = () ;
262        foreach my $e (keys %nodesMovedDistance) { push @a, [$e, $nodesMovedDistance{$e}] ; }
263        printTop ("TOP moved nodes total distance (km)", 1, @a) ;
264        @a = () ;
265        foreach my $e (keys %nodesMovedDistance) { push @a, [$e, $nodesMovedDistance{$e}/$nodesMovedNumber{$e}] ; }
266        printTop ("TOP moved nodes average distance (km)", 1, @a) ;
267        @a = () ;
268        foreach my $e (keys %nodesMovedMax) { push @a, [$e, $nodesMovedMax{$e}] ; }
269        printTop ("TOP moved nodes maximum distance (km)", 1, @a) ;
270
271        @a = () ;
272        foreach my $u (keys %maxLon) {
273                # print "USER: $u\n" ;
274                push @a, [$u, distance ($minLon{$u}, $minLat{$u}, $minLon{$u}, $maxLat{$u}) * distance ($minLon{$u}, $minLat{$u}, $maxLon{$u}, $minLat{$u})] ;
275        }
276        printTop ("TOP work areas (km²)", 1, @a) ;
277
278        @a = () ;
279        foreach my $e (keys %tagsAdded) { push @a, [$e, $tagsAdded{$e}] ; }
280        printTop ("TOP tags added", 0, @a) ;
281
282        @a = () ;
283        foreach my $e (keys %tagsRenamed) { push @a, [$e, $tagsRenamed{$e}] ; }
284        printTop ("TOP objects renamed", 0, @a) ;
285
286        my (@list) = @a ; @list = reverse (sort {$a->[1]<=>$b->[1]} @list) ;
287        # if (scalar @list > $topMax) { @list = @list[0..$topMax-1] ; }
288        print $html "<h2>Renames by ALL users</h2>\n" ;
289        printHTMLTableHead ($html) ;
290        printHTMLTableHeadings ($html, "User", "Tag", "Number") ; 
291        foreach my $e (@list) {
292                foreach my $t (keys %{$renames{$e->[0]}}) {
293                        # printf $html "%-25s %-80s %5i<br>\n" , $e->[0], $t, $renames{$e->[0]}{$t} ;
294                        printHTMLRowStart ($html) ;
295                        printHTMLCellLeft ($html, $e->[0]) ;                   
296                        printHTMLCellLeft ($html, $t) ;                 
297                        printHTMLCellRight ($html, $renames{$e->[0]}{$t}) ;                     
298                        printHTMLRowEnd ($html) ;
299                }
300        }
301        printHTMLTableFoot ($html) ;
302
303        print $html "<h2>Version jumps nodes by ALL users</h2>\n" ;
304        printHTMLTableHead ($html) ;
305        printHTMLTableHeadings ($html, "User", "Nodes") ; 
306        foreach my $u (keys %versionJumpsNodes) {
307                printHTMLRowStart ($html) ;
308                printHTMLCellLeft ($html, $u) ;                 
309                my $jumps = "" ;
310                foreach my $v (@{$versionJumpsNodes{$u}}) {
311                        $jumps = $jumps . historyLink ("node", $v->[0]) . " (" . $v->[1] . ") " ;
312                }
313                printHTMLCellLeft ($html, $jumps) ;                     
314                printHTMLRowEnd ($html) ;
315        }
316        printHTMLTableFoot ($html) ;
317
318       
319
320        @a = () ;
321        foreach my $e (keys %tagsDeleted) { push @a, [$e, $tagsDeleted{$e}] ; }
322        printTop ("TOP tags deleted", 0, @a) ;
323
324        @list = @a ; @list = reverse (sort {$a->[1]<=>$b->[1]} @list) ;
325        if (scalar @list > $topMax) { @list = @list[0..$topMax-1] ; }
326        print $html "<h2>Tags removed by TOP users</h2>\n" ;
327        printHTMLTableHead ($html) ;
328        printHTMLTableHeadings ($html, "User", "Rename", "Number") ; 
329        foreach my $e (@list) {
330                foreach my $t (keys %{$tagsDeletedName{$e->[0]}}) {
331                        # printf $html "%-25s %-50s %5i<br>\n" , $e->[0], $t, $tagsDeletedName{$e->[0]}{$t} ;
332                        printHTMLRowStart ($html) ;
333                        printHTMLCellLeft ($html, $e->[0]) ;                   
334                        printHTMLCellLeft ($html, $t) ;                 
335                        printHTMLCellRight ($html, $tagsDeletedName{$e->[0]}{$t}) ;                     
336                        printHTMLRowEnd ($html) ;
337                }
338        }
339        printHTMLTableFoot ($html) ;
340
341        print $html "<h2>ALL deleted Nodes with tags (details)</h2>\n" ;
342        printHTMLTableHead ($html) ;
343        printHTMLTableHeadings ($html, "NodeId", "Tags") ; 
344        foreach my $n (@deletedNodesIds) {
345                printHTMLRowStart ($html) ;
346                printHTMLCellLeft ($html, historyLink ("node", $n) ) ;                 
347                my $tagText = "" ;
348                foreach my $t (@{$deletedNodesTags{$n}}) { $tagText = $tagText . $t->[0] . ":" . $t->[1] . "<br>\n" ; }
349                printHTMLCellLeft ($html, $tagText) ;   
350                printHTMLRowEnd ($html) ;
351        }
352        printHTMLTableFoot ($html) ;
353
354
355        printHTMLFoot ($html) ;
356        print $html "<p>$program finished after ", stringTimeSpent (time()-$time0), "</p>\n" ;
357        close ($html) ;
358
359
360        #@a = () ;
361        #foreach my $e (keys %tagsReclassified) { push @a, [$e, $tagsReclassified{$e}] ; }
362        #printTop ("Highways reclassified", @a) ;
363
364}
365
366sub printTop {
367        my ($heading, $decimal, @list) = @_ ;
368        print $html "<h2>$heading</h2>\n" ;
369        printHTMLTableHead ($html) ;
370        printHTMLTableHeadings ($html, "User", "Data") ; 
371        @list = reverse (sort {$a->[1]<=>$b->[1]} @list) ;
372        if (scalar @list > $topMax) { @list = @list[0..$topMax-1] ; }
373        foreach my $e (@list) {
374                printHTMLRowStart ($html) ;
375                my $s ;
376                if ($decimal) { 
377                        $s = sprintf "%8.3f", $e->[1] ;
378                }
379                else {
380                        $s = sprintf "%8i", $e->[1] ;
381                }
382                printHTMLCellLeft ($html, $e->[0]) ;                   
383                printHTMLCellRight ($html, $s) ;                       
384                printHTMLRowEnd ($html) ;
385        } 
386        printHTMLTableFoot ($html) ;
387}
388
389
390#------------------------------------------------------------------------------------
391# some functions
392#------------------------------------------------------------------------------------
393
394sub userArea {
395        my ($u, $lon, $lat) = @_ ;
396        if (! defined $maxLon{$u}) {
397                $minLon{$u} = $lon ;
398                $minLat{$u} = $lat ;
399                $maxLon{$u} = $lon ;
400                $maxLat{$u} = $lat ;
401        }
402        else {
403                if ($lon > $maxLon{$u}) { $maxLon{$u} = $lon ; }
404                if ($lon < $minLon{$u}) { $minLon{$u} = $lon ; }
405                if ($lat > $maxLat{$u}) { $maxLat{$u} = $lat ; }
406                if ($lat < $minLat{$u}) { $minLat{$u} = $lat ; }
407        }
408}
409
410sub compareTags {
411        my ($aRef1, $aRef2) = @_ ;
412        my $added = 0 ; my $deleted = 0 ; my $renamed = 0 ; my $reclassified = 0 ;
413        my (@tags1) = @$aRef1 ; my (@tags2) = @$aRef2 ;
414
415        # RENAMED?
416        my $nameGiven = 0 ;
417        my $nameOld = "" ; 
418        my $nameNew = "" ;
419        foreach my $t (@tags1) { 
420                if ($t->[0] eq "name") { $nameGiven = 1 ; $nameOld = $t->[1] ; }
421        }
422        foreach my $t (@tags2) { 
423                if ($t->[0] eq "name") { $nameNew = $t->[1] ; }
424        }
425        if ( ($nameGiven == 1) and ($nameNew ne $nameOld) ) { 
426                $renamed = 1 ; 
427                $renames{$nodeUser2}{$nameOld . " -> " . $nameNew} ++ ;
428        }
429       
430        # RECLASSIFIED?
431        my $highwayGiven = 0 ;
432        my $highwayOld = "" ;
433        my $highwayNew = "" ;
434        foreach my $t (@tags1) { 
435                if ($t->[0] eq "highway") { $highwayGiven = 1 ; $highwayOld = $t->[1] ; }
436        }
437        foreach my $t (@tags2) { 
438                if ($t->[0] eq "highway") { $highwayNew = $t->[1] ; }
439        }
440        if ( ($highwayGiven == 1) and ($highwayNew ne $highwayOld) ) { $reclassified = 1 ; }
441
442        # ADDED?
443        foreach my $t2 (@tags2) {
444                my $found = 0 ;
445                foreach my $t1 (@tags1) {
446                        if ( ($t1->[0] eq $t2->[0]) and ($t1->[1] eq $t2->[1]) ) { $found = 1 ; }
447                }
448                if ($found == 0) { $added++ ; }
449        }
450
451        # DELETED?
452        foreach my $t1 (@tags1) {
453                my $found = 0 ;
454                foreach my $t2 (@tags2) {
455                        if ( ($t1->[0] eq $t2->[0]) and ($t1->[1] eq $t2->[1]) ) { $found = 1 ; }
456                }
457                # if ($found == 0) {
458                if ( ($found == 0) and ($t1->[0] ne "created_by") ) { 
459                        $deleted++ ; 
460                        $tagsDeletedName{$nodeUser2}{$t1->[0].":".$t1->[1]}++ ;
461                }
462        }
463
464        return ($added, $deleted, $renamed, $reclassified) ;
465} # compareTags
466
467#------------------------------------------------------------------------------------
468# Basic object operations
469#------------------------------------------------------------------------------------
470
471sub getNode1 {
472        my ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) ;
473        my @gTags = () ;
474        if($line1 =~ /^\s*\<node/) {
475                if ( (grep /user=/, $line1) and (grep /uid=/, $line1) ) {
476                        ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) = 
477                        ($line1 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+uid=[\'\"](.+)[\'\"].+user=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
478                }
479                else {
480                        ($id, $version, $timestamp, $changeset, $lat, $lon) = 
481                        ($line1 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
482                        $user = "unknown" ; $uid = 0 ;
483                }
484                if (!defined $user) { $user = "unknown" ; }
485                if (!defined $uid) { $uid = 0 ; }
486
487                if (!$id or (! (defined ($lat))) or ( ! (defined ($lon))) ) {
488                        print "WARNING reading osm file, line follows (expecting id, lon, lat and user for node):\n", $line1, "\n" ; 
489                }
490                else {
491                        if ( (grep (/">/, $line1)) or (grep (/'>/, $line1)) ) {                  # more lines, get tags
492                                nextLine1() ;
493                                while (!grep(/<\/node>/, $line1)) {
494                                        my ($k, $v) = ($line1 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
495                                        if ( (defined ($k)) and (defined ($v)) ) {
496                                                my $tag = [$k, $v] ; push @gTags, $tag ;
497                                        }
498                                        else { 
499                                                #print "WARNING tag not recognized: ", $line1, "\n" ;
500                                        }
501                                        nextLine1() ;
502                                }
503                                nextLine1() ;
504                        }
505                        else {
506                                nextLine1() ;
507                        }
508                }
509        }
510        else {
511                return (-1, -1, -1, -1, -1) ; 
512        } # node
513        return ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon, \@gTags) ; # in main @array = @$ref
514} # getNode1
515
516sub getNodeFile2 {
517        my ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) ;
518        my @gTags = () ;
519        if($line2 =~ /^\s*\<node/) {
520                if ( (grep /user=/, $line2) and (grep /uid=/, $line2) ) {
521                        ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) = 
522                        ($line2 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+uid=[\'\"](.+)[\'\"].+user=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
523                }
524                else {
525                        ($id, $version, $timestamp, $changeset, $lat, $lon) = 
526                        ($line2 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
527                        $user = "unknown" ; $uid = 0 ;
528                }
529                if (!defined $user) { $user = "unknown" ; }
530                if (!defined $uid) { $uid = 0 ; }
531
532                if (!$id or (! (defined ($lat))) or ( ! (defined ($lon))) ) {
533                        print "WARNING reading osm file 2, line follows (expecting id, lon, lat and user for node):\n", $line2, "\n" ; 
534                }
535                else {
536                        if ( (grep (/">/, $line2)) or (grep (/'>/, $line2)) ) {                  # more lines, get tags
537                                nextLine2() ;
538                                while (!grep(/<\/node>/, $line2)) {
539                                        my ($k, $v) = ($line2 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
540                                        if ( (defined ($k)) and (defined ($v)) ) {
541                                                my $tag = [$k, $v] ; push @gTags, $tag ;
542                                        }
543                                        else { 
544                                                #print "WARNING tag not recognized file 2: ", $line2, "\n" ;
545                                        }
546                                        nextLine2() ;
547                                }
548                                nextLine2() ;
549                        }
550                        else {
551                                nextLine2() ;
552                        }
553                }
554        }
555        else {
556                return (-1, -1, -1, -1, -1) ; 
557        } # node
558        return ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon, \@gTags) ; # in main @array = @$ref
559} # getNodeFile2
560
561
562
563# TODO copy 1->2
564sub getWay1 {
565        my $gId ; my $gU ; my @gTags ; my @gNodes ;
566        if($line1 =~ /^\s*\<way/) {
567                my ($id)   = ($line1 =~ /^\s*\<way id=[\'\"](\d+)[\'\"]/); # get way id
568                my ($u) = ($line1 =~ /^.+user=[\'\"](.*)[\'\"]/);       # get value // REGEX???
569                if (!$u) { $u = "unknown" ; }
570                if (!$id) { print "ERROR reading osm file, line follows (expecting way id):\n", $line1, "\n" ; }
571                unless ($id) { next; }
572                nextLine1() ;
573                while (not($line1 =~ /\/way>/)) { # more way data
574                        my ($node) = ($line1 =~ /^\s*\<nd ref=[\'\"](\d+)[\'\"]/); # get node id
575                        my ($k, $v) = ($line1 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
576                        if ($node) {
577                                push @gNodes, $node ;
578                        }
579                        if ($k and defined($v)) { my $tag = [$k, $v] ; push @gTags, $tag ; }
580                        nextLine1() ;
581                }
582                nextLine1() ;
583                $gId = $id ; $gU = $u ;
584        }
585        else {
586                return (-1, -1, -1, -1) ;
587        }
588        return ($gId, $gU, \@gNodes, \@gTags) ;
589} # getWay1
590
591
592
593
594#------------------------------------------------------------------------------------
595# Basic file operations
596#------------------------------------------------------------------------------------
597
598sub openOsm1File {
599        $file1Name = shift ;
600        if (grep /.bz2/, $file1Name) { $isBz21 = 1 ; } else { $isBz21 = 0 ; }
601        if ($isBz21) {
602                $bz1 = bzopen($file1Name, "rb") or die "Cannot open $file1Name: $bzerrno\n" ;
603        }
604        else {
605                open ($file1, "<", $file1Name) || die "can't open osm file1" ;
606        }
607        nextLine1() ;           
608        while ( ! (grep /\<node/, $line1) ) {
609                nextLine1() ;
610        }
611        return 1 ;
612}
613
614sub closeOsm1File {
615        if ($isBz21) { $bz1->bzclose() ; }
616        else { close ($file1) ; }
617}
618
619sub nextLine1 {
620        if ($isBz21) { $bz1->bzreadline($line1) ; }
621        else { $line1 = <$file1> ; }
622}
623
624sub openOsm2File {
625        $file2Name = shift ;
626        if (grep /.bz2/, $file2Name) { $isBz22 = 1 ; } else { $isBz22 = 0 ; }
627        if ($isBz22) {
628                $bz2 = bzopen($file2Name, "rb") or die "Cannot open $file2Name: $bzerrno\n" ;
629        }
630        else {
631                open ($file2, "<", $file2Name) || die "can't open osm file2" ;
632        }
633        nextLine2() ;           
634        while ( ! (grep /\<node/, $line2) ) {
635                nextLine2() ;
636        }
637        return 1 ;
638}
639
640sub closeOsm2File {
641        if ($isBz22) { $bz2->bzclose() ; }
642        else { close ($file2) ; }
643}
644
645sub nextLine2 {
646        if ($isBz22) { $bz2->bzreadline($line2) ; }
647        else { $line2 = <$file2> ; }
648}
649
Note: See TracBrowser for help on using the repository browser.