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

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

leisture Park und Statistik File

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