org.polymap.kaps.exporter.RichtwertzoneAsBorisExporter.java Source code

Java tutorial

Introduction

Here is the source code for org.polymap.kaps.exporter.RichtwertzoneAsBorisExporter.java

Source

/*
 * 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();
}