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

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

useractivity beta

  • Property svn:executable set to *
File size: 10.5 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 $wayId1 ; my $wayUser1 ; my @wayNodes1 ; my @wayTags1 ;
31my $wayId2 ; my $wayUser2 ; my @wayNodes2 ; my @wayTags2 ;
32
33my $nodeId1 ; my $nodeUser1 ; my $nodeLat1 ; my $nodeLon1 ; my @nodeTags1 ; my $nodeVersion1 ; my $nodeTimestamp1 ; my $nodeUid1 ; my $nodeChangeset1 ;
34my $nodeId2 ; my $nodeUser2 ; my $nodeLat2 ; my $nodeLon2 ; my @nodeTags2 ; my $nodeVersion2 ; my $nodeTimestamp2 ; my $nodeUid2 ; my $nodeChangeset2 ;
35my $aRef1 ; my $aRef2 ;
36
37my $time0 = time() ; 
38
39my $html ; my $htmlName ;
40my $osm1Name ; my $osm2Name ;
41
42my $file1 ; my $file2 ; my $bz1 ; my $bz2 ; my $isBz21 ; my $isBz22 ; my $line1 ; my $line2 ; my $bzerrno ;
43my $file1Name ; my $file2Name ;
44
45###############
46# get parameter
47###############
48$osm1Name = shift||'';
49if (!$osm1Name)
50{
51        die (print $usage, "\n");
52}
53
54$osm2Name = shift||'';
55if (!$osm2Name)
56{
57        die (print $usage, "\n");
58}
59
60$htmlName = shift||'';
61if (!$htmlName)
62{
63        die (print $usage, "\n");
64}
65
66print "\n$program $version for files $osm1Name $osm2Name\n\n" ;
67
68
69# test ways 1
70# expand way fields
71# test ways
72# copy ways file 2
73# test ways file 2
74
75
76#------------------------------------------------------------------------------------
77# Main
78#------------------------------------------------------------------------------------
79
80openOsm1File ($osm1Name) ;
81openOsm2File ($osm2Name) ;
82processNodes() ;
83processWays() ;
84closeOsm1File () ;
85closeOsm2File () ;
86outputConsole() ;
87outputHTML() ;
88
89
90die () ;
91
92my $nodeNumber1 = 0 ;
93openOsm1File ($osm1Name) ;
94($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
95if ($nodeId1 != -1) {
96        @nodeTags1 = @$aRef1 ;
97}
98
99while ($nodeId1 != -1) {
100        $nodeNumber1++ ;
101        #print "id=$nodeId1\nlon=$nodeLon1\nlat=$nodeLat1\nuid=$nodeUid1\nuser=$nodeUser1\nset=$nodeChangeset1\n" ;
102        #foreach my $t (@nodeTags1) { print $t->[0] . ":" . $t->[1] . "\n" ;}
103        #print "\n" ;
104
105        # next
106        ($nodeId1, $nodeVersion1, $nodeTimestamp1, $nodeUid1, $nodeUser1, $nodeChangeset1, $nodeLat1, $nodeLon1, $aRef1) = getNode1 () ;
107        if ($nodeId1 != -1) {
108                @nodeTags1 = @$aRef1 ;
109        }
110}
111closeOsm1File () ;
112print "$nodeNumber1 nodes read in file 1\n" ; 
113
114
115my $nodeNumber2 = 0 ;
116openOsm2File ($osm2Name) ;
117($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNode2 () ;
118if ($nodeId2 != -1) {
119        @nodeTags2 = @$aRef1 ;
120}
121
122while ($nodeId2 != -1) {
123        $nodeNumber2++ ;
124        #print "id=$nodeId2\nlon=$nodeLon2\nlat=$nodeLat2\nuid=$nodeUid2\nuser=$nodeUser2\nset=$nodeChangeset2\n" ;
125        #foreach my $t (@nodeTags2) { print $t->[0] . ":" . $t->[1] . "\n" ;}
126        #print "\n" ;
127
128        # next
129        ($nodeId2, $nodeVersion2, $nodeTimestamp2, $nodeUid2, $nodeUser2, $nodeChangeset2, $nodeLat2, $nodeLon2, $aRef1) = getNode2 () ;
130        if ($nodeId2 != -1) {
131                @nodeTags2 = @$aRef1 ;
132        }
133}
134closeOsm2File () ;
135print "$nodeNumber2 nodes read in file 2\n" ; 
136
137
138
139########
140# FINISH
141########
142
143print "\n$program finished after ", stringTimeSpent (time()-$time0), "\n\n" ;
144
145
146#------------------------------------------------------------------------------------
147# Node procesing
148#------------------------------------------------------------------------------------
149
150sub processNodes {
151
152}
153
154#------------------------------------------------------------------------------------
155# Way procesing
156#------------------------------------------------------------------------------------
157
158sub processWays {
159
160}
161
162#------------------------------------------------------------------------------------
163# Output functions
164#------------------------------------------------------------------------------------
165
166sub outputConsole {
167
168}
169
170sub outputHTML {
171
172}
173
174
175
176#------------------------------------------------------------------------------------
177# Basic object operations
178#------------------------------------------------------------------------------------
179
180sub getNode1 {
181        my ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) ;
182        my @gTags = () ;
183        if($line1 =~ /^\s*\<node/) {
184                if ( (grep /user=/, $line1) and (grep /uid=/, $line1) ) {
185                        ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) = 
186                        ($line1 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+uid=[\'\"](.+)[\'\"].+user=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
187                }
188                else {
189                        ($id, $version, $timestamp, $changeset, $lat, $lon) = 
190                        ($line1 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
191                        $user = "unknown" ; $uid = 0 ;
192                }
193                if (!defined $user) { $user = "unknown" ; }
194                if (!defined $uid) { $uid = 0 ; }
195
196                # TODO copy sub
197                if (!$id or (! (defined ($lat))) or ( ! (defined ($lon))) ) {
198                        print "WARNING reading osm file, line follows (expecting id, lon, lat and user for node):\n", $line1, "\n" ; 
199                }
200                else {
201                        if ( (grep (/">/, $line1)) or (grep (/'>/, $line1)) ) {                  # more lines, get tags
202                                nextLine1() ;
203                                while (!grep(/<\/node>/, $line1)) {
204                                        my ($k, $v) = ($line1 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
205                                        if ( (defined ($k)) and (defined ($v)) ) {
206                                                my $tag = [$k, $v] ; push @gTags, $tag ;
207                                        }
208                                        else { 
209                                                #print "WARNING tag not recognized: ", $line1, "\n" ;
210                                        }
211                                        nextLine1() ;
212                                }
213                                nextLine1() ;
214                        }
215                        else {
216                                nextLine1() ;
217                        }
218                }
219        }
220        else {
221                return (-1, -1, -1, -1, -1) ; 
222        } # node
223        return ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon, \@gTags) ; # in main @array = @$ref
224} # getNode1
225
226sub getNode2 {
227        my ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) ;
228        my @gTags = () ;
229        if($line2 =~ /^\s*\<node/) {
230                if ( (grep /user=/, $line2) and (grep /uid=/, $line2) ) {
231                        ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon) = 
232                        ($line2 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+uid=[\'\"](.+)[\'\"].+user=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
233                }
234                else {
235                        ($id, $version, $timestamp, $changeset, $lat, $lon) = 
236                        ($line2 =~ /^\s*\<node id=[\'\"](\d+)[\'\"].+version=[\'\"](\d+)[\'\"].+timestamp=[\'\"](.+)[\'\"].+changeset=[\'\"](\d+)[\'\"].+lat=[\'\"](.+)[\'\"].+lon=[\'\"](.+)[\'\"]/) ;
237                        $user = "unknown" ; $uid = 0 ;
238                }
239                if (!defined $user) { $user = "unknown" ; }
240                if (!defined $uid) { $uid = 0 ; }
241
242                if (!$id or (! (defined ($lat))) or ( ! (defined ($lon))) ) {
243                        print "WARNING reading osm file 2, line follows (expecting id, lon, lat and user for node):\n", $line2, "\n" ; 
244                }
245                else {
246                        if ( (grep (/">/, $line2)) or (grep (/'>/, $line2)) ) {                  # more lines, get tags
247                                nextLine2() ;
248                                while (!grep(/<\/node>/, $line2)) {
249                                        my ($k, $v) = ($line2 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
250                                        if ( (defined ($k)) and (defined ($v)) ) {
251                                                my $tag = [$k, $v] ; push @gTags, $tag ;
252                                        }
253                                        else { 
254                                                #print "WARNING tag not recognized file 2: ", $line2, "\n" ;
255                                        }
256                                        nextLine2() ;
257                                }
258                                nextLine2() ;
259                        }
260                        else {
261                                nextLine2() ;
262                        }
263                }
264        }
265        else {
266                return (-1, -1, -1, -1, -1) ; 
267        } # node
268        return ($id, $version, $timestamp, $uid, $user, $changeset, $lat, $lon, \@gTags) ; # in main @array = @$ref
269} # getNode2
270
271
272
273# TODO copy 1->2
274sub getWay1 {
275        my $gId ; my $gU ; my @gTags ; my @gNodes ;
276        if($line1 =~ /^\s*\<way/) {
277                my ($id)   = ($line1 =~ /^\s*\<way id=[\'\"](\d+)[\'\"]/); # get way id
278                my ($u) = ($line1 =~ /^.+user=[\'\"](.*)[\'\"]/);       # get value // REGEX???
279                if (!$u) { $u = "unknown" ; }
280                if (!$id) { print "ERROR reading osm file, line follows (expecting way id):\n", $line1, "\n" ; }
281                unless ($id) { next; }
282                nextLine1() ;
283                while (not($line1 =~ /\/way>/)) { # more way data
284                        my ($node) = ($line1 =~ /^\s*\<nd ref=[\'\"](\d+)[\'\"]/); # get node id
285                        my ($k, $v) = ($line1 =~ /^\s*\<tag k=[\'\"](.+)[\'\"]\s*v=[\'\"](.+)[\'\"]/) ;
286                        if ($node) {
287                                push @gNodes, $node ;
288                        }
289                        if ($k and defined($v)) { my $tag = [$k, $v] ; push @gTags, $tag ; }
290                        nextLine1() ;
291                }
292                nextLine1() ;
293                $gId = $id ; $gU = $u ;
294        }
295        else {
296                return (-1, -1, -1, -1) ;
297        }
298        return ($gId, $gU, \@gNodes, \@gTags) ;
299} # getWay1
300
301
302
303
304#------------------------------------------------------------------------------------
305# Basic file operations
306#------------------------------------------------------------------------------------
307
308sub openOsm1File {
309        $file1Name = shift ;
310        if (grep /.bz2/, $file1Name) { $isBz21 = 1 ; } else { $isBz21 = 0 ; }
311        if ($isBz21) {
312                $bz1 = bzopen($file1Name, "rb") or die "Cannot open $file1Name: $bzerrno\n" ;
313        }
314        else {
315                open ($file1, "<", $file1Name) || die "can't open osm file1" ;
316        }
317        nextLine1() ;           
318        while ( ! (grep /\<node/, $line1) ) {
319                nextLine1() ;
320        }
321        return 1 ;
322}
323
324sub closeOsm1File {
325        if ($isBz21) { $bz1->bzclose() ; }
326        else { close ($file1) ; }
327}
328
329sub nextLine1 {
330        if ($isBz21) { $bz1->bzreadline($line1) ; }
331        else { $line1 = <$file1> ; }
332}
333
334sub openOsm2File {
335        $file2Name = shift ;
336        if (grep /.bz2/, $file2Name) { $isBz22 = 1 ; } else { $isBz22 = 0 ; }
337        if ($isBz22) {
338                $bz2 = bzopen($file2Name, "rb") or die "Cannot open $file2Name: $bzerrno\n" ;
339        }
340        else {
341                open ($file2, "<", $file2Name) || die "can't open osm file2" ;
342        }
343        nextLine2() ;           
344        while ( ! (grep /\<node/, $line2) ) {
345                nextLine2() ;
346        }
347        return 1 ;
348}
349
350sub closeOsm2File {
351        if ($isBz22) { $bz2->bzclose() ; }
352        else { close ($file2) ; }
353}
354
355sub nextLine2 {
356        if ($isBz22) { $bz2->bzreadline($line2) ; }
357        else { $line2 = <$file2> ; }
358}
359
Note: See TracBrowser for help on using the repository browser.