source: subversion/applications/utils/sv-stat/SV-Stat.pl @ 13729

Last change on this file since 13729 was 13729, checked in by tabacha, 11 years ago

Bugfix

  • Property svn:executable set to *
File size: 21.1 KB
Line 
1#!/usr/bin/perl -w
2use utf8;
3use Time::Local;
4use Text::LevenshteinXS qw(distance);
5use XML::Parser;
6use strict; # geht leider noch nicht
7use vars qw($ort $ortURL $ortHTML $bundesland $pw_schutz
8            $standdate $csvSpalteStr $csvSpalteOrt
9            $osmosis_source $osmosis_polygon
10            $osmosis_minLat $osmosis_maxLat
11            $osmosis_minLon $osmosis_maxLon
12            $bildSource $bugWikiText $bugWikiURL
13            $csvSeperator $nutzungsErlaubnis $printBild
14            $java_bin $osmosisjar $debug $autocoordinaten
15            $strip_dash_names $link_unknown
16            $bzip2_bin
17            );
18$java_bin="/usr/local/java/jre1.6.0_05.amd64/bin/java";
19$osmosisjar="/home/sven/gps/hamburg-stat/osmosis-0.26/osmosis.jar";
20$bzip2_bin="/usr/bin/bzip2";
21$csvSeperator=",";
22$pw_schutz=9;
23$standdate="";
24$bugWikiURL="";
25$bugWikiText="";
26$nutzungsErlaubnis="";
27$csvSpalteOrt=-1;
28$csvSpalteStr=-1;
29$printBild=0;
30$debug=0;
31$bundesland="";
32$bildSource="Quelle:unbekannt";
33# Koordinaten aus *.coordinaten nehmen ->0 Koordinaten aus OSM "place=suburb" Tag erzeugen ->1 (Eine coordinaten.autogen Datei wird automatisch erzeugt)
34$autocoordinaten=1;
35# Bindestriche in Straßennahmen aus .csv und OSM entfernen? Führt zu Missverständnissen, wenn die Striche weg sind und User auf dieser Basis neue Straßen taggen
36$strip_dash_names=0;
37# einen Link hinter nicht vorhandenen Straßen erstellen, damit man weiss wo man noch zum mappen hinfahren muss.
38$link_unknown=1;
39my $name="";
40my $highway="";
41my %streets;
42my $timeMax=0;
43my $timeMaxStr="unbekannt";
44my $streetLat;
45my $streetLon;
46my %osmLat;
47my %osmLon;
48my %coordLat;
49my %coordLon;
50my $plz;
51my %postal_code;
52my $xmlstadtteil;
53my $xmlnodeid;
54my %stadtteillat;
55my %stadtteillon;
56
57sub getPrintable {
58    my $str=shift;
59    $str=~s/ä/ae/g;
60    $str=~s/ö/oe/g;
61    $str=~s/ü/ue/g;
62    $str=~s/Ä/Ae/g;
63    $str=~s/Ö/Oe/g;
64    $str=~s/Ü/Ue/g;
65    $str=~s/ß/sz/g;
66    $str=~s/\W//g;
67    return $str;
68
69}
70sub colorPrz {
71    my $prozent=shift;
72    my $color="#FFFFFF";
73    if ($prozent==100) {
74        $color="#00FF00";
75    } elsif ($prozent>90) {
76        $color="#00CC00";
77    } elsif ($prozent>80) {
78        $color="#009900";
79    } elsif ($prozent>60) {
80        $color="#FFFF00";
81    } elsif ($prozent>40) {
82        $color="#FFCC00";
83    } elsif ($prozent>20) {
84        $color="#FF9900";
85    } else {
86        $color="#FF0000";
87    }
88    return $color;
89}
90sub xmlStart { 
91    my ($wert_des_zeigers,$starttag,%hash) = @_;
92    if (defined($hash{'timestamp'}) and ($hash{'timestamp'}=~/(\d\d\d\d)\-(\d\d)\-(\d\d)T(\d\d):(\d\d):(\d\d)Z/)) {
93        my $timeA = timegm($6,$5,$4,$3,$2-1,$1);
94        if ($timeA>$timeMax) {
95            $timeMax=$timeA;
96            $timeMaxStr="$4:$5:$6 Uhr $3.$2.$1";
97            #print "TIME: $1 $2 $3 $4 $5 $6 \n";
98        }
99    }
100    if ($starttag eq "way") {
101        $name="";
102        $highway="";
103        $plz="";
104        $streetLat="";
105        $streetLon="";
106        print "way-start\n" if $debug;
107    } elsif ($starttag eq "tag") {
108        if ($hash{'k'} eq "highway") {
109            $highway=$hash{'v'};
110            print "highway:$highway\n" if $debug;
111        } elsif ($hash{'k'} eq "name") {
112            $name=$hash{'v'};
113            print "name:$name\n" if $debug;
114        } elsif ($hash{'k'} eq "postal_code") {
115            $plz=$hash{'v'};
116        } elsif (($hash{'k'} eq "place") and ($hash{'v'} eq "suburb")) {
117            $xmlstadtteil=1;
118        }
119    } elsif ($starttag eq "node") {
120        my $id=$hash{'id'};
121        $xmlstadtteil=0;
122        $name="";
123        $xmlnodeid=$id;
124        $osmLat{$id}=$hash{'lat'};
125        $osmLon{$id}=$hash{'lon'};
126    } elsif ($starttag eq "nd") {
127        my $ref=$hash{'ref'};
128        if (defined($osmLat{$ref})) {
129            $streetLat=$osmLat{$ref};
130            $streetLon=$osmLon{$ref};
131        }
132    }
133}
134sub xmlEnd { 
135    my ($wert_des_zeigers,$endtag) = @_;
136    if ($endtag eq "way" ) {
137        print "way-end $name $highway\n" if $debug;
138       
139        if (($highway ne "") or ($name=~ /Platz der j/)) {
140            utf8::decode($name);
141              if ($strip_dash_names==1) {
142                  $name=~s/-/ /g;
143              }
144              if ($name ne "") {
145                  $streets{$name}="nur in OSM";
146                  $coordLat{$name}=$streetLat;
147                  $coordLon{$name}=$streetLon; 
148                  if ($plz ne "") {
149                      if (defined($postal_code{$name})) {
150                          my @plzar=split(/;/,$postal_code{$name});
151                          my %plzh;
152                          foreach my $p (@plzar) {
153                              $plzh{$p}=1;
154                          }
155                          @plzar=split(/;/,$plz);
156                          foreach my $p (@plzar) {
157                              $plzh{$p}=1;
158                          }
159                          $postal_code{$name}=join(";",sort(keys(%plzh)));
160                      } else {
161                          $postal_code{$name}=$plz;
162                      }
163                  }
164              }
165          }
166        print "$streetLat,$streetLon\n" if $debug;
167    } elsif ($endtag eq "node") {
168        if (($xmlstadtteil eq 1) and ($name ne "") and ($autocoordinaten eq 1)) {
169            $stadtteillat{$name}=$osmLat{$xmlnodeid};
170            $stadtteillon{$name}=$osmLon{$xmlnodeid}; 
171            print "Neuer Stadtteil: $name $stadtteillon{$name} $stadtteillat{$name}\n" if $debug;
172        }
173    }
174
175}
176
177sub formatStadtteilAusSV {
178    my $s=shift;
179    $s=~s/\"$//;
180    $s=~s/^\"//;
181    $s=~s/(\s*)$//;
182    return $s;
183
184}
185sub formatNameAusSV {
186    my $n=shift;
187    $n=~s/^\"//;
188    $n=~s/\"$//;
189    $n=~s/\s\s\d.*$//;
190    $n=~s/\s*$//;
191    if ($strip_dash_names==1) {
192         $n=~s/-/ /g;
193     }
194    $n=~s/(\s*)$//;
195    $n=~s/str.$/straße/;
196    $n=~s/\sStr.$/ Straße/;
197    while ($n=~s/\s\s/ /) {
198    }
199
200    return $n;
201}
202
203sub formatFehler {
204    my $n=shift;
205    $n=~s/strasse/stra<b>ss<\/b>e/;
206
207    $n=~s/Strasse/Stra<b>ss<\/b>e/;
208    $n=~s/stasse/s<b>tass<\/b>e/;
209    $n=~s/Stasse/S<b>tass<\/b>e/;
210   
211    $n=~s/bruecke/br<b>ue<\/b>cke/;
212    $n=~s/brüce/b<b>rüc<\/b>ce/;
213    $n=~s/Str\./<b>Str.<\/b>/;
214    $n=~s/str\./<b>str.<\/b>/;
215    $n=~s/Staße/St<b>aß<\/b>e/;;
216    $n=~s/staße/st<b>aß<\/b>e/;;
217   
218    return $n;
219}
220
221if (-f "localSettings.pm") {
222    require "localSettings.pm";
223}
224if ($#ARGV>-1) {
225    my $conffile=$ARGV[0];
226    if (-f $conffile) {
227        require $conffile;
228    } else {
229        die("Config Datei $conffile nicht gefunden");
230    }
231} else {
232    print "Usage: $0 <ConfigDatei>\n";
233    exit 1;
234}
235
236$ortHTML=$ort;
237$ortHTML=~s/ü/&uuml;/g;
238$ortHTML=~s/ü/&uuml;/g;
239$ortHTML=~s/ä/&auml;/g;
240$ortHTML=~s/ö/&ouml;/g;
241$ortHTML=~s/ö/&ouml;/g;
242$ortHTML=~s/Ü/&Uuml;/g;
243$ortHTML=~s/Ä/&Auml;/g;
244$ortHTML=~s/Ö/&Ouml;/g;
245$ortHTML=~s/ß/&szlig;/g;
246if ($bugWikiURL eq "") {
247    $bugWikiURL="http://wiki.openstreetmap.org/index.php/$ortURL-stat";
248}
249if ($bugWikiText eq "") {
250    $bugWikiText="$ortURL-stat";
251}
252$pw_schutz!=9 or die("Fehlerhafte configDatei: pw_schutz");
253$standdate ne "" or die("Fehlerhafte configDatei: standdate");
254$nutzungsErlaubnis ne "" or die("Fehlerhafte configDatei: nutzungsErlaubnis");
255
256
257
258if (!(-d $ortURL)) {
259    mkdir($ortURL);
260} else {
261    opendir(DIR,$ortURL);
262    my @entry=readdir(DIR);
263    closedir(DIR);
264    foreach my $file (@entry) {
265        if (-f "$ortURL/$file" ) {
266            unlink("$ortURL/$file");
267        }
268    }
269}
270if (!(-d "$ortURL/s")) {
271    mkdir("$ortURL/s");
272}  else {
273    opendir(DIR,"$ortURL/s");
274    my @entry=readdir(DIR);
275    closedir(DIR);
276    foreach my $file (@entry) {
277        if (-f "$ortURL/s/$file" ) {
278            unlink("$ortURL/s/$file");
279        }
280    }
281
282}
283############################################################################
284# Osmosis
285############################################################################
286my @osmosiscmd=();
287my $zuschnittStr="";
288if (defined($osmosis_source))  {
289    my $doit=0;
290    if (-f "$ortURL.osm.bz2") {
291        my @statsource=stat($osmosis_source);
292        my @statdestination=stat("$ortURL.osm.bz2");
293        $doit=($statsource[9]>$statdestination[9]);
294        if ($doit==0) {
295            print "do not run osmosis: Source is older than Destination\n" if $debug;
296        }
297    } else {
298        $doit=1;
299    }
300    if (defined($osmosis_minLat)) {
301        defined($osmosis_maxLat) or die("osmosis_maxLat not defined");
302        defined($osmosis_maxLon) or die("osmosis_maxLon not defined");
303        defined($osmosis_minLon) or die("osmosis_minLon not defined");
304        (-f $osmosis_source) or die("Osmosis Source $osmosis_source not found");
305        @osmosiscmd=($java_bin,"-jar",$osmosisjar,
306                     "--rx","file=$osmosis_source",
307                     "--bb",
308                     "top=$osmosis_maxLat",
309                     "bottom=$osmosis_minLat",
310                     "left=$osmosis_minLon",
311                     "right=$osmosis_maxLon",
312                     "--wx","file=$ortURL.osm");
313        $zuschnittStr="Der Zuschnitt erfolgte durch die Koordinaten: ($osmosis_minLat,$osmosis_minLon),($osmosis_maxLat,$osmosis_maxLon).";
314    } elsif (defined($osmosis_polygon)) {
315       
316        @osmosiscmd=($java_bin,"-jar",$osmosisjar,
317                     "--rx","file=$osmosis_source",
318                     "--bp","file=$osmosis_polygon",
319                     "--wx","file=$ortURL.osm");
320        $zuschnittStr="Der Zuschnitt erfolgte durch das Polygon: <a href=\"$osmosis_polygon\">$osmosis_polygon</a>.";
321        my @cmd=("/bin/cp",$osmosis_polygon,$ortURL."/");
322        system(@cmd)==0 or die;
323    } else {
324        die("osmosis_source is defined but no lat/lon or poly");
325    }
326    if ($doit==0) {
327        @osmosiscmd=();
328    }
329}
330if ($#osmosiscmd>-1) {
331    if (-f "$ortURL.osm.bz2") {
332        print "rm $ortURL.osm.bz2\n" if $debug;
333        unlink("$ortURL.osm.bz2");
334    }
335    print join(" ",@osmosiscmd),"\n" if $debug;
336    system(@osmosiscmd)==0 or die("Osmosis died with exit code: $?");
337    # Bzip
338    my @bzipcmd=($bzip2_bin,"$ortURL.osm");
339    print join(" ",@bzipcmd),"\n" if $debug;
340    system(@bzipcmd)==0 or die("Bzip2 died with exit code: $?");
341}
342
343
344############################################################################
345
346my %foundIn;
347my %missingIn;
348my %nichtInOrt;
349my %nichtImGV;
350my %rausAusGV;
351my %stadtteile;
352if (-f "$ortURL.ausnahme.wiki") {
353    open(FILE,"$ortURL.ausnahme.wiki") or die;
354    my $count=0;
355    foreach my $line (<FILE>) {
356        if ($line=~/^==.*==/) {
357            $count++;
358        }
359        if (($line=~/^\*\s*(.*),\s*(\d*\.\d*)\s*,\s*(\d*\.\d*)/) and ($count==1)) {
360            ## Nicht im Ort
361            my $strname=$1;
362            utf8::decode($strname);
363            my $lat=$2;
364            my $lon=$3;
365            $nichtInOrt{$strname}{"lat"}=$lat;
366            $nichtInOrt{$strname}{"lon"}=$lon;
367            print "STR:$strname\n" if $debug;
368            print "$count$line" if $debug;
369        }
370        if (($line=~/^\*\s*(.*),\s*(.*\S)\s*,\s*(\d*\.\d*)\s*,\s*(\d*\.\d*)/) and ($count==2)) 
371        {
372            # Nicht im Gebietsverzeichnis
373            my $strname=$1;
374            utf8::decode($strname);
375            my $begr=$2;
376            my $lat=$3;
377            my $lon=$4;
378            $nichtImGV{$strname}{"lat"}=$lat;
379            $nichtImGV{$strname}{"lon"}=$lon;
380            $nichtImGV{$strname}{"begr"}=$begr;
381            print "$count$line" if $debug;
382        }
383        if (($line=~/^\*\s*(.*),\s*(.*)/) and ($count==3)) {
384            ## Aus Gebietsverzeichnis löschen
385            my $strname=$1;
386            my $stadtteil=$2;
387            utf8::decode($strname);
388            utf8::decode($stadtteil);
389            $rausAusGV{$strname}=$stadtteil;
390            print "$count$line" if $debug;
391            print $line;
392        }
393    }
394    close(FILE);
395}
396
397############################################################################
398$streetLat=$streetLon="";
399my $xmlP = new XML::Parser ();
400$xmlP->setHandlers (Start => \&xmlStart,
401                    End => \&xmlEnd);
402
403open(FILE,"bzcat $ortURL.osm.bz2 |") or die("File $ortURL.osm.bz2 not found");
404$xmlP->parse(*FILE);
405close(FILE);
406############################################################################
407if ($autocoordinaten!=1) {
408    open(FILE,"$ortURL.coordinaten") or die("File $ortURL.coordinaten not found");
409    foreach my $line (<FILE>) {
410        chop $line;
411        if (!($line=~/^(\s*)$/))  {
412            my @arr=split /\t/,$line;
413            my $name=$arr[1];
414#    utf8::decode($name);
415            $stadtteillat{$name}=$arr[2];
416            $stadtteillon{$name}=$arr[3];
417            print "yyy $name $stadtteillat{$name} $stadtteillon{$name}\n" if $debug;
418        }
419    }
420    close(FILE); 
421} else {
422    open(FILE,">$ortURL.coordinaten.autogen") or die("Cannot create file $ortURL.coordinaten.autogen");
423    my $count=0;
424    foreach my $line (sort (keys %stadtteillat)) {
425        $count++;
426        print FILE "$count\t$line\t$stadtteillat{$line}\t$stadtteillon{$line}\n";
427    }
428    close(FILE);
429}
430
431
432############################################################################
433open(FILE,"$ortURL.csv") or die("Can not open $ortURL.csv");
434my $old=<FILE>;#Kopfzeile
435$old="";
436my $summFound=0;
437my $summMiss=0;
438
439while (my $line=<FILE>) {
440    chop $line;
441    if (!($line=~/^(\s*)$/)) {
442        my @fi=split /$csvSeperator/,$line;
443        if ($old ne $fi[$csvSpalteStr]) {
444            $name=$fi[$csvSpalteStr];
445        utf8::decode($name);   
446        $name=formatNameAusSV($name);
447
448        my $stadtteil=$fi[$csvSpalteOrt];
449        if (($csvSpalteOrt==-1) or (!defined($stadtteil))) {
450            $stadtteil="";
451        }
452        utf8::decode($stadtteil);
453        $stadtteil=&formatStadtteilAusSV($stadtteil);
454        if ($stadtteil eq "") {
455            $stadtteil="$ort";
456        }
457
458
459        my $skip=0;
460        $skip=1 if ($name=~/^(\d*)$/);
461       
462        if (defined($rausAusGV{$name})) {
463            if ($rausAusGV{$name} eq $stadtteil ) {
464                $skip=1;
465                print "Skipping: $name\n";
466            } else {
467                print "Falscher Stadtteil \"",$rausAusGV{$name},"\"!=\"",$stadtteil,"\"\n";
468            }
469        }
470        if ($skip==0) {
471            #print "$name\n";
472            $old=$fi[$csvSpalteStr];
473            $stadtteile{$stadtteil}=1;
474            if (defined($streets{$name})) {
475                $streets{$name}="in OSM und $ortHTML $stadtteil";
476                push @{$foundIn{$stadtteil}},$name;
477                $summFound++;
478            } else {
479                $streets{$name}="nur in $ortHTML $stadtteil";
480                push @{$missingIn{$stadtteil}},$name;
481                $summMiss++;
482               
483            }
484        }}
485    }
486}
487close(FILE);
488############################################################################
489foreach my $name (keys %nichtImGV) {
490    print $name if $debug;
491    if (defined($streets{$name})) {
492        if ($streets{$name} eq "nur in OSM") {
493            $streets{$name}="Im Ausnahmeverzeichnis ($nichtImGV{$name}{'begr'})";
494        }
495    }
496}
497############################################################################
498my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;
499$year+=1900;
500$mon++;
501my $standd=sprintf("%d.%d.%d %d:%02d",$mday,$mon,$year,$hour,$min);
502my $lbundesland=lc($bundesland);
503my $stand="<p>Letze Aktualisierung: $standd Uhr (Neuester Timestamp im OSM File: $timeMaxStr) Copyright <a href='http://creativecommons.org/licenses/by-sa/2.0/'>CC-By-SA</a> Daten von <a href='http://download.geofabrik.de/'>http://download.geofabrik.de/</a><a href='http://download.geofabrik.de/osm/europe/germany/$lbundesland.osm.bz2'>osm/europe/germany/$lbundesland.osm.bz2</a>. Diese Daten werden wiederum regelmäßig von <a href='http://www.openstreetmap.org/'>www.openstreemap.org</a> geladen. ";
504$stand.=$zuschnittStr;
505$stand.="</p><p>$nutzungsErlaubnis";
506if ($pw_schutz==1) {
507    $stand.="<p>Wichtig: Um auf die Ortsteilseiten Zugriff zu bekommen, benötigst du ein Passwort. Dieses bekommst du, wenn du bei OSM mitwirkst und das
508glaubhaft per E-Mail an:
509<b>hh-osm-passwort</b> (AT) <b>sven.anders.im</b> bekundest. Weitergabe dieses Passworts und der Stadtteilseiten ist nicht gestattet!</p>";
510    system("cp htaccess $ortURL/s/.htaccess");
511} elsif (-f "$ortURL/s/.htaccess") {
512    unlink("$ortURL/s/.htaccess") or die;
513}
514
515$stand.=" Jegliche andere Nutzung ist nur nach Genehmigung gestattet.</p>";
516open(INDEX,">$ortURL/index.html") or die;
517open(COLOR,">$ortURL/stadtteil.color") or die;
518open(SCRIPT,">$ortURL/myscript.sh") or die;
519print SCRIPT "#!/bin/sh\n";
520my $out1="";
521my $out2="";
522my $out3="";
523my $out4="";
524my $out5="";
525my $out6="";
526my $kommentar="<p>Kommentare und Verbesserungsvorschläge bitte auf die Wiki Seite <a href='$bugWikiURL'>$bugWikiText</a> Danke!</p>";
527print INDEX "<html><body>";
528print INDEX "<h1>$ortHTML</h1>";
529print INDEX $stand;
530if ($printBild==1) {
531    print INDEX "<p><img src=\"$ortURL.png\" alt=\"$ortHTML\" />$bildSource</p>\n";
532}
533print INDEX "<h1>Alphabetisch sortiert</h1>";
534print INDEX "<table>";
535print INDEX "<tr><th>Stadtteil</th><th>fehlende</th><th>gefundene</th><th>Gesamt</th><th>Prozent</th></tr>\n";
536foreach my $stadtteil (sort (keys %stadtteile)) {
537   
538    my $prstadtteil=&getPrintable($stadtteil);
539    if ($stadtteil ne "") {
540        open(OUT,">$ortURL/s/$prstadtteil.html") or die;
541        my $found=0;
542        my $miss=0;
543        print OUT "<html><body>\n";
544        print OUT "<h1>$stadtteil</h1>\n";
545        print OUT "$stand";
546        if (defined($missingIn{$stadtteil})) {
547            print OUT " <h1>Es fehlen noch:</h1>\n<ul>\n";
548            foreach my $k (sort @{$missingIn{$stadtteil}}) {
549
550                if ($link_unknown==1) {
551                    my $ku=$k;
552                    $ku=~s/ /+/g;
553                    print OUT "<li>$k (<a href=\"http://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=$ku,+$ort\">GoogleMaps</a>)</li>\n";
554                } else {
555                    print OUT "<li>$k</li>\n";
556                }       
557                $miss++;
558            }
559            print OUT "</ul>";
560        } else {
561            print OUT " Es fehlen keine Strassen mehr\n";
562        }
563        if (defined($foundIn{$stadtteil})) {
564            print OUT "</ul><h1>Bereits in OSM:</h1>\n<ul>\n";
565            foreach my $k (sort @{$foundIn{$stadtteil}}) {
566                my $plz="";
567                if (defined($postal_code{$k})) {
568                    $plz=" ($postal_code{$k})";
569                }
570                print OUT "<li>$k$plz</li>\n";
571                $found++;
572            }
573            print OUT "</ul>";
574        }else {
575            print OUT " Es sind noch keine Strassen in OSM erfasst\n";
576        }
577        print OUT $kommentar;
578        print OUT "<a href=\"Nur_in_OSM.html#$stadtteil\">Zu den nur in OSM erfassten Str. aus $stadtteil</a>";
579        print OUT "<br/><a href=\"../index.html\">Startseite</a>";
580        print OUT "</body></html>\n";
581        my $summe=$found+$miss;
582        my $prozent=$found/($summe)*100;
583        my $color=&colorPrz($prozent);
584        my $outstr="<tr bgcolor=\"$color\"><td><a href=\"s/$prstadtteil.html\">$stadtteil</a></td>\n".
585            "<td>$miss</td>\n<td>$found</td>\n<td>$summe</td>\n".
586            sprintf  "<td>%.1f %% </td></tr>\n\n",$prozent;
587        print INDEX $outstr;
588        print COLOR "$stadtteil,$color\n";
589        print SCRIPT "echo -n .\n";
590        print SCRIPT "./doStadteilMap.pl -o \"$prstadtteil.png\" --stadtteil \"$stadtteil\"\n";
591        if ($prozent==100) {
592            $out1.=$outstr;
593        } elsif ($prozent>80) {
594            $out2.=$outstr;
595        } elsif ($prozent>60) {
596            $out3.=$outstr;
597        } elsif ($prozent>40) {
598            $out4.=$outstr;
599        } elsif ($prozent>20) {
600            $out5.=$outstr;
601        } else {
602            $out6.=$outstr;
603        }
604
605        close(OUT);
606    }
607}
608close COLOR;
609close SCRIPT;
610my $prozent=0;
611if ($summFound+$summMiss>0) {
612    $prozent=$summFound/($summFound+$summMiss)*100;
613}
614
615my $seperator="<tr><td>&nbsp;</td><td></td><td></td><td></td></tr>\n";
616my $color=&colorPrz($prozent); 
617print INDEX $seperator;
618print INDEX "<tr bgcolor=\"$color\"><td>$ortHTML gesamt</a></td>\n";   
619print INDEX "<td>$summMiss</td>\n<td>$summFound</td>\n";
620printf INDEX "<td>%d</td>\n",($summFound+$summMiss);
621printf INDEX "<td>%.1f %% </td></tr>\n\n",$prozent;
622print INDEX "</table> <h1>Nach Abdeckungsgrad sortiert</h1>\n";
623print INDEX "<table>";
624print INDEX "<tr><th>Stadtteil</th><th>fehlende</th><th>gefundene</th><th>Gesamt</th><th>Prozent</th></tr>\n";
625print INDEX $out1.$seperator if ($out1 ne "");
626print INDEX $out2.$seperator if ($out2 ne "");
627print INDEX $out3.$seperator if ($out3 ne "");
628print INDEX $out4.$seperator if ($out4 ne "");
629print INDEX $out5.$seperator if ($out5 ne "");
630print INDEX $out6.$seperator if ($out6 ne "");
631print INDEX "<tr bgcolor=\"$color\"><td>$ortHTML gesamt</a></td>\n";   
632print INDEX "<td>$summMiss</td>\n<td>$summFound</td>\n";
633printf INDEX "<td>%d</td>\n",($summFound+$summMiss);
634printf INDEX "<td>%.1f %% </td></tr>\n\n",$prozent;
635print INDEX  "</table>\n";
636print INDEX "<h1>Straßen die nicht im Verzeichnis sondern nur in OSM sind</h1>";
637print INDEX  "<a href=\"s/Nur_in_OSM.html\">Nur in OSM</a>\n";
638print INDEX $kommentar;
639print INDEX  "</body></html>\n";
640close(INDEX);
641open(OUT,">$ortURL/s/Nur_in_OSM.html") or die;
642print OUT "<html><body>\n<h1>Nur in OpenStreetMap</h1>\n<ul>";
643my %stadtteilOut;
644foreach my $k (sort (keys %streets)) {
645    if ($streets{$k} eq "nur in OSM") {
646     my $ausnahme=0;
647     if (defined($nichtInOrt{$k}{"lat"})) {
648       my $ent=(($nichtInOrt{$k}{"lat"}-$coordLat{$k})**2)+(($nichtInOrt{$k}{"lon"}-$coordLon{$k})**2);
649       $ent=$ent*1000;
650       if ($ent<2) {
651         print OUT "<li>$k (nicht in $ortHTML / in Ausnahmeliste Entfernung: $ent )</li>\n";
652         $ausnahme=1;
653       }
654     } 
655     if ($ausnahme==0) {
656        my $c=9999999999999999999;
657        my $st="";
658        foreach my $stadtteil (keys %stadtteillat) {
659            if (!(defined($coordLat{$k}))) {
660                warn("coordLat $k undef $stadtteil");
661            }
662            if (!(defined($stadtteillon{$stadtteil}))) {
663                warn("lon x$stadtteil"."x undef");
664            }
665            if (!(defined($stadtteillat{$stadtteil}))) {
666                warn("lat x$stadtteil"."x undef");
667            }
668            my $ent=(($stadtteillat{$stadtteil}-$coordLat{$k})**2)+
669                    (($stadtteillon{$stadtteil}-$coordLon{$k})**2);
670            if ($ent<$c) {
671                $c=$ent;
672                $st=$stadtteil;
673            }
674        }
675        my $dista=99999;
676        my $mightbe="";
677        foreach my $other (sort (keys %streets)) {
678            if ($streets{$other} ne "nur in OSM") {
679                my $di=distance($k,$other);
680#               print "$other $k\n";
681                if ($dista>=$di) {
682                    if ($dista>$di) {
683                        $mightbe="";
684                    } else {
685                        $mightbe.=", ";
686                    }
687                    $dista=$di;
688                    $mightbe.="$other ($streets{$other})"
689                }
690               
691            }
692        }
693        my $kk=&formatFehler($k);
694       
695        $c=$c*1000;
696        my $pst=$st;
697        utf8::decode($pst);
698        my $str="<li>$kk (vermutlich in $pst, Entfernung: $c) <a href=\"http://www.informationfreeway.org/?lat=$coordLat{$k}&lon=$coordLon{$k}&zoom=17\">InfFree Karte</a>
699<a href=\"http://www.openstreetmap.org/?mlat=$coordLat{$k}&mlon=$coordLon{$k}&zoom=16\">OSM Karte</a>";
700
701        if ($dista<4) {
702            $str.="<br/>(Ähnliche Namen: $mightbe)\n";
703        }
704            $str.="</li>\n";
705        print OUT $str;
706
707        if (!defined ( $stadtteilOut{$st})) {
708            $stadtteilOut{$st}="";
709        }
710        $stadtteilOut{$st}.=$str;
711      }
712    }
713}
714print OUT "</ul>";
715print OUT "<h1>Nach Stadtteilen:</h1>\n";
716foreach my $k (sort (keys %stadtteilOut)) {
717    my $prK=&getPrintable($k);
718    my $pk=$k;
719    utf8::decode($pk);
720    print OUT "<a name=\"$pk\"></a><h2><a href=\"$prK".".html\">$pk</a></h2>\n";
721    print OUT "<ul>\n";
722    print OUT $stadtteilOut{$k};
723    print OUT "</ul>\n";
724}
725print OUT "<h1>Eingetragene Ausnahmen:</h1>\n";
726print OUT "<ul>\n";
727   
728foreach my $k (sort (keys %streets)) {
729    if ($streets{$k}=~/Im Ausnahmeverzeichni/) {
730        print OUT "<li>\n";
731        print OUT "<b>".$k."</b> - ".$streets{$k};
732        print OUT "</ll>\n";
733    }   
734}
735print OUT "</ul>\n";
736print OUT "</body></html>\n";
737close(OUT);
738
Note: See TracBrowser for help on using the repository browser.