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

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

Unterstutze PLUS im Stadtteilnamen, Entfernungsangabe nur wenn vorhanden

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