Pflege der deutschen PLZ-Daten in OSM

Moin Walter,

für Meck-Pomm und Sachsen sind immer noch die alten Auswertungen verlinkt.

Gruß,

Baßtölpel

Sorry, Kaffee war noch nicht fertig.

Ich möchte diese lästige “in-das-Wiki-Übertragen” endlich mal automatisieren. Da soll es ja eine API für geben. Und dann kann ich auch die Reports automatisch auf den Webserver kopieren. Jetzt geht das alles nur per Hand.

Gruss
walter

Verlinke doch im Wiki nur eine Report-Seite auf Deinem eigenen Webserver. Die kannst Du dann automatisch generieren.

Du wirst es nicht glauben aber ich habe keinen “richtigen” Webserver. Bei mir “tanzt” nicht ein einfacher Apache rum sondern da läuft Jetty. Da müsste ich einige Klimmzüge machen um eine einfache Webseite anzubieten.

Und das macht mit einfach keinen Spass - warum einfach, wenn es auch kompliziert geht :wink:

Gruss
walter

Du bietest doch die Irrläuferlisten in einem Verzeichnis per http an. Kannst Du da nicht auch eine simple HTML-Seite als Übersicht hinlegen?

Nee, wenn du dir den Link genau ansiehst (z.b. https://osm.wno-edv-service.de/DataServer/osm/files/plz/irrl%C3%A4ufer_sachsen.txt ) solltest du dort den DataServer sehen. Das ist eine kleine von mir in Java geschriebene Mini-Anwendung, die einzig und allein Grafiken und Datenfiles liefern kann. Also ein Micro-Webserver. Und der hat mir schon genug Arbeit gemacht.

Damit du mal einen Eindruck über den Aufwand hast:

package com.wno;

import java.lang.String;

import java.awt.image.BufferedImage;
import java.awt.Dimension;

import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.commons.io.FilenameUtils;

import java.net.URLDecoder;

import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;

import magick.ImageInfo;
import magick.MagickImage;
import magick.MagickException;

public class getData extends HttpServlet {

   private String myName = "getData";
   private static final int DEFAULT_BUFFER_SIZE = 10240;
   private String dataPath;        

    private static <T> T coalesce(T ...items) {
       for(T i : items) if(i != null) return i;
       return null;
    }

   public void init() throws ServletException {

       // Define base path somehow. You can define it as init-param of the servlet.
       this.dataPath = "/home/walter/osm/maven/DataServer/data/";
    }

   private void createThumbnail(File full, File thumb, int newWidth) {


      String myName = "createThumbnail";      

      System.setProperty("jmagick.systemclassloader","false");

      try {
         SimpleLog.write("plz",myName+"full.getPath()="+full.getPath());
         ImageInfo info = new ImageInfo(full.getPath());
         MagickImage mImage = new MagickImage(info);
         Dimension orgDim = mImage.getDimension();
         int width = (int) orgDim.getWidth();
         int height = (int) orgDim.getHeight();
         SimpleLog.write(myName,"Image size: "+width+"x"+height);
         double f = width / newWidth;
         double h = height / f + 0.5;
         int newHeight = (int) h;
         SimpleLog.write(myName,"New Image size: "+newWidth+"x"+newHeight);
	 mImage = mImage.scaleImage(newWidth, newHeight);

         mImage.setFileName(thumb.getPath());
         SimpleLog.write(myName,"writing "+thumb);
         mImage.writeImage(info);
      }
      catch (MagickException me) {
        me.printStackTrace();
      }

      return;
   }

    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException {
        


        HttpSession httpsession = request.getSession();
        String sessionId = httpsession.getId();

//      myName = sessionId + " " + myName; 
                            
        int rc  = 0;

        SimpleLog.write(myName+" RemoteHost="+request.getRemoteHost());
//      SimpleLog.write(myName+" request=\""+request.getQueryString()+"\"");
        SimpleLog.write(myName+" referer="+request.getHeader("referer"));

//      SimpleLog.write(myName+" request=\""+request.getQueryString()+"\""); 
        SimpleLog.write(myName+" RequestURI=\""+request.getRequestURI()+"\""); 
        SimpleLog.write(myName+" RequestURL=\""+request.getRequestURL()+"\""); 
//      SimpleLog.write(myName+" PathInfo=\""+request.getPathInfo()+"\""); 

        String requestedFileName = request.getRequestURI().substring(11);        
        SimpleLog.write(myName+" requestedFileName="+requestedFileName);

        String decodedFileName = URLDecoder.decode(requestedFileName, "UTF-8");
        SimpleLog.write(myName+" decodedFileName="+decodedFileName); 

        File file = new File(dataPath, decodedFileName);
        SimpleLog.write(myName+" file="+file);

        // Get content type by filename.
        String contentType = getServletContext().getMimeType(file.getName());
        SimpleLog.write(myName+" got request with contentType="+contentType); 

        String extension = FilenameUtils.getExtension(decodedFileName);
        SimpleLog.write(myName+"extension="+extension); 

        boolean isImage = true;

        if (contentType == null ) {
           switch(extension) {
              case "osm":
                 contentType="application/xml";
                 break;
              case "obf":
                 contentType="application/osmand";
                 break;
              case "pbf":
                 contentType="application/pbf";
                 break;
              case "poly":
                 contentType="application/poly";
                 break;
              case "shp":
                 contentType="application/shp";
                 break;
              default:
                 contentType = "application/other";
           }        
           SimpleLog.write(myName+" generate contentType2="+contentType);
           isImage = false; 
        } 

        File data = null;

        // Check if file actually exists in filesystem.
        SimpleLog.write(myName+" checking for "+file);
        if (!file.exists()) {
           String bn = file.getName();
           SimpleLog.write(myName+" "+file+" xxx "+bn+" >"+bn.substring(0,3)+"<");
           if (bn.length() > 3 && bn.substring(0,3).equals("tn_")) {
              SimpleLog.write(myName+" "+file+" requested Thumbnail does not exist.");
              // Check if basis file exists
              // String bs = file.getFullPath()+ bn.substring(3);
              String bs = requestedFileName.replaceFirst("/tn_","/");
              SimpleLog.write(myName+" bs="+bs);
              File base = new File(dataPath, bs);
              if (base.exists()) {
                 SimpleLog.write(myName+" "+base+" found. Creating thumbnail");
                 createThumbnail(base,file,300);
                 SimpleLog.write(myName+" Thumbnail "+file+" created.");
                 data = file;
              }
              else {
                 response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
                 return;
              }
           }
           else {  
              SimpleLog.write(myName+" \""+file+"\" does not exist.");
              response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
              return;
           }  
        }
        else {
           String full  = dataPath+decodedFileName;
           data = new File(full);
        }

        // Init servlet response.
        response.reset();
//      SimpleLog.write(myName+" --> setBufferSize("+DEFAULT_BUFFER_SIZE+")");
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
//      SimpleLog.write(myName+" --> setContentType(\""+contentType+"\")");
        response.setContentType(contentType);
//      SimpleLog.write(myName+" --> setCharacterEncoding(\"UTF-8\")");
        response.setCharacterEncoding("UTF-8");
//      SimpleLog.write(myName+" --> setHeader(\"Content-Length\","+ String.valueOf(data.length())+")");
        response.setHeader("Content-Length", String.valueOf(data.length()));

        if (isImage) {
//         SimpleLog.write(myName+" --> setHeader(\"Content-Disposition\",\"inline; filename="+ data.getName()+"\")");
           response.setHeader("Content-Disposition", "inline; filename=\"" + data.getName() + "\")");
        }
        else {
//         SimpleLog.write(myName+" --> setHeader(\"Content-Disposition\",\"attachment; filename="+ data.getName()+"\")");
           response.setHeader("Content-Disposition", "attachment; filename=\"" + data.getName() + "\")");
        }

        // Prepare streams.
        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            // Open streams.
            input = new BufferedInputStream(new FileInputStream(data), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            // Write file contents to response.
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            // Gently close streams.
            close(output);
            close(input);
            rc=200;
            SimpleLog.write(myName+" --> response.setStatus("+rc+")");
            response.setStatus(rc);  
            SimpleLog.write(myName+" done rc="+rc);
        }
     }

// Helpers (can be refactored to public utility class) ----------------------------------------

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it.
                e.printStackTrace();
            }
        }
    }
}

Der liefert Grafiken und Datenfiles. Zudem erstellt er automatisch Thumbnails, da mir das zuviel manuelle Abbeit war. All das, was einen richtigen Webserver ausweist, kann er nicht.

Gruss
walter

tl;dr: Nö, will ich net :wink:

Hallo Walter,

Meck-Pomm habe ich durchgearbeitet und User Gehrke ist mir dabei auch begegnet :sunglasses: .
Bei Gelegenheit kannst du bitte mal einen Prüflauf machen, da müssten nur noch 1 - 2 PLZ-Relationen übrig bleiben an die ich nicht ran gegangen bin.

MfG

Senni

Hallo Leute,

habe mal Sachsen von unten angefangen.

09526 Olbernhau, Pfaffroda, Heidersdorf | {w200681938,w200681942,w200681945}
09623 Frauenstein | {n1614643755,n1614643871,n1614643905,n1614644065,n1614644070}

müssten sich mal Grenz-Experten ansehen, dort bilden sich Schläuche paralell zur CZ-Grenze.

Senn

Die Gemeindegrenze in Deutschgeorgenthal ist auf jeden Fall falsch. Das passe ich mal an.

Was für “Schläuche” meinst Du?

EDIT: Achso, der Schlauch ist so korrekt, aber wohl nicht vollständig bei Lochmühle.

Sankt Egidien, Gewerbegebiet Am Auersberg bitte derzeitig nicht ändern.

Hallo,

mir war jetzt zum 2. mal aufgefallen, dass alle Firmen in Sankt Egidien, Gewerbegebiet Am Auersberg, als Adresse 09350 Lichtenstein angeben.
Ich habe deshalb die Gemeinde per Mail angeschrieben um dies zu klären, denn laut deren Webseite und der Landesvermessung Sachsen gehört
das Gewerbegebiet nach Sankt Egidien.

Mal sehen was da raus kommt.

Senni

mahlzeit :wink:

Bayern ist durch - und wieder in rot: 327 → 335

Gruss
walter

Grummel. Ich werde den Kerl, der da in München regelmäßig den Schnitt versaut, doch mal anschreiben müssen. Bisher dachte ich, es wäre besser wenn ich es stillschweigend verbessere als daß er nach einer mail in meiner freundlichen Art ganz aufhört.

Baßtölpel

Das sieht zwar in der Statistik optisch schlecht aus, aber eine einzige Verbesserung macht schon über 100 weniger. Das macht weniger Arbeit als 20 neue Blöcke mit jeweils einem “Irren”. Ein (freundlicher) Hinweis, wenn es immer wieder derselbe ist, kann aber nicht schaden.
Ich war in der schwäbischen Provinz zu Gange und mache mit den 9ern vom Listenende weiter (Kleinvieh macht auch Mist).

Ich weiß. Es demotiviert aber schon sehr, zumal ich noch um die hundert Adressen habe die einzutragen wären, zwei Dutzend noch unbenannte Straßen und mehrere tausend georeferenzierte Fotos zu landuse, access und ähnlichem Kleinkram. Aber momentan bin ich aus Gründen die nichts mit OSM zu tun haben so sauer, daß ich mich hüte, jemanden anzuschreiben. Das kann nur in die Hose gehen.

Baßtölpel

moin moin,

schleswig-holstein: 13 → 39 und rheinland-pfalz 200 → 361

In beiden Fällen wieder ein einziger Block. Ich weiss auch nicht, wie man Mapper dazu motivieren kann, doch vor einer solchen Erfassung mal die Korrektheit zu überprüfen. Das können doch keine Newbies sein.

Gruss
walter

jo: SH ~1400 edits, RP ~2700 edits - beide zuletzt mit josm :frowning:

Hallo zusammen,
ich würde gern auf fehlerhafte Postleitzahlengebiete hinweisen, ist dies hier der richtige Platz dafür?

Ich selbst traue mir die Bearbeitung nicht zu und weiß auch gar nicht wie ich dies tuen sollte :roll_eyes:

kurz: ja :smiley:

Super :smiley:

Die gesamte Gemeinde Tangermünde inklusive OTs besitzt nur ein PLZ-Gebiet => 39590:
http://www.openstreetmap.org/relation/1284739#map=11/52.5455/11.9449

Quelle:
http://www.tangermuende.de/de/ortsteile.html

ich schau mal eben.

EDIT: Done!

Hi, heute Abend ist die Auswertung für NRW dran - wer keinen Fußball mag, hat noch bis ca 20:00 Uhr Zeit, was dran zu drehen.

es gilt noch ca. 500 “Irre” einzufangen :wink:

Gruss
walter