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

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

strassenverzeichnis statistik

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