Pflege der deutschen PLZ-Daten in OSM

Lege lieber eine neue PLZ-Grenze an und taste das nicht an. Ich vermute das ist auch die Grenze für einen Ortsteil und sollte so bleiben.

Im Argen ist gut: Da ist nix

Versuche da mal anhand der TMCs und Wikipedia einen bescheidenen Anfang zu machen.

Danke und viel Erfolg.

Ist zwar im PLZ-Thread leicht OT aber schau mal:

http://osm.wno-edv-service.de:8080/DataServer/osm/forum/leipzig.svg

Da ist ein kleiner “Fliegenschiss” in Connewitz zu erkennen. Bin der Sache mal nachgegangen: Building als admin_centre - da muß man erst mal drauf kommen :wink:

Gruss
walter

@Chenshi: Ja, die Grafik ist ein SVG-Export aus der Boundaries-Karte. Näheres später dort.

Done! OT (Eigentlich Admin-Thema) Siehe hier: http://forum.openstreetmap.org/viewtopic.php?pid=430840#p430840

Nachdem ich Gera heute Früh fertig hatte, ist nun auch der Rest von Thüringen fertig bearbeitet. Besondere Schwierigkeiten machte mir Erfurt, wo scheinbar die Post PLZ der Puschkinstraße nördlich und südlich des Flusses getauscht hat - ist aber richtig, sieht auf der Karte der Post auch so aus.

Franz

Man kann es wirklich nicht oft genug schreiben: Die PLZ-Karte der Post ist Schrott

Einzige (einigermaßen) verlässliche PLZ-Quelle ist die PLZ-Seite der Post, aber nie und nimmer, bitte bitte nicht, auf keine Fall, bloss nicht die Karte der Post.

Gruss
walter

Moin Moin,

Niedersachsen 56 —> 3 :slight_smile:

Im Laufe des Tages kommen Meck-Pomm und Sachsen dran. Heute Abend Bayern.

In allen drei Bundesländern ist noch einiges zu tun.

Gruss
walter

Yep.

Worauf ich eigentlich hinauswollte, auch wenn es noch nicht lange her ist: vielleicht nochmal Sachsen anschmeißen? Ich bin schon von Senni angeschrieben worden, dass er auf meine Edits gestoßen ist.

Gruß Thomas

Hi, wer lesen kann, ist echt im Vorteil :wink: geh mal mit deinen Augen 2 Posts nach oben.

Gruss
walter

mp-läuft gerade

Zu meiner Verteidigung: als ich es abgeschickt hab, hab ichs noch nicht gesehen.

Ist schon klar: Wenn man angefangen hat zu schreiben, sieht man die Posts nicht, die bis zum Abschicken eingestellt wurden.
Hinweis: Ich gehe kurz vor dem Absenden idR erst auf “Vorschau”, das erzeugt auch einen Refresh und man sieht (neben den eigenen Edit-Unfällen) die zwischenzeitlich eingetroffenen Beiträge im Thread.

Moin Moin,

hier die Ergebnisse:

Meck-Pomm 109 → 102, Sachsen 752 → 206

Bayern musste ich aus technischen Gründen leider abbrechen; starte es gleich nochmal.

Gruss
walter

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