Java tutorial
/* * polymap.org Copyright 2013 Polymap GmbH. All rights reserved. * * This is free software; you can redistribute it and/or modify it under the terms of * the GNU Lesser General Public License as published by the Free Software * Foundation; either version 2.1 of the License, or (at your option) any later * version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ package org.polymap.kaps.exporter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureIterator; import org.opengis.feature.Feature; import org.supercsv.io.CsvListWriter; import org.supercsv.prefs.CsvPreference; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Polygon; import org.eclipse.rwt.widgets.ExternalBrowser; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.polymap.core.data.operation.DefaultFeatureOperation; import org.polymap.core.data.operation.DownloadServiceHandler; import org.polymap.core.data.operation.DownloadServiceHandler.ContentProvider; import org.polymap.core.data.operation.FeatureOperationExtension; import org.polymap.core.data.operation.IFeatureOperation; import org.polymap.core.data.operation.IFeatureOperationContext; import org.polymap.core.runtime.Polymap; import org.polymap.kaps.model.KapsRepository; import org.polymap.kaps.model.data.BauweiseComposite; import org.polymap.kaps.model.data.BodenRichtwertKennungComposite; import org.polymap.kaps.model.data.BodenRichtwertRichtlinieArtDerNutzungComposite; import org.polymap.kaps.model.data.BodenRichtwertRichtlinieErgaenzungComposite; import org.polymap.kaps.model.data.EntwicklungsZusatzComposite; import org.polymap.kaps.model.data.EntwicklungsZustandComposite; import org.polymap.kaps.model.data.ErschliessungsBeitragComposite; import org.polymap.kaps.model.data.GemeindeComposite; import org.polymap.kaps.model.data.RichtwertzoneComposite; import org.polymap.kaps.model.data.RichtwertzoneZeitraumComposite; /** * @author <a href="http://www.polymap.de">Steffen Stundzig</a> */ public abstract class RichtwertzoneAsBorisExporter extends DefaultFeatureOperation implements IFeatureOperation { private static Log log = LogFactory.getLog(RichtwertzoneAsBorisExporter.class); // Locale wegen dem . in 0.00 private static NumberFormat euroFormat = NumberFormat.getNumberInstance(Locale.ENGLISH); private static NumberFormat euroShortFormat = NumberFormat.getNumberInstance(Locale.ENGLISH); static { euroFormat.setMaximumFractionDigits(2); euroFormat.setMinimumFractionDigits(2); euroFormat.setMinimumIntegerDigits(1); euroShortFormat.setMaximumFractionDigits(0); euroShortFormat.setMinimumFractionDigits(0); euroFormat.setMinimumIntegerDigits(1); } private static DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); protected static DateFormat fileFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); @Override public boolean init(IFeatureOperationContext ctx) { super.init(ctx); try { return context.featureSource().getSchema().getName().getLocalPart() .equals(RichtwertzoneZeitraumComposite.NAME); } catch (Exception e) { log.warn("", e); return false; } } @Override public Status execute(IProgressMonitor monitor) throws Exception { monitor.beginTask(context.adapt(FeatureOperationExtension.class).getLabel(), context.features().size()); final Date now = new Date(); final File f = File.createTempFile(filename(), ".csv"); f.deleteOnExit(); OutputStream out = new BufferedOutputStream(new FileOutputStream(f)); try { write(context.features(), out, monitor); } catch (OperationCanceledException e) { return Status.Cancel; } finally { IOUtils.closeQuietly(out); } // open download Polymap.getSessionDisplay().asyncExec(new Runnable() { public void run() { String url = DownloadServiceHandler.registerContent(new ContentProvider() { public String getContentType() { return "text/csv; charset=ISO-8859-1"; } public String getFilename() { return filename() + fileFormat.format(new Date()) + ".csv"; } public InputStream getInputStream() throws Exception { return new BufferedInputStream(new FileInputStream(f)); } public boolean done(boolean success) { f.delete(); return true; } }); log.info("CSV: download URL: " + url); // String filename = view.getLayer() != null // ? view.getLayer().getLabel() + "_export.csv" : // "polymap3_export.csv"; // String linkTarget = "../csv/" + id + "/" + filename; // String htmlTarget = "../csv/download.html?id=" + id + "&filename=" // + filename; ExternalBrowser.open("download_window", url, ExternalBrowser.NAVIGATION_BAR | ExternalBrowser.STATUS); } }); monitor.done(); return Status.OK; } private void write(FeatureCollection features, OutputStream out, IProgressMonitor monitor) throws IOException { FeatureIterator it = null; Writer writer = null; CsvListWriter csvWriter = null; try { // TODO Trennzeichen? CsvPreference prefs = new CsvPreference('"', '|', "\r\n"); writer = new OutputStreamWriter(out, "ISO-8859-1"); csvWriter = new CsvListWriter(writer, prefs); it = features.features(); int count = 0; boolean noHeaderYet = true; final KapsRepository repo = KapsRepository.instance(); while (it.hasNext()) { if (monitor.isCanceled()) { throw new OperationCanceledException(); } if ((++count % 100) == 0) { monitor.subTask("Objekte: " + count++); monitor.worked(100); } Feature feature = it.next(); // header if (noHeaderYet) { csvWriter.writeHeader(getHeaders()); noHeaderYet = false; } RichtwertzoneZeitraumComposite richtwertzoneG = repo .findEntity(RichtwertzoneZeitraumComposite.class, feature.getIdentifier().getID()); // all properties // nur welche mit Geometrie RichtwertzoneComposite richtwertzone = richtwertzoneG.zone().get(); Polygon geom = richtwertzone.geom().get(); if (geom != null) { csvWriter.write(getRow(richtwertzoneG, richtwertzone, geom)); } } } finally { if (csvWriter != null) { csvWriter.close(); } if (writer != null) { writer.close(); } if (it != null) { it.close(); } } } private String[] getHeaders() { return new String[] { "GESL", "GENA", "GASL", "GABE", "GENU", "GEMA", "ORTST", "WNUM", "BRW", "STAG", "BRKE", "BEDW", "PLZ", "BASBE", "BASMA", "YWERT", "XWERT", "BEZUG", "ENTW", "BEIT", "NUTA", "ERGNUTA", "BAUW", "GEZ", "WGFZ", "GRZ", "BMZ", "FLAE", "GTIE", "GBREI", "ERVE", "VERG", "VERF", "YVERG", "XVERG", "BOD", "ACZA", "GRZA", "AUFW", "WEER", "KOORWERT", "KOORVERF", "BEM", "FREI", "BRZNAME", "UMDART", "LUMNUM" }; } private List getRow(RichtwertzoneZeitraumComposite richtwertzoneG, RichtwertzoneComposite richtwertzone, Geometry geom) { List result = new ArrayList(41) { @Override public boolean add(Object e) { if (e == null) { return super.add(""); } else { return super.add(e); } } }; // 1 // Gemeindekennzeichen // gemeindekennzeichen // GESL // Zeichenkette // 12 // - // amtlicher Gemeindeschlussel des statistischen Bundesam-tes im Format // LLRKKGGGTTTT // @TODO das muss noch konfigurierbar werden // LL = Land = 14 Sachsen // R = Regierungsbezirk = 5 // KK = Kreis = 22 Mittelsachsen // GGG = Gemeinde = 522520 = schl, enthlt bereits R un KK // TTTT = Gemeindeteil nach landesspezifischem Schlssel = gibts nicht // Pflicht GemeindeComposite gemeinde = richtwertzone.gemeinde().get(); result.add("14" + gemeinde.schl().get() + "0000"); // 2 // Gemeinde // gemeindename // GENA // Zeichenkette // 30 // - // Name der Gemeinde als Text // freiwillig result.add(gemeinde.name().get()); // 3 // Gutachterausschuss-kennziffer // gutachterausschusskennziffer // GASL // Integer // 5 // - // Nummer des zustndigen Gutachterausschusses gem // Landesschlussel // Pflicht result.add("00522"); // 4 // Bezeichnung des Gut-achterausschusses // gutachterausschussbezeichnung // GABE // Zeichenkette // 140 // - // Name des zustndigen Gutachterausschusses // freiwillig // TODO konfigurierbar result.add("Gutachterausschuss fr Grundstckswerte im Landkreis Mittelsachsen"); // 5 // Gemarkungsnummer // gemarkungsnummer // GENU // Integer // 4 // - // Gemarkungsnummer // freiwillig result.add(""); // 6 // Gemarkungsname // gemarkungsname // GEMA // Zeichenkette // 60 // - // Name der Gemarkung als Text // freiwillig result.add(""); // 7 // Ortsteil // ortsteilName // ORTST // Zeichenkette // 60 // - // Name des Ortsteils bzw. Stadtteils als Text // freiwillig result.add(""); // 8 // Bodenrichtwertnummer // bodenrichtwertNummer // WNUM // Integer // 7 // - // Nummer des Bodenrichtwerts gem Landesschlussel // Pflicht result.add("2" + richtwertzone.schl().get()); // 9 // Bodenrichtwert // bodenrichtwert // BRW // Dezimal // 5.2 // ja // Bodenrichtwertangabe in /m, auch bei Stichtagen vor 2002 // Pflicht Double euro = richtwertzoneG.euroQm().get(); String euroStr = ""; if (euro != null && euro >= 10.0d) { euroStr = euroShortFormat.format(richtwertzoneG.euroQm().get()); } else { euroStr = euroFormat.format(richtwertzoneG.euroQm().get()); } result.add(euroStr); // 10 // Stichtag des Bodenrichtwerts // stichtag // STAG // Datum // TT.MM.JJJJ // 10 // ja // Stichtag des Bodenrichtwerts // Pflicht result.add(dateFormat.format(richtwertzoneG.stichtag().get())); // 11 // Bodenrichtwertkennung // bodenrichtwertArt // BRKE // Integer // 1 // - // 1 = zonal // 2 = lagetypisch (historisch) // Pflicht BodenRichtwertKennungComposite richtwertKennung = richtwertzone.bodenrichtwertKennung().get(); result.add(richtwertKennung != null ? richtwertKennung.schl().get() : null); // 12 // Bedarfswert // bedarfswert // BEDW // Dezimal // 5.2 // - // Bedarfswertangabe (zum 1.1.1996) in /m, historisch // freiwillig result.add(""); // 13 // Postleitzahl // postleitzahl // PLZ // Zeichenkette // 5 // - // Nummer des Postleitzahlbezirks, in dem die Bodenricht-wertzone // uberwiegend liegt // freiwillig result.add(""); // 14 // Basiskarten-Bezeichnung // basiskartenbezeichnung // BASBE // Zeichenkette // 20 // - // Angabe zur Kartengrundlage, auf welcher der // Bodenrichtwert beschlossen wurde (Basiskarte) // freiwillig result.add("TOP.sachsen"); // 15 // Basiskarten-Mastabszahl // basiskartenmassstabszahl // BASMA // Integer // 6 // - // Mastabszahl der Basiskarte // Pflicht result.add("24000"); // 16 // Rechtswert/Ostwert // ostwertBRW // YWERT // Integer // 8 // - // Georeferenz der Bodenrichtwertangabe // (Prsentationskoordinate) // freiwillig result.add(""); // result.add( geom != null ? Double.valueOf( geom.getCentroid().getX() ).intValue() : "" ); // 17 // Hochwert/Nordwert // nordwertBRW // XWERT // Integer // 7 // - // Georeferenz der Bodenrichtwertangabe // (Prsentationskoordinate) // freiwillig result.add(""); // result.add( geom != null ? Double.valueOf( geom.getCentroid().getY() ).intValue() : "" ); // 18 // Bezugssystem // bezugssystemBRW // BEZUG // Zeichenkette // 12 // - // Bezugssystem der angegebenen Koordinaten gem // AdV-Schlussel // DE_DHDN_3GK2 // DE_DHDN_3GK3 // DE_DHDN_3GK4 // ETRS89_UTM32 // ETRS89_UTM33 // Pflicht result.add("DE_DHDN_3GK4"); // 19 // Entwicklungszustand // entwicklungszustand // ENTW // Zeichenkette // 2 // ja // Entwicklungszustand nach 5 ImmoWertV: // B = Baureifes Land // R = Rohbauland // E = Bauerwartungsland // L = Flche der Land- oder Forstwirtschaft // SF = Sonstige Flche // Pflicht EntwicklungsZustandComposite entwicklungsZustand = richtwertzone.entwicklungsZustand().get(); result.add(entwicklungsZustand != null ? entwicklungsZustand.schl().get() : null); // 20 // Beitrags- und abgaben-rechtlicher Zustand // beitrags_abgabenrechtlZustand // BEIT // Zeichenkette // 1 // ja // Beitrags- und abgabenrechtlicher Zustand // 1 = erschlieungsbeitrags- und kostenerstattungs-betragsfrei // 2 =erschlieungsbeitrags-/kostenerstattungs-betragsfrei und // abgabenpflichtig nach Kom-munalabgabengesetz // 3 = erschlieungsbeitrags-/kostenerstattungs-betragspflichtig und // abgabenpflichtig nach Kommunalabgabengesetz // Pflicht falls // 19=B ErschliessungsBeitragComposite erschliessungsBeitrag = richtwertzoneG.erschliessungsBeitrag().get(); result.add(erschliessungsBeitrag != null ? erschliessungsBeitrag.schl().get() : null); // 21 // Art der Nutzung // ArtNutzung // NUTA // Zeichenkette // 8 // ja // Art der Nutzung gem Anlage 1 zur BRW-RL // Pflicht BodenRichtwertRichtlinieArtDerNutzungComposite artDerNutzung = richtwertzone.brwrlArt().get(); result.add(artDerNutzung != null ? artDerNutzung.schl().get() : null); // 22 // Ergnzung zur Art der Nutzung // ErgaenzungArtNutzung // ERGNUTA // Zeichenkette // 30 // ja // Ergnzung zur Art der Nutzung gem Anlage 1 zur BRW-RL // Pflicht soweit wertrelevant BodenRichtwertRichtlinieErgaenzungComposite ergaenzung = richtwertzone.brwrlErgaenzung().get(); result.add(ergaenzung != null ? ergaenzung.schl().get() : null); // 23 // Bauweise // bauweise // BAUW // Zeichenkette // 2 // ja // Bauweise des Bodenrichtwertgrundstucks: // o = offene Bauweise // g = geschlossene Bauweise // a = abweichende Bauweise // eh = Einzelhuser // ed = Einzel- und Doppelhuser // dh = Doppelhaushlften // rh = Reihenhuser // rm = Reihenmittelhuser // re = Reihenendhuser // Pflicht soweit wertrelevant BauweiseComposite bauweise = richtwertzone.bauweise().get(); result.add(bauweise != null ? bauweise.schl().get() : null); // 24 // Geschosszahl // geschosszahl // GEZ // Zeichenkette // 9 // ja // Geschosszahl des Bodenrichtwertgrundstucks // Pflicht soweit wertrelevant result.add(richtwertzone.geschossZahl().get()); // 25 // Wertrelevante Ge-schossflchenzahl // wertrelevantegeschossflaechenzahl // WGFZ // Zeichenkette // 11 // ja // wertrelevante Geschossflchenzahl des Bodenrichtwert-grundstucks gem // Nummer 6 Absatz 6 BRW-RL // Pflicht soweit wertrelevant // TODO berechnen result.add(""); // 26 // Grundflchenzahl // grundflaechenzahl // GRZ // Zeichenkette // 7 // ja // Grundflchenzahl des Bodenrichtwertgrundstucks // Pflicht soweit wertrelevant result.add(richtwertzone.grundflaechenZahl().get()); // 27 // Baumassenzahl // baumassenzahl // BMZ // Zeichenkette // 9 // ja // Baumassenzahl des Bodenrichtwertgrundstucks // Pflicht soweit wertrelevant result.add(richtwertzone.baumassenZahl().get()); // 28 // Flche // flaeche // FLAE // Zeichenkette // 12 // ja // Flche des Bodenrichtwertgrundstucks in m // Pflicht soweit wertrelevant Double groesse = richtwertzone.grundstuecksGroesse().get(); result.add(groesse != null ? groesse.intValue() : ""); // 29 // Tiefe // tiefe // GTIE // Zeichenkette // 8 // ja // Tiefe des Bodenrichtwertgrundstucks in m // Pflicht soweit wertrelevant result.add(richtwertzone.grundstuecksTiefe().get()); // 30 // Breite // breite // GBREI // Zeichenkette // 8 // ja // Breite des Bodenrichtwertgrundstucks in m // Pflicht soweit wertrelevant result.add(richtwertzone.grundstuecksBreite().get()); // 31 // Erschlieungs-verhltnisse // erschliessungsverhaeltnisse // ERVE // Integer // 1 // - // Qualitt der Erschlieungsanlagen, historisch // 1 = sehr gute Erschlieungsverhltnisse // 2 = schlechte Erschlieungsverhltnisse // freiwillig // TODO fehlt result.add(""); // 32 // Verfahrensgrund // verfahrensart // VERG // Zeichenkette // 4 // - // Manahmen nach BauGB: Angabe des // Verfahrensgrundes, historisch: // San = Sanierungsgebiet // Entw = Entwicklungsbereich // freiwillig EntwicklungsZusatzComposite entwicklungsZusatz = richtwertzone.entwicklungsZusatz().get(); String verg = ""; if (entwicklungsZusatz != null) { if (entwicklungsZusatz.schl().get().startsWith("S")) { verg = "San"; } else { verg = "Entw"; } } result.add(verg); // 33 // Entwicklungs-/Sanierungszusatz // EntwicklungsSanierungszusatz // VERF // Zeichenkette // 2 // ja // Angabe des verfahrensrechtlichen Zustandes // (Manahmen nach BauGB): // SU = sanierungsunbeeinflusster Bodenrichtwert, ohne Berucksichtigung der // rechtlichen und tatschlichen Neuordnung // SB = sanierungsbeeinflusster Bodenrichtwert, unter Berucksichtigung der // rechtlichen und tatsch-lichen Neuordnung // EU = entwicklungsunbeeinflusster Bodenrichtwert, ohne Berucksichtigung // der rechtlichen und tatschlichen Neuordnung // EB = entwicklungsbeeinflusster Bodenrichtwert, unter Berucksichtigung der // rechtlichen und tatschlichen Neuordnung // Pflicht falls Sanierungsgebiet oder Entwicklungsbereich result.add(entwicklungsZusatz != null ? entwicklungsZusatz.schl().get() : null); // 34 // Rechtswert/Ostwert der // Manahme // ostwertVerf // YVERG // Integer // 8 // - // Georeferenz der Beschriftung zur stdtebaulichen // Manahme (Prsentationskoordinate), historisch // freiwillig result.add(entwicklungsZusatz != null && geom != null ? Double.valueOf(geom.getCentroid().getX()).intValue() : ""); // 35 // Hochwert/Nordwert der Manahme // nordwertVerf // XVERG // Integer // 7 // - // Georeferenz der Beschriftung zur stdtebaulichen Ma-nahme // (Prsentationskoordinate), historisch // freiwillig // TODO bei jedem BRW im San- Gebiet sind zudem die Koordinaten (Feld 34/35) // fr die Visualisierung der Beschriftung "San" anzugeben, mglichst nicht // im Mittelpunkt des Polygons, da dort der BRW platziert wird result.add(entwicklungsZusatz != null && geom != null ? (Double.valueOf(geom.getCentroid().getY()).intValue() - 20) : ""); // 36 // Bodenart // bodenart // BOD // Zeichenkette // 6 // - // Bodenart gem Bodenschtzungsgesetz // Pflicht soweit wertrelevant result.add(""); // 37 // Ackerzahl // ackerzahl // ACZA // Zeichenkette // 7 // ja // Ackerzahl des Bodenrichtwertgrundstucks // Pflicht soweit wertrelevant result.add(richtwertzone.ackerZahl().get()); // 38 // Grunlandzahl // gruenlandzahl // GRZA // Zeichenkette // 7 // ja // Grunlandzahl des Bodenrichtwertgrundstucks // Pflicht soweit wertrelevant result.add(richtwertzone.gruenLandZahl().get()); // 39 // Aufwuchs // aufwuchs // AUFW // Zeichenkette // 2 // - // land- und forstwirtschaftliche Richtwerte mit Berucksich-tigung des // Aufwuchses, historisch: // mA = mit Aufwuchs // freiwillig result.add(""); // 40 // Wegeerschlieung // wegeerschliessung // WEER // Zeichenkette // 1 // - // Wegeerschlieung fur land-/forstwirtschaftliche Flchen: // 1 = erschlossen // 0 = nicht erschlossen // freiwillig result.add(""); // 41 // Koordinatenliste // Bodenrichtwertzone // koordlisteBRW // KOORWERT // Zeichenkette // 500000 // - // Umgrenzung der Bodenrichtwertzone; Angabe im // Format WKT; Koordinaten als Rechts- bzw. Ostwert // und Hoch- bzw. Nordwert jeweils im Format 7.3 oder // 8.3 // Pflicht, falls // 11=1 result.add(geom != null ? new WKTWriter().write(geom) : null); // 42 // Koordinatenliste // Verfahren // umring // KOORVERF // Zeichenkette // 120000 // - // Umgrenzung der stdtebaulichen Manahme; Angabe im Format WKT; Koordinaten // als Rechts- bzw. Ostwert und Hoch- bzw. Nordwert jeweils im Format 7.3 // oder 8.3, historisch // freiwillig String row42 = ""; if (entwicklungsZusatz != null && geom != null && entwicklungsZusatz.schl().get().startsWith("S")) { row42 = new WKTWriter().write(geom); } result.add(row42); // 43 // Bemerkungen // bemerkungen // BEM // Zeichenkette // 255 // - // Sonstige Hinweise // freiwillig result.add(""); // 44 // Freies Feld // landesspezifischeAngaben // FREI // Zeichenkette // 255 // - // Merkmal von den Lndern frei belegbar; Zuordnung zum Bundesland uber das // Gemeindekennzeichen // freiwillig result.add(""); // 45 // Bodenrichtwertzonen-name // bodenrichtwertzonenname // BRZNAME // Zeichenkette // 255 // - // Bezeichnung der Bodenrichtwertzone // freiwillig result.add(richtwertzone.name().get()); // 46 // Art der Umrechnungs-faktorendokumentation // umrechnungdokart // UMART // Zeichenkette // 1 // - // 0 = Dateidokumente // 1 = Datensatz // freiwillig result.add("0"); // 47 // Umrechnungstabellen // liste_umrechnungstabellen // LUMNUM // Zeichenkette // 255 // ja // Liste der Nummern der Umrechnungstabellen // (Datensatz) oder Liste der Namen der Dateidokumente // Pflicht soweit wertrelevant result.add(pdfname()); return result; } protected abstract String filename(); protected abstract String pdfname(); }