source: subversion/applications/utils/gary68/relationdiff.pl @ 21494

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

initial upload of several programs

  • Property svn:executable set to *
File size: 11.7 KB
Line 
1#
2#
3# relationdiff.pl by gary68
4#
5# this program check for connections at start or end of a way. this is intended to check motorways, trunks, their links, primary, secondary and
6# tertiary highways. it might not be too useful for i.e. highway=residential
7#
8#
9#
10# Copyright (C) 2009, Gerhard Schwanz
11#
12# 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
13# Free Software Foundation; either version 3 of the License, or (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>
19#
20
21use strict ;
22use warnings ;
23
24use OSM::osm 4.0 ;
25
26my $program = "relationdiff.pl" ;
27my $usage = $program . " file1.osm file2.osm out.htm" ;
28my $version = "1.0" ;
29
30my $wayId ;
31my $wayUser ;
32my @wayNodes ;
33my @wayTags ;
34my $nodeId ;
35my $nodeUser ;
36my $nodeLat ;
37my $nodeLon ;
38my @nodeTags ;
39my $aRef1 ;
40my $aRef2 ;
41
42my $relationId ;
43my $relationUser ;
44my @relationMembers ;
45my @relationTags ;
46
47my $relationCount = 0 ;
48my $relationCount2 = 0 ;
49
50my @neededWays = () ;
51my @neededNodes = () ;
52
53my %lon ; my %lat ;
54
55my $osm1Name ; 
56my $osm2Name ; 
57my $htmlName ; my $html ;
58
59my %relMem1 ;
60my %relMem2 ;
61my %relTags1 ;
62my %relTags2 ;
63my %relUser1 ;
64my %relUser2 ;
65
66my $time0 = time() ;
67
68$osm1Name = shift||'';
69if (!$osm1Name)
70{
71        die (print $usage, "\n");
72}
73
74$osm2Name = shift||'';
75if (!$osm2Name)
76{
77        die (print $usage, "\n");
78}
79
80$htmlName = shift||'';
81if (!$htmlName)
82{
83        die (print $usage, "\n");
84}
85
86print "\n$program $version for files $osm1Name $osm2Name\n\n" ;
87
88
89print "parsing relations file1...\n" ;
90openOsmFile ($osm1Name) ;
91skipNodes() ;
92skipWays() ;
93
94
95($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
96if ($relationId != -1) {
97        @relationMembers = @$aRef1 ;
98        @relationTags = @$aRef2 ;
99}
100
101while ($relationId != -1) {
102        $relationCount++ ;     
103
104
105        $relUser1{$relationId} = $relationUser ;
106        @{$relMem1{$relationId}}= @relationMembers ;
107        @{$relTags1{$relationId}}= @relationTags ;
108
109        #next
110        ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
111        if ($relationId != -1) {
112                @relationMembers = @$aRef1 ;
113                @relationTags = @$aRef2 ;
114        }
115}
116
117closeOsmFile () ;
118
119print "parsing relations file2...\n" ;
120openOsmFile ($osm2Name) ;
121skipNodes() ;
122skipWays() ;
123
124
125($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
126if ($relationId != -1) {
127        @relationMembers = @$aRef1 ;
128        @relationTags = @$aRef2 ;
129}
130
131while ($relationId != -1) {
132
133        $relationCount2++ ;     
134        $relUser2{$relationId} = $relationUser ;
135        @{$relMem2{$relationId}}= @relationMembers ;
136        @{$relTags2{$relationId}}= @relationTags ;
137
138        #next
139        ($relationId, $relationUser, $aRef1, $aRef2) = getRelation () ;
140        if ($relationId != -1) {
141                @relationMembers = @$aRef1 ;
142                @relationTags = @$aRef2 ;
143        }
144}
145
146closeOsmFile () ;
147
148print "comparison and write html...\n" ;
149
150open ($html, ">", $htmlName) || die ("Can't open html output file") ;
151
152printHTMLHeader ($html, "Relation Diff by Gary68") ;
153
154print $html "<H1>Relation Diff by Gary68</H1>\n" ;
155print $html "<p>Version ", $version, "</p>\n" ;
156print $html "<H2>Statistics</H2>\n" ;
157print $html "<p>", stringFileInfo ($osm1Name), "</p>\n" ;
158print $html "<p>", stringFileInfo ($osm2Name), "</p>\n" ;
159
160print $html "<H2>Info</H2>\n" ;
161print $html "<p>Number relations file 1: $relationCount</p>\n" ;
162print $html "<p>Number relations file 2: $relationCount2</p>\n" ;
163
164
165print $html "<H2>New Relations</H2>\n" ;
166my $line = 0 ;
167printHTMLTableHead ($html) ;
168printHTMLTableHeadings ($html, "Line", "RelationId", "Tags", "Members") ;
169
170my $relId ;
171foreach $relId (keys %relMem2) {
172        if (! (defined $relMem1{$relId})) {
173                $line++ ;
174                printHTMLRowStart ($html) ;
175                printHTMLCellLeft ($html, $line) ;
176                printHTMLCellLeft ($html, historyLink ("relation", $relId)) ;
177                my $tagsText = "" ; my $membersText = "" ; my $tag ; my @member ;
178                if (scalar (@{$relTags2{$relId}}) > 0) {
179                        my $i ;
180                        for ($i=0; $i<scalar (@{$relTags2{$relId}}); $i++) {
181                                $tagsText = $tagsText . ${$relTags2{$relId}[$i]}[0] . " : " . ${$relTags2{$relId}[$i]}[1] . "<br>";
182                        }
183                }
184
185                if (scalar (@{$relMem2{$relId}}) > 0) {
186                        my $i ;
187                        for ($i=0; $i<scalar (@{$relMem2{$relId}}); $i++) {
188                                $membersText = $membersText . ${$relMem2{$relId}[$i]}[0] . " : " . historyLink (${$relMem2{$relId}[$i]}[0], ${$relMem2{$relId}[$i]}[1]) . " : " . ${$relMem2{$relId}[$i]}[2] . "<br>";
189                        }
190                }
191
192                printHTMLCellLeft ($html, $tagsText) ;
193                printHTMLCellLeft ($html, $membersText) ;
194                printHTMLRowEnd ($html) ;
195        }
196}
197
198printHTMLTableFoot ($html) ;
199
200print $html "<H2>Deleted Relations</H2>\n" ;
201$line = 0 ;
202printHTMLTableHead ($html) ;
203printHTMLTableHeadings ($html, "Line", "RelationId", "Tags", "Members") ;
204
205foreach $relId (keys %relMem1) {
206        if (! (defined $relMem2{$relId})) {
207                $line++ ;
208                printHTMLRowStart ($html) ;
209                printHTMLCellLeft ($html, $line) ;
210                printHTMLCellLeft ($html, historyLink ("relation", $relId)) ;
211                my $tagsText = "" ; my $membersText = "" ; my $tag ; my @member ;
212                if (scalar (@{$relTags1{$relId}}) > 0) {
213                        my $i ;
214                        for ($i=0; $i<scalar (@{$relTags1{$relId}}); $i++) {
215                                $tagsText = $tagsText . ${$relTags1{$relId}[$i]}[0] . " : " . ${$relTags1{$relId}[$i]}[1] . "<br>";
216                        }
217                }
218
219                if (scalar (@{$relMem1{$relId}}) > 0) {
220                        my $i ;
221                        for ($i=0; $i<scalar (@{$relMem1{$relId}}); $i++) {
222                                $membersText = $membersText . ${$relMem1{$relId}[$i]}[0] . " : " . historyLink (${$relMem1{$relId}[$i]}[0], ${$relMem1{$relId}[$i]}[1]) . " : " . ${$relMem1{$relId}[$i]}[2] . "<br>";
223                        }
224                }
225
226                printHTMLCellLeft ($html, $tagsText) ;
227                printHTMLCellLeft ($html, $membersText) ;
228                printHTMLRowEnd ($html) ;
229        }
230}
231
232printHTMLTableFoot ($html) ;
233
234
235print $html "<H2>Changed Relations</H2>\n" ;
236$line = 0 ;
237#printHTMLTableHead ($html) ;
238print $html "<table width=\"100%\" border=\"1\">\n" ;
239#print $html "<colgroup>\n" ;
240#print $html "<col width=\"5%\">\n" ;
241#print $html "<col width=\"10%\">\n" ;
242#print $html "<col width=\"25%\">\n" ;
243#print $html "<col width=\"15%\">\n" ;
244#print $html "<col width=\"15%\">\n" ;
245#print $html "<col width=\"15%\">\n" ;
246#print $html "<col width=\"15%\">\n" ;
247#print $html "</colgroup>\n" ;
248#printHTMLTableHeadings ($html, "Line", "RelationId", "Tags (old)", "Deleted Tags", "Added Tags", "Members", "Deleted Members", "Added Members") ;
249#printHTMLTableHeadings ($html, "Line", "RelationId", "Tags (old)", "Deleted Tags", "Added Tags", "Deleted Members", "Added Members") ;
250printHTMLTableHeadings ($html, "Line", "RelationId", "Tags (old)", "Changes") ;
251#print $html "<tr>\n" ;
252#print $html "<th width=\"5%\">Line</th>\n" ;
253#print $html "<th width=\"10%\">RelationId</th>\n" ;
254#print $html "<th width=\"25%\">Tags (old)</th>\n" ;
255#print $html "<th width=\"15%\">Deleted Tags</th>\n" ;
256#print $html "<th width=\"15%\">Added Tags</th>\n" ;
257#print $html "<th width=\"15%\">Deleted Members</th>\n" ;
258#print $html "<th width=\"15%\">Added members</th>\n" ;
259#print $html "</tr>\n" ;
260
261foreach $relId (keys %relMem1) {
262        if (defined $relMem2{$relId}) {
263
264                my $relChanged = 0 ;
265
266                my $deletedTags = "" ;
267                if (scalar (@{$relTags1{$relId}}) > 0) {
268                        my $i ;
269                        for ($i=0; $i<scalar (@{$relTags1{$relId}}); $i++) {
270                                my $found = 0 ;
271                                if (scalar (@{$relTags2{$relId}}) > 0) {
272                                        my $j ;
273                                        for ($j=0; $j<scalar (@{$relTags2{$relId}}); $j++) {
274                                                if ( (${$relTags1{$relId}[$i]}[0] eq ${$relTags2{$relId}[$j]}[0]) and
275                                                        (${$relTags1{$relId}[$i]}[1] eq ${$relTags2{$relId}[$j]}[1]) ) { $found = 1 ; }
276                                        }
277                                }
278                                if ( ($found == 0) and (! (grep /created_by/, ${$relTags1{$relId}[$i]}[0])) ) {
279                                        $deletedTags = $deletedTags . ${$relTags1{$relId}[$i]}[0] . " : " . ${$relTags1{$relId}[$i]}[1] . "<br>";
280                                        $relChanged = 1 ;
281                                }
282                        }
283                }
284
285                my $addedTags = "" ;
286                if (scalar (@{$relTags2{$relId}}) > 0) {
287                        my $i ;
288                        for ($i=0; $i<scalar (@{$relTags2{$relId}}); $i++) {
289                                my $found = 0 ;
290                                if (scalar (@{$relTags1{$relId}}) > 0) {
291                                        my $j ;
292                                        for ($j=0; $j<scalar (@{$relTags1{$relId}}); $j++) {
293                                                if ( (${$relTags2{$relId}[$i]}[0] eq ${$relTags1{$relId}[$j]}[0]) and
294                                                        (${$relTags2{$relId}[$i]}[1] eq ${$relTags1{$relId}[$j]}[1]) ) { $found = 1 ; }
295                                        }
296                                }
297                                if ( ($found == 0) and (! (grep /created_by/, ${$relTags2{$relId}[$i]}[0]) ) ) {
298                                        $addedTags = $addedTags . ${$relTags2{$relId}[$i]}[0] . " : " . ${$relTags2{$relId}[$i]}[1] . "<br>";
299                                        $relChanged = 1 ;
300                                }
301                        }
302                }
303               
304
305                # check members
306                # check 1 in 2. not, then 1 deleted
307                my $deletedMembers = "" ;
308                if (scalar (@{$relMem1{$relId}}) > 0) {
309                        my $i ;
310                        for ($i=0; $i<scalar (@{$relMem1{$relId}}); $i++) {
311                                my $found = 0 ;
312                                if (scalar (@{$relMem2{$relId}}) > 0) {
313                                        my $j ;
314                                        for ($j=0; $j<scalar (@{$relMem2{$relId}}); $j++) {
315                                                if ( (${$relMem1{$relId}[$i]}[0] eq ${$relMem2{$relId}[$j]}[0]) and
316                                                        (${$relMem1{$relId}[$i]}[1] eq ${$relMem2{$relId}[$j]}[1]) and
317                                                        (${$relMem1{$relId}[$i]}[2] eq ${$relMem2{$relId}[$j]}[2]) ) { $found = 1 ; }
318                                        }
319                                }
320                                if ( ($found == 0) ) {
321                                        $deletedMembers = $deletedMembers . ${$relMem1{$relId}[$i]}[0] . " : " . historyLink (${$relMem1{$relId}[$i]}[0], ${$relMem1{$relId}[$i]}[1])  . " : " . ${$relMem1{$relId}[$i]}[2]. "<br>";
322                                        $relChanged = 1 ;
323                                }
324                        }
325                }
326
327
328
329                # check 2 in 1. not, then 2 added
330                my $addedMembers = "" ;
331                if (scalar (@{$relMem2{$relId}}) > 0) {
332                        my $i ;
333                        for ($i=0; $i<scalar (@{$relMem2{$relId}}); $i++) {
334                                my $found = 0 ;
335                                if (scalar (@{$relMem1{$relId}}) > 0) {
336                                        my $j ;
337                                        for ($j=0; $j<scalar (@{$relMem1{$relId}}); $j++) {
338                                                if ( (${$relMem2{$relId}[$i]}[0] eq ${$relMem1{$relId}[$j]}[0]) and
339                                                        (${$relMem2{$relId}[$i]}[1] eq ${$relMem1{$relId}[$j]}[1]) and
340                                                        (${$relMem2{$relId}[$i]}[2] eq ${$relMem1{$relId}[$j]}[2]) ) { $found = 1 ; }
341                                        }
342                                }
343                                if ( ($found == 0) ) {
344                                        $addedMembers = $addedMembers . ${$relMem2{$relId}[$i]}[0] . " : " . historyLink (${$relMem2{$relId}[$i]}[0], ${$relMem2{$relId}[$i]}[1])  . " : " . ${$relMem2{$relId}[$i]}[2]. "<br>";
345                                        $relChanged = 1 ;
346                                }
347                        }
348                }
349
350                my $tagsText = "" ; 
351                if (scalar (@{$relTags1{$relId}}) > 0) {
352                        my $i ;
353                        for ($i=0; $i<scalar (@{$relTags1{$relId}}); $i++) {
354                                $tagsText = $tagsText . ${$relTags1{$relId}[$i]}[0] . " : " . ${$relTags1{$relId}[$i]}[1] . "<br>";
355                        }
356                }
357
358                my $membersText = "" ;
359                if (scalar (@{$relMem1{$relId}}) > 0) {
360                        my $i ;
361                        for ($i=0; $i<scalar (@{$relMem1{$relId}}); $i++) {
362                                $membersText = $membersText . ${$relMem1{$relId}[$i]}[0] . " : " . historyLink (${$relMem1{$relId}[$i]}[0], ${$relMem1{$relId}[$i]}[1]) . " : " . ${$relMem1{$relId}[$i]}[2] . "<br>";
363                        }
364                }
365
366
367                if ($relChanged) {
368                        $line++ ;
369                        printHTMLRowStart ($html) ;
370
371
372                        printHTMLCellLeft ($html, $line) ;
373                        printHTMLCellLeft ($html, historyLink ("relation", $relId)) ;
374                        printHTMLCellLeft ($html, $tagsText) ;
375                       
376
377                        my $changes = "<strong>Deleted Tags</strong><br>" . $deletedTags ;
378                        $changes = $changes . "<br><br><strong>Added Tags</strong><br>" . $addedTags ;
379                        $changes = $changes . "<br><br><strong>Deleted Members</strong><br>" . $deletedMembers ;
380                        $changes = $changes . "<br><br><strong>Added Members</strong><br>" . $addedMembers ;
381                        printHTMLCellLeft ($html, $changes) ;
382
383                        printHTMLRowEnd ($html) ;
384                }
385        }
386}
387
388printHTMLTableFoot ($html) ;
389
390
391
392
393
394my $time1 = time() ;
395
396print $html "<p>", stringTimeSpent ($time1-$time0), "</p>\n" ;
397printHTMLFoot ($html) ;
398
399close ($html) ;
400
401print "\n$program finished after ", stringTimeSpent ($time1-$time0), "\n\n" ;
402
Note: See TracBrowser for help on using the repository browser.