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.
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
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.
Meck-Pomm habe ich durchgearbeitet und User Gehrke ist mir dabei auch begegnet .
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.
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.
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.
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.
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