"""
***************************************************************************
XPlan-Reader
QGIS plugin

        Date                 : July 2022
        Copyright            : (C) 2022 by Kreis Viersen
        Email                : open@kreis-viersen.de

***************************************************************************

***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 3 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************
"""

import os

from lxml import etree
from osgeo import gdal, ogr
from pathlib import Path

from qgis.core import (
    Qgis,
    QgsCoordinateReferenceSystem,
    QgsCoordinateTransform,
    QgsExpression,
    QgsExpressionContextUtils,
    QgsFeatureRequest,
    QgsLayerTreeGroup,
    QgsLayerTreeLayer,
    QgsMessageLog,
    QgsProject,
    QgsRasterLayer,
    QgsRectangle,
    QgsVectorLayer,
    QgsWkbTypes,
)

from qgis.PyQt import uic
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction, QDialog, QMenu, QMessageBox

from .plan_layer_id import plan_layer_id


class LoadDialog(QDialog):
    def __init__(self, caller):
        super(LoadDialog, self).__init__()
        uic.loadUi(
            os.path.join(os.path.dirname(os.path.abspath(__file__)), "xplan_reader.ui"),
            self,
        )


class XplanReader:
    def __init__(self, iface):
        self.iface = iface

        self.use_gfs_workaround_one = False
        self.use_gfs_workaround_two = False

        def versionstringToTuple(vstring):
            # for something like 3.7.0dev-52baae2708-dirty
            first_part = vstring.split("dev")[0]
            return tuple(map(int, (first_part.split("."))))

        # gfs_workaround_one is not needed for GDAL >=3.6.0
        if versionstringToTuple(gdal.__version__) < versionstringToTuple("3.6.0"):
            self.use_gfs_workaround_one = True

        # gfs_workaround_two is only needed for GDAL = 3.7.0
        if versionstringToTuple(gdal.__version__) == versionstringToTuple("3.7.0"):
            self.use_gfs_workaround_two = True

        # we need at least / wir benötigen mindestens
        # QGIS Version 3.26.0 (LR) oder 3.22.9 (LTR)
        # https://github.com/qgis/QGIS/pull/48556
        # https://github.com/qgis/QGIS/pull/48572
        qgis_version = versionstringToTuple(Qgis.QGIS_VERSION.split("-")[0])
        if qgis_version < versionstringToTuple("3.26.0") and not versionstringToTuple(
            "3.22.8"
        ) < qgis_version < versionstringToTuple("3.23.0"):
            message = 'Das Plugin "XPlan-Reader" benötigt mindestens QGIS Version \
            3.26.0 (LR) oder 3.22.9 (LTR), sonst werden manche Layer womöglich nicht \
            richtig geladen!'
            self.iface.messageBar().pushMessage(
                "Achtung", message, Qgis.Warning, duration=30
            )
            self.logMessage(message, Qgis.Warning)

        self.plugin_dir = os.path.dirname(os.path.abspath(__file__))

        self.style_dir = os.path.join(self.plugin_dir, "styles")

    def initGui(self):
        self.action = QAction(
            QIcon(os.path.join(self.plugin_dir, "xplan_reader_icon.png")),
            "&XPlan-Reader",
            self.iface.mainWindow(),
        )
        self.aboutAction = QAction(
            QIcon(os.path.join(self.plugin_dir, "info_icon.png")),
            "&Über XPlan-Reader",
            self.iface.mainWindow(),
        )
        self.action.triggered.connect(self.importXplanGml)
        self.aboutAction.triggered.connect(self.about)

        self.menu = QMenu("&XPlan-Reader")
        self.menu.setIcon(QIcon(os.path.join(self.plugin_dir, "xplan_reader_icon.png")))
        self.menu.addActions([self.action, self.aboutAction])

        self.iface.pluginMenu().addMenu(self.menu)
        self.iface.addToolBarIcon(self.action)

    def unload(self):
        self.iface.removePluginMenu("&XPlan-Reader", self.action)
        self.iface.removePluginMenu("&XPlan-Reader", self.aboutAction)
        self.iface.removeToolBarIcon(self.action)

        QgsExpression.unregisterFunction(plan_layer_id.name())

        del self.action
        del self.aboutAction

    def about(self):
        aboutString = (
            "XPlan-Reader<br>QGIS-Plugin zum Import einer XPlanGML-Datei<br>"
            + 'Author: Kreis Viersen<br>Mail: <a href="mailto:open@kreis-viersen.de?subject=XPlan&#8208;Reader">'
            + "open@kreis-viersen.de</a><br>Web: "
            + '<a href="https://github.com/kreis-viersen/xplan-reader">'
            + "https://github.com/kreis-viersen/xplan-reader</a>"
        )
        QMessageBox.information(
            self.iface.mainWindow(), "Über XPlan-Reader", aboutString
        )

    def logMessage(self, message, level=Qgis.Info):
        QgsMessageLog.logMessage(message, "XPlan-Reader", level)

    def importXplanGml(self):
        self.dlg = LoadDialog(self)
        self.dlg.show()
        result = self.dlg.exec()

        self.project_crs = QgsProject.instance().crs().authid()
        self.dest_crs = None
        self.plan_id = None

        self.baugrenze_baulinie = False
        self.ueberbaubare_grundstuecksflaeche = False
        self.linie_ohne_flaeche = False
        # check if confirmed with OK / wenn mit OK bestätigt wurde
        if result == 1:
            file_path = self.dlg.qgsFileWidget.filePath()
            if file_path == "":
                return

            my_gml = file_path
            filename = Path(my_gml).stem

            try:
                tree = etree.parse(my_gml)
                self.logMessage("Lade: " + my_gml)
            except:
                message = (
                    'Datei: "'
                    + my_gml
                    + '" konnte nicht gelesen werden, bitte Datei überprüfen.'
                )
                self.iface.messageBar().pushMessage(
                    "Fehler", message, Qgis.Critical, duration=10
                )
                self.logMessage(message, Qgis.Warning)

                return

            gml_root = tree.getroot()

            try:
                xplan_ns_uri = gml_root.nsmap["xplan"]
            except:
                try:
                    xplan_ns_uri = gml_root.nsmap[None]
                except:
                    message = (
                        'Datei: "'
                        + my_gml
                        + '": XPlanung-Namespace konnte nicht gefunden werden, bitte Datei überprüfen.'
                    )
                    self.iface.messageBar().pushMessage(
                        "Fehler", message, Qgis.Critical, duration=10
                    )
                    self.logMessage(message, Qgis.Warning)

                    return

            xplan_version = xplan_ns_uri.split("http://www.xplanung.de/xplangml/")[
                1
            ].replace("/", ".")
            self.logMessage("XPlanung Version: " + xplan_version)

            plan_category = None
            for elem in ("BP_Plan", "FP_Plan", "LP_Plan", "RP_Plan", "SO_Plan"):
                try:
                    if next(gml_root.iter("{" + xplan_ns_uri + "}" + elem)).tag:
                        plan_category = elem
                        self.logMessage("Plankategorie: " + plan_category)

                    try:
                        for plan_element in gml_root.iter(
                            "{" + xplan_ns_uri + "}" + elem
                        ):
                            raeumlicherGeltungsbereich_element = next(
                                plan_element.iter(
                                    "{" + xplan_ns_uri + "}raeumlicherGeltungsbereich"
                                )
                            )
                            if raeumlicherGeltungsbereich_element is not None:
                                break
                    except:
                        message = (
                            elem
                            + " hat keinen räumlichen Geltungsbereich, dies wird nicht unterstützt!"
                        )
                        self.iface.messageBar().pushMessage(
                            "Fehler", message, Qgis.Critical, duration=10
                        )
                        self.logMessage(message, Qgis.Warning)

                        return

                except:
                    continue

            raster_reference_count = 0
            raster_reference_files = []
            for elem in (
                "BP_Bereich",
                "FP_Bereich",
                "LP_Bereich",
                "RP_Bereich",
                "SO_Bereich",
                "XP_Rasterdarstellung",  # only XPlaung > 6
            ):
                try:
                    for bereich_element in gml_root.iter(
                        "{" + xplan_ns_uri + "}" + elem
                    ):
                        for refscan_element in bereich_element.iter(
                            "{" + xplan_ns_uri + "}refScan"
                        ):
                            referenzurl_element = next(
                                refscan_element.iter(
                                    "{" + xplan_ns_uri + "}referenzURL"
                                )
                            )
                            if len(referenzurl_element.text) > 0:
                                raster_reference_count = raster_reference_count + 1
                                if not referenzurl_element.text.startswith("http"):
                                    raster_reference_files.append(
                                        referenzurl_element.text
                                    )

                        self.logMessage(
                            "Anzahl referenzierter Rasterpläne: "
                            + str(raster_reference_count)
                        )

                        self.logMessage(
                            "Referenzierte Rasterpläne: " + str(raster_reference_files)
                        )

                except:
                    continue

            try:
                plan_element = next(
                    gml_root.iter("{" + xplan_ns_uri + "}" + plan_category)
                )
                name = next(plan_element.iter("{" + xplan_ns_uri + "}name")).text
                self.logMessage("Name des Plans: " + name)
                name = name + " (XPlanung v" + xplan_version + ")"
            except:
                name = filename + " (XPlanung v" + xplan_version + ")"

            try:
                gemeinde_name = next(
                    gml_root.iter("{" + xplan_ns_uri + "}gemeindeName")
                ).text
                self.logMessage("Gemeindename: " + gemeinde_name)
                if len(gemeinde_name) > 0:
                    name = gemeinde_name + " - " + name
            except:
                self.logMessage("Kein Gemeindename in der XPlanGML gefunden.")

            root = QgsProject.instance().layerTreeRoot()

            suffix = 0
            for group in [child for child in root.children() if child.nodeType() == 0]:
                if (name) in group.name():
                    if (name + "_") in group.name():
                        this_suffix = group.name().split(name + "_", 1)[1]
                        if int(this_suffix) >= suffix:
                            suffix = int(this_suffix) + 1
                    else:
                        suffix = 1

            if suffix != 0:
                name = name + "_" + str(suffix)

            new_group = QgsLayerTreeGroup(name)
            root.insertChildNode(0, new_group)

            self.group_extent = QgsRectangle()

            my_gfs = os.path.splitext(my_gml)[0] + ".gfs"
            if os.path.isfile(my_gfs):
                os.remove(my_gfs)

            ds_one = gdal.OpenEx(
                my_gml,
                allowed_drivers=["GML"],
                open_options=["GML_ATTRIBUTES_TO_OGR_FIELDS=YES", "WRITE_GFS=YES"],
            )

            if self.use_gfs_workaround_one or self.use_gfs_workaround_two:
                write_gfs = False
                if os.path.isfile(my_gfs):
                    gfs_tree = etree.parse(my_gfs)
                    gfs_root = gfs_tree.getroot()
                    if self.use_gfs_workaround_one:
                        for geometry_type in gfs_root.iter("GeometryType"):
                            # if needed, change GeometryType in .gfs to handle false GeometryCollection import
                            if geometry_type.text == "7":
                                geometry_type.text = "0"
                                write_gfs = True
                    if self.use_gfs_workaround_two:
                        for geometry_name in gfs_root.iter("GeometryName"):
                            if geometry_name.text == "boundedBy":
                                geometry_name.getparent().remove(geometry_name)
                                write_gfs = True
                                for geometry_element_path in gfs_root.iter(
                                    "GeometryElementPath"
                                ):
                                    if "boundedBy" in geometry_element_path.text:
                                        geometry_element_path.getparent().remove(
                                            geometry_element_path
                                        )
                    if write_gfs:
                        gfs_tree.write(my_gfs, encoding="UTF-8", xml_declaration=False)

            ds_two = gdal.OpenEx(
                my_gml,
                allowed_drivers=["GML"],
                open_options=["GML_ATTRIBUTES_TO_OGR_FIELDS=YES", "WRITE_GFS=NO"],
            )

            layers = []
            for i in range(ds_two.GetLayerCount()):
                name = ds_two.GetLayer(i).GetName()
                layers.append(name)

            def addXplanLayer(layername, gtype):

                layername_legend = layername
                if layername == "BP_BaugebietsTeilFlaeche-Geometrie":
                    layername = "BP_BaugebietsTeilFlaeche"
                    layername_legend = "BP_BaugebietsTeilFlaeche-Geometrie"
                if layername == "BP_BaugebietsTeilFlaeche-Beschriftung":
                    layername = "BP_BaugebietsTeilFlaeche"
                    layername_legend = "BP_BaugebietsTeilFlaeche-Beschriftung"

                if layername in layers:
                    if gtype == "Punkt":
                        geomtype = "MultiPoint"
                    elif gtype == "Linie":
                        geomtype = "MultiCurve"
                    elif gtype == "Flaeche":
                        geomtype = "MultiSurface"
                    elif gtype == "Text":
                        geomtype = ""

                    vlayer = QgsVectorLayer(
                        my_gml
                        + "|layername="
                        + layername
                        + "|geometrytype="
                        + geomtype,
                        layername_legend,
                        "ogr",
                    )

                    if vlayer.featureCount() != 0:
                        # geometry is optional for *_Bereich
                        if layername.endswith("_Bereich") and vlayer.isSpatial():
                            gtype = "Flaeche"
                        if not vlayer.isValid():
                            self.logMessage(
                                layername
                                + " ("
                                + gtype
                                + ") konnte nicht geladen werden!",
                                Qgis.Warning,
                            )
                        else:
                            if vlayer.isSpatial():
                                layer_extent = vlayer.extent()

                                src_crs = QgsCoordinateReferenceSystem(
                                    vlayer.crs().authid()
                                )
                                self.dest_crs = QgsCoordinateReferenceSystem(
                                    self.project_crs
                                )
                                if src_crs != self.dest_crs:
                                    try:
                                        tr = QgsCoordinateTransform(
                                            src_crs,
                                            self.dest_crs,
                                            QgsProject().instance(),
                                        )
                                        layer_extent = tr.transform(vlayer.extent())
                                    except:
                                        pass

                                self.group_extent.combineExtentWith(layer_extent)

                                if layername in ["BP_BauGrenze", "BP_BauLinie"]:
                                    self.baugrenze_baulinie = True

                                if layername in ["BP_UeberbaubareGrundstuecksFlaeche"]:
                                    self.ueberbaubare_grundstuecksflaeche = True

                                if layername in [
                                    "BP_Plan",
                                    "FP_Plan",
                                    "LP_Plan",
                                    "RP_Plan",
                                    "SO_Plan",
                                ]:
                                    self.plan_id = vlayer.id()

                                    var_name_xplanversion = (
                                        "xplanversion_" + vlayer.id()
                                    )
                                    QgsExpressionContextUtils.setProjectVariable(
                                        QgsProject.instance(),
                                        var_name_xplanversion,
                                        float(xplan_version),
                                    )
                                    self.logMessage(
                                        "Ausdrucksvariable erstellt: "
                                        + var_name_xplanversion
                                    )

                                    request = QgsFeatureRequest()
                                    request.setLimit(1)
                                    for feature in vlayer.getFeatures(request):
                                        geom = feature.geometry()
                                        geom = (
                                            geom.convexHull()
                                            .convertToType(
                                                QgsWkbTypes.GeometryType.LineGeometry
                                            )
                                            .simplify(5)
                                        )

                                        var_name_simplified = (
                                            "vereinfacht_" + vlayer.id()
                                        )
                                        if vlayer.crs().isGeographic():
                                            precision = 5
                                        else:
                                            precision = 0
                                        QgsExpressionContextUtils.setProjectVariable(
                                            QgsProject.instance(),
                                            var_name_simplified,
                                            geom.asWkt(precision),
                                        )
                                        self.logMessage(
                                            "Ausdrucksvariable erstellt: "
                                            + var_name_simplified
                                        )

                                        var_name_rastercount = (
                                            "anzahl_rasterplaene_" + vlayer.id()
                                        )

                                        QgsExpressionContextUtils.setProjectVariable(
                                            QgsProject.instance(),
                                            var_name_rastercount,
                                            float(raster_reference_count),
                                        )
                                        self.logMessage(
                                            "Ausdrucksvariable erstellt: "
                                            + var_name_rastercount
                                        )

                                        var_name_rasterfiles = (
                                            "referenzierte_rasterplaene_" + vlayer.id()
                                        )

                                        QgsExpressionContextUtils.setProjectVariable(
                                            QgsProject.instance(),
                                            var_name_rasterfiles,
                                            raster_reference_files,
                                        )
                                        self.logMessage(
                                            "Ausdrucksvariable erstellt: "
                                            + var_name_rasterfiles
                                        )

                            if layername.endswith("_TextAbschnitt"):
                                var_name_textabschnitt = "textabschnitt_" + self.plan_id
                                QgsExpressionContextUtils.setProjectVariable(
                                    QgsProject.instance(),
                                    var_name_textabschnitt,
                                    vlayer.id(),
                                )
                                self.logMessage(
                                    "Ausdrucksvariable erstellt: "
                                    + var_name_textabschnitt
                                )

                            QgsProject.instance().addMapLayer(vlayer, False)

                            style = os.path.join(
                                self.style_dir, layername_legend + "_" + gtype + ".qml"
                            )
                            if os.path.isfile(style):
                                vlayer.loadNamedStyle(style)
                                self.logMessage("Style verwendet: " + style)

                            new_group.insertLayer(0, vlayer)

            # this list defines the order of layers in QGIS
            # die Liste hier definiert die Reihenfolge - ganz oben hier der unterste in QGIS angezeigte Layer
            # Source / Liste von https://xleitstelle.de/releases/objektartenkatalog_5_3

            addXplanLayer("SO_Plan", "Flaeche")
            addXplanLayer(
                "SO_Bereich", "Text"
            )  # bei Bedarf wird der Style 'Flaeche' geladen
            addXplanLayer("RP_Plan", "Flaeche")
            addXplanLayer(
                "RP_Bereich", "Text"
            )  # bei Bedarf wird der Style 'Flaeche' geladen
            addXplanLayer("RP_Forstwirtschaft", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Landwirtschaft", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_WohnenSiedlung", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_ZentralerOrt", "Flaeche")
            addXplanLayer("RP_Gewaesser", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Freiraum", "Flaeche")
            addXplanLayer("RP_IndustrieGewerbe", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Luftverkehr", "Flaeche")
            addXplanLayer("RP_Schienenverkehr", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Siedlung", "Flaeche")
            addXplanLayer("RP_Wasserverkehr", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Entsorgung", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Erholung", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_NaturLandschaft", "Flaeche")  # Flächenfüller
            addXplanLayer("RP_Achse", "Flaeche")
            addXplanLayer("RP_Bodenschutz", "Flaeche")
            addXplanLayer("RP_Einzelhandel", "Flaeche")
            addXplanLayer("RP_Energieversorgung", "Flaeche")
            addXplanLayer("RP_Entwicklungsschwerpunkte", "Flaeche")
            addXplanLayer("RP_FreizeitErholung", "Flaeche")
            addXplanLayer("RP_Funktionszuweisung", "Flaeche")
            addXplanLayer("RP_GemeindeFunktionSiedlungsentwicklung", "Flaeche")
            addXplanLayer("RP_GenerischesObjekt", "Flaeche")
            addXplanLayer("RP_GruenzugGruenzaesur", "Flaeche")
            addXplanLayer("RP_Hochwasserschutz", "Flaeche")
            addXplanLayer("RP_Klimaschutz", "Flaeche")
            addXplanLayer("RP_Kommunikation", "Flaeche")
            addXplanLayer("RP_Kulturlandschaft", "Flaeche")
            addXplanLayer("RP_Laermschutzbereich", "Flaeche")
            addXplanLayer("RP_Planungsraum", "Flaeche")
            addXplanLayer("RP_RadwegWanderweg", "Flaeche")
            addXplanLayer("RP_Raumkategorie", "Flaeche")
            addXplanLayer("RP_Rohstoffsicherung", "Flaeche")
            addXplanLayer("RP_SonstigeInfrastruktur", "Flaeche")
            addXplanLayer("RP_SonstigeSiedlungsstruktur", "Flaeche")
            addXplanLayer("RP_SonstigerFreiraumschutz", "Flaeche")
            addXplanLayer("RP_SonstigerSiedlungsbereich", "Flaeche")
            addXplanLayer("RP_SonstVerkehr", "Flaeche")
            addXplanLayer("RP_SozialeInfrastruktur", "Flaeche")
            addXplanLayer("RP_Sportanlage", "Flaeche")
            addXplanLayer("RP_Strassenverkehr", "Flaeche")
            addXplanLayer("RP_Verkehr", "Flaeche")
            addXplanLayer("RP_VorbHochwasserschutz", "Flaeche")
            addXplanLayer("RP_Wasserwirtschaft", "Flaeche")
            addXplanLayer("RP_Windenergie", "Flaeche")
            addXplanLayer("RP_ Windenergienutzung", "Flaeche")
            addXplanLayer("RP_Sperrgebiet", "Flaeche")
            addXplanLayer("RP_Geometrieobjekt", "Flaeche")
            addXplanLayer("RP_Legendenobjekt", "Flaeche")
            addXplanLayer("RP_Objekt", "Flaeche")
            addXplanLayer("RP_Rohstoff", "Flaeche")  # Füllmuster
            addXplanLayer("RP_LaermschutzBauschutz", "Flaeche")  # Füllmuster
            addXplanLayer("RP_Wasserschutz", "Flaeche")  # Füllmuster
            addXplanLayer("RP_ErneuerbareEnergie", "Flaeche")  # Füllmuster
            addXplanLayer(
                "RP_NaturschutzrechtlichesSchutzgebiet", "Flaeche"
            )  # Liniensignatur
            addXplanLayer("RP_Grenze", "Flaeche")  # Liniensignatur
            addXplanLayer("RP_Plan", "Linie")
            # addXplanLayer("RP_Bereich", "Linie") -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("RP_Achse", "Linie")
            addXplanLayer("RP_Bodenschutz", "Linie")
            addXplanLayer("RP_Einzelhandel", "Linie")
            addXplanLayer("RP_Energieversorgung", "Linie")
            addXplanLayer("RP_Entsorgung", "Linie")
            addXplanLayer("RP_Entwicklungsschwerpunkte", "Linie")
            addXplanLayer("RP_Erholung", "Linie")
            addXplanLayer("RP_Forstwirtschaft", "Linie")
            addXplanLayer("RP_Gewaesser", "Linie")
            addXplanLayer("RP_Freiraum", "Linie")
            addXplanLayer("RP_FreizeitErholung", "Linie")
            addXplanLayer("RP_Funktionszuweisung", "Linie")
            addXplanLayer("RP_GemeindeFunktionSiedlungsentwicklung", "Linie")
            addXplanLayer("RP_GenerischesObjekt", "Linie")
            addXplanLayer("RP_Grenze", "Linie")
            addXplanLayer("RP_GruenzugGruenzaesur", "Linie")
            addXplanLayer("RP_Hochwasserschutz", "Linie")
            addXplanLayer("RP_IndustrieGewerbe", "Linie")
            addXplanLayer("RP_Klimaschutz", "Linie")
            addXplanLayer("RP_Kommunikation", "Linie")
            addXplanLayer("RP_Kulturlandschaft", "Linie")
            addXplanLayer("RP_LaermschutzBauschutz", "Linie")
            addXplanLayer("RP_Laermschutzbereich", "Linie")
            addXplanLayer("RP_Luftverkehr", "Linie")
            addXplanLayer("RP_Landwirtschaft", "Linie")
            addXplanLayer("RP_NaturLandschaft", "Linie")
            addXplanLayer("RP_NaturschutzrechtlichesSchutzgebiet", "Linie")
            addXplanLayer("RP_Planungsraum", "Linie")
            addXplanLayer("RP_RadwegWanderweg", "Linie")
            addXplanLayer("RP_Raumkategorie", "Linie")
            addXplanLayer("RP_Rohstoff", "Linie")
            addXplanLayer("RP_Rohstoffsicherung", "Linie")
            addXplanLayer("RP_Schienenverkehr", "Linie")
            addXplanLayer("RP_Siedlung", "Linie")
            addXplanLayer("RP_SonstigeInfrastruktur", "Linie")
            addXplanLayer("RP_SonstigeSiedlungsstruktur", "Linie")
            addXplanLayer("RP_SonstigerFreiraumschutz", "Linie")
            addXplanLayer("RP_SonstigerSiedlungsbereich", "Linie")
            addXplanLayer("RP_SonstVerkehr", "Linie")
            addXplanLayer("RP_SozialeInfrastruktur", "Linie")
            addXplanLayer("RP_Sportanlage", "Linie")
            addXplanLayer("RP_Strassenverkehr", "Linie")
            addXplanLayer("RP_Verkehr", "Linie")
            addXplanLayer("RP_VorbHochwasserschutz", "Linie")
            addXplanLayer("RP_Wasserschutz", "Linie")
            addXplanLayer("RP_Wasserverkehr", "Linie")
            addXplanLayer("RP_Wasserwirtschaft", "Linie")
            addXplanLayer("RP_Windenergie", "Linie")
            addXplanLayer("RP_Windenergienutzung", "Linie")
            addXplanLayer("RP_WohnenSiedlung", "Linie")
            addXplanLayer("RP_ZentralerOrt", "Linie")
            addXplanLayer("RP_Sperrgebiet", "Linie")
            addXplanLayer("RP_Geometrieobjekt", "Linie")
            addXplanLayer("RP_Legendenobjekt", "Linie")
            addXplanLayer("RP_Objekt", "Linie")
            addXplanLayer("RP_Plan", "Punkt")
            # addXplanLayer("RP_Bereich", "Punkt") -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("RP_Achse", "Punkt")
            addXplanLayer("RP_Bodenschutz", "Punkt")
            addXplanLayer("RP_Einzelhandel", "Punkt")
            addXplanLayer("RP_Energieversorgung", "Punkt")
            addXplanLayer("RP_Entsorgung", "Punkt")
            addXplanLayer("RP_Entwicklungsschwerpunkte", "Punkt")
            addXplanLayer("RP_Erholung", "Punkt")
            addXplanLayer("RP_Forstwirtschaft", "Punkt")
            addXplanLayer("RP_Gewaesser", "Punkt")
            addXplanLayer("RP_Freiraum", "Punkt")
            addXplanLayer("RP_FreizeitErholung", "Punkt")
            addXplanLayer("RP_Funktionszuweisung", "Punkt")
            addXplanLayer("RP_GemeindeFunktionSiedlungsentwicklung", "Punkt")
            addXplanLayer("RP_GenerischesObjekt", "Punkt")
            addXplanLayer("RP_Grenze", "Punkt")
            addXplanLayer("RP_GruenzugGruenzaesur", "Punkt")
            addXplanLayer("RP_Hochwasserschutz", "Punkt")
            addXplanLayer("RP_IndustrieGewerbe", "Punkt")
            addXplanLayer("RP_Klimaschutz", "Punkt")
            addXplanLayer("RP_Kommunikation", "Punkt")
            addXplanLayer("RP_Kulturlandschaft", "Punkt")
            addXplanLayer("RP_LaermschutzBauschutz", "Punkt")
            addXplanLayer("RP_Laermschutzbereich", "Punkt")
            addXplanLayer("RP_Luftverkehr", "Punkt")
            addXplanLayer("RP_Landwirtschaft", "Punkt")
            addXplanLayer("RP_NaturLandschaft", "Punkt")
            addXplanLayer("RP_NaturschutzrechtlichesSchutzgebiet", "Punkt")
            addXplanLayer("RP_Planungsraum", "Punkt")
            addXplanLayer("RP_RadwegWanderweg", "Punkt")
            addXplanLayer("RP_Raumkategorie", "Punkt")
            addXplanLayer("RP_Rohstoff", "Punkt")
            addXplanLayer("RP_Rohstoffsicherung", "Punkt")
            addXplanLayer("RP_Schienenverkehr", "Punkt")
            addXplanLayer("RP_Siedlung", "Punkt")
            addXplanLayer("RP_SonstigeInfrastruktur", "Punkt")
            addXplanLayer("RP_SonstigeSiedlungsstruktur", "Punkt")
            addXplanLayer("RP_SonstigerFreiraumschutz", "Punkt")
            addXplanLayer("RP_SonstigerSiedlungsbereich", "Punkt")
            addXplanLayer("RP_SonstVerkehr", "Punkt")
            addXplanLayer("RP_SozialeInfrastruktur", "Punkt")
            addXplanLayer("RP_Sportanlage", "Punkt")
            addXplanLayer("RP_Strassenverkehr", "Punkt")
            addXplanLayer("RP_Verkehr", "Punkt")
            addXplanLayer("RP_VorbHochwasserschutz", "Punkt")
            addXplanLayer("RP_Wasserschutz", "Punkt")
            addXplanLayer("RP_Wasserverkehr", "Punkt")
            addXplanLayer("RP_Wasserwirtschaft", "Punkt")
            addXplanLayer("RP_Windenergie", "Punkt")
            addXplanLayer("RP_Windenergienutzung", "Punkt")
            addXplanLayer("RP_WohnenSiedlung", "Punkt")
            addXplanLayer("RP_ZentralerOrt", "Punkt")
            addXplanLayer("RP_Sperrgebiet", "Punkt")
            addXplanLayer("RP_Geometrieobjekt", "Punkt")
            addXplanLayer("RP_Legendenobjekt", "Punkt")
            addXplanLayer("RP_Objekt", "Punkt")
            # ----------------------------------------------------Start FNP--------------------------
            addXplanLayer("FP_Plan", "Flaeche")
            addXplanLayer(
                "FP_Bereich", "Text"
            )  # bei Bedarf wird der Style 'Flaeche' geladen
            addXplanLayer("FP_Flaechenschlussobjekt", "Flaeche")
            addXplanLayer("FP_FlaecheOhneDarstellung", "Flaeche")
            addXplanLayer("FP_WaldFlaeche", "Flaeche")
            addXplanLayer("FP_LandwirtschaftsFlaeche", "Flaeche")
            addXplanLayer("FP_Landwirtschaft", "Flaeche")
            addXplanLayer("FP_Gruen", "Flaeche")
            addXplanLayer("FP_Strassenverkehr", "Flaeche")
            addXplanLayer("FP_BebauungsFlaeche", "Flaeche")
            addXplanLayer("FP_Gewaesser", "Flaeche")
            addXplanLayer("FP_VerEntsorgung", "Flaeche")
            addXplanLayer("FP_Gemeinbedarf", "Flaeche")
            addXplanLayer("FP_SpielSportanlage", "Flaeche")
            # ----------------------------------------------------Start BPLAN--------------------------
            addXplanLayer("BP_Plan", "Flaeche")
            addXplanLayer("BP_PlanArt", "Flaeche")  # nur im XPlanBOX WMS enthalten ?
            addXplanLayer(
                "BP_Bereich", "Text"
            )  # bei Bedarf wird der Style 'Flaeche' geladen
            addXplanLayer("BP_GewaesserFlaeche", "Flaeche")
            addXplanLayer("BP_WaldFlaeche", "Flaeche")
            addXplanLayer("BP_Landwirtschaft", "Flaeche")
            addXplanLayer("BP_LandwirtschaftsFlaeche", "Flaeche")
            addXplanLayer("BP_StrassenVerkehrsFlaeche", "Flaeche")
            addXplanLayer("SO_Strassenverkehr", "Flaeche")
            addXplanLayer("BP_GruenFlaeche", "Flaeche")
            addXplanLayer("BP_BaugebietsTeilFlaeche-Geometrie", "Flaeche")
            addXplanLayer("BP_BaugebietsTeilFlaeche-Beschriftung", "Flaeche")
            addXplanLayer("BP_GemeinbedarfsFlaeche", "Flaeche")
            addXplanLayer("BP_KleintierhaltungFlaeche", "Flaeche")
            addXplanLayer("BP_SpielSportanlagenFlaeche", "Flaeche")
            addXplanLayer("BP_VerEntsorgung", "Flaeche")
            addXplanLayer("BP_VerkehrsflaecheBesondererZweckbestimmung", "Flaeche")
            # BP_Bereich_textlicher_Festsetzung im WMS enthalten …. Fehlt ?
            addXplanLayer("BP_AbgrabungsFlaeche", "Flaeche")
            addXplanLayer("BP_SchutzPflegeEntwicklungsFlaeche", "Flaeche")
            addXplanLayer("BP_AufschuettungsFlaeche", "Flaeche")
            addXplanLayer("BP_AbstandsFlaeche", "Flaeche")
            addXplanLayer("BP_AusgleichsFlaeche", "Flaeche")
            addXplanLayer("BP_BodenschaetzeFlaeche", "Flaeche")
            addXplanLayer("BP_GenerischesObjekt", "Flaeche")
            addXplanLayer("BP_BesondererNutzungszweckFlaeche", "Flaeche")
            addXplanLayer("BP_ErhaltungsBereichFlaeche", "Flaeche")
            addXplanLayer("BP_FoerderungsFlaeche", "Flaeche")
            addXplanLayer("BP_GebaeudeFlaeche", "Flaeche")
            addXplanLayer("BP_GemeinschaftsanlagenFlaeche", "Flaeche")
            addXplanLayer("FP_KeineZentrAbwasserBeseitigungFlaeche", "Flaeche")
            addXplanLayer("FP_Kennzeichnung", "Flaeche")
            addXplanLayer("FP_Bodenschaetze", "Flaeche")
            addXplanLayer("FP_AnpassungKlimawandel", "Flaeche")
            addXplanLayer("FP_GenerischesObjekt", "Flaeche")
            addXplanLayer("FP_AusgleichsFlaeche", "Flaeche")
            addXplanLayer("FP_VorbehalteFlaeche", "Flaeche")
            addXplanLayer("BP_WasserwirtschaftsFlaeche", "Flaeche")
            addXplanLayer("BP_NebenanlagenFlaeche", "Flaeche")
            addXplanLayer("BP_PersGruppenBestimmteFlaeche", "Flaeche")
            addXplanLayer("BP_Strassenkoerper", "Flaeche")
            # addXplanLayer('BP_StrassenbegrenzungsLinie', 'Flaeche') -> existiert nur als Linie
            addXplanLayer("BP_TechnischeMassnahmenFlaeche", "Flaeche")
            addXplanLayer("BP_UeberbaubareGrundstuecksFlaeche", "Flaeche")
            addXplanLayer("BP_NichtUeberbaubareGrundstuecksflaeche", "Flaeche")
            addXplanLayer("BP_NebenanlagenAusschlussFlaeche", "Flaeche")
            addXplanLayer("BP_AbstandsMass", "Flaeche")
            addXplanLayer("BP_FreiFlaeche", "Flaeche")
            addXplanLayer("FP_DarstellungNachLandesrecht", "Flaeche")
            addXplanLayer("FP_Flaechenobjekt", "Flaeche")
            addXplanLayer("FP_Geometrieobjekt", "Flaeche")
            addXplanLayer("FP_Linienobjekt", "Flaeche")
            addXplanLayer("FP_Objekt", "Flaeche")
            addXplanLayer("FP_Punktobjekt", "Flaeche")
            addXplanLayer("FP_Ueberlagerungsobjekt", "Flaeche")
            addXplanLayer("FP_TextlicheDarstellungsFlaeche", "Flaeche")
            addXplanLayer("FP_TextAbschnittFlaeche", "Flaeche")
            addXplanLayer("FP_ZentralerVersorgungsbereich", "Flaeche")
            addXplanLayer("BP_AnpflanzungBindungErhaltung", "Flaeche")
            addXplanLayer("BP_AusgleichsMassnahme", "Flaeche")
            addXplanLayer("BP_BereichOhneEinAusfahrtLinie", "Flaeche")
            # addXplanLayer('BP_EinfahrtsbereichLinie', 'Flaeche') -> existiert nur als Linie
            addXplanLayer("BP_EinfahrtPunkt", "Flaeche")
            addXplanLayer("BP_EingriffsBereich", "Flaeche")
            addXplanLayer("BP_FestsetzungNachLandesrecht", "Flaeche")
            addXplanLayer("BP_FirstRichtungsLinie", "Flaeche")
            addXplanLayer("BP_GemeinschaftsanlagenZuordnung", "Flaeche")
            addXplanLayer("BP_HoehenMass", "Flaeche")
            addXplanLayer("BP_Immissionsschutz", "Flaeche")
            addXplanLayer("BP_RegelungVergnuegungsstaetten", "Flaeche")
            addXplanLayer("BP_SchutzPflegeEntwicklungsMassnahme", "Flaeche")
            addXplanLayer("BP_SpezielleBauweise", "Flaeche")
            addXplanLayer("BP_UnverbindlicheVormerkung", "Flaeche")
            addXplanLayer("BP_Veraenderungssperre", "Flaeche")
            addXplanLayer("BP_Wegerecht", "Flaeche")
            # addXplanLayer('BP_NutzungsartenGrenze', 'Flaeche') -> existiert nur als Linie
            # addXplanLayer('BP_BauGrenze', 'Flaeche') -> existiert nur als Linie
            # addXplanLayer('BP_BauLinie', 'Flaeche') -> existiert nur als Linie
            addXplanLayer("BP_AbweichungVonBaugrenze", "Flaeche")
            addXplanLayer(
                "BP_AbweichungVonUeberbaubererGrundstuecksFlaeche", "Flaeche"
            )  # v5 mit Schreibfehler
            addXplanLayer(
                "BP_AbweichungVonUeberbaubarerGrundstuecksFlaeche", "Flaeche"
            )  # v6
            addXplanLayer("BP_RichtungssektorGrenze", "Flaeche")
            addXplanLayer("BP_ZusatzkontingentLaerm", "Flaeche")
            addXplanLayer("BP_ZusatzkontingentLaermFlaeche", "Flaeche")
            addXplanLayer("BP_Sichtflaeche", "Flaeche")
            addXplanLayer("BP_Symbole", "Punkt")  # nur im XPlanBOX WMS enthalten ?
            addXplanLayer("BP_Beschriftung", "Punkt")  # nur im XPlanBOX WMS enthalten ?
            addXplanLayer("BP_RekultivierungsFlaeche", "Flaeche")
            addXplanLayer(
                "BP_TextlicheFestsetzungsFlaeche", "Flaeche"
            )  # bis XPlanung v5.4
            addXplanLayer("BP_TextAbschnittFlaeche", "Flaeche")  # ab XPlanung v6
            addXplanLayer("BP_ZentralerVersorgungsbereich", "Flaeche")
            # ----------------------------------------------------Start LPLAN--------------------------
            addXplanLayer("LP_Plan", "Flaeche")
            addXplanLayer(
                "LP_Bereich", "Text"
            )  # bei Bedarf wird der Style 'Flaeche' geladen
            addXplanLayer("LP_AllgGruenflaeche", "Flaeche")
            addXplanLayer("LP_Biotopverbundflaeche", "Flaeche")
            addXplanLayer("LP_TextlicheFestsetzungsFlaeche", "Flaeche")
            addXplanLayer("LP_ZuBegruenendeGrundstueckflaeche", "Flaeche")
            # addXplanLayer("XP_Bereich", "Flaeche") -> kommt so nicht vor
            addXplanLayer("BP_Dachgestaltung", "Flaeche")
            addXplanLayer("BP_EmissionskontingentLaerm", "Flaeche")
            addXplanLayer("BP_EmissionskontingentLaermGebiet", "Flaeche")
            addXplanLayer("BP_Flaechenobjekt", "Flaeche")
            addXplanLayer("BP_Flaechenschlussobjekt", "Flaeche")
            addXplanLayer("BP_FlaecheOhneFestsetzung", "Flaeche")
            addXplanLayer("BP_Geometrieobjekt", "Flaeche")
            addXplanLayer("BP_Linienobjekt", "Flaeche")
            addXplanLayer("BP_Objekt", "Flaeche")
            addXplanLayer("BP_Punktobjekt", "Flaeche")
            addXplanLayer("BP_Richtungssektor", "Flaeche")
            addXplanLayer("BP_Ueberlagerungsobjekt", "Flaeche")
            addXplanLayer("LP_Abgrenzung", "Flaeche")
            addXplanLayer("LP_AnpflanzungBindungErhaltung", "Flaeche")
            addXplanLayer("LP_Ausgleich", "Flaeche")
            addXplanLayer("LP_Bodenschutzrecht", "Flaeche")
            addXplanLayer("LP_ErholungFreizeit", "Flaeche")
            addXplanLayer("LP_Flaechenobjekt", "Flaeche")
            addXplanLayer("LP_Forstrecht", "Flaeche")
            addXplanLayer("LP_GenerischesObjekt", "Flaeche")
            addXplanLayer("LP_Geometrieobjekt", "Flaeche")
            addXplanLayer("LP_Landschaftsbild", "Flaeche")
            addXplanLayer("LP_Linienobjekt", "Flaeche")
            addXplanLayer("LP_NutzungsAusschluss", "Flaeche")
            addXplanLayer("LP_NutzungserfordernisRegelung", "Flaeche")
            addXplanLayer("LP_Objekt", "Flaeche")
            addXplanLayer("LP_PlanerischeVertiefung", "Flaeche")
            addXplanLayer("LP_Punktobjekt", "Flaeche")
            addXplanLayer("LP_SchutzobjektInternatRecht", "Flaeche")
            addXplanLayer("LP_SchutzobjektLandesrecht", "Flaeche")
            addXplanLayer("LP_SchutzPflegeEntwicklung", "Flaeche")
            addXplanLayer("LP_SonstigesRecht", "Flaeche")
            addXplanLayer(
                "LP_WasserrechtGemeingebrEinschraenkungNaturschutz", "Flaeche"
            )
            addXplanLayer("LP_WasserrechtSchutzgebiet", "Flaeche")
            addXplanLayer("LP_WasserrechtSonstige", "Flaeche")
            addXplanLayer("LP_WasserrechtWirtschaftAbflussHochwSchutz", "Flaeche")
            addXplanLayer("LP_Zwischennutzung", "Flaeche")
            # ----------------------------------------------------Start LPLAN Flaechen v6 --------------------------
            addXplanLayer("LP_ReferenzLPObjekt", "Flaeche")
            addXplanLayer("LP_VorschlagIntegrationBauleitplanung", "Flaeche")
            addXplanLayer("LP_VorschlagIntegrationRaumordnung", "Flaeche")
            addXplanLayer("LP_SchutzBestimmterTeileVonNaturUndLandschaft", "Flaeche")
            addXplanLayer("LP_BiotopverbundBiotopvernetzung", "Flaeche")
            addXplanLayer("LP_Eingriffsregelung", "Flaeche")
            addXplanLayer("LP_ZieleErfordernisseMassnahmen", "Flaeche")
            addXplanLayer("LP_TextAbschnittObjekt", "Flaeche")
            addXplanLayer("SO_Schienenverkehrsrecht", "Flaeche")
            addXplanLayer("SO_Gewaesser", "Flaeche")
            addXplanLayer("BP_KennzeichnungsFlaeche", "Flaeche")
            addXplanLayer("SO_Wasserrecht", "Flaeche")
            addXplanLayer("SO_Forstrecht", "Flaeche")
            addXplanLayer("SO_Bodenschutzrecht", "Flaeche")
            addXplanLayer("SO_Denkmalschutzrecht", "Flaeche")
            addXplanLayer("SO_Baubeschraenkung", "Flaeche")
            addXplanLayer("SO_Wasserwirtschaft", "Flaeche")
            addXplanLayer("SO_Sichtflaeche", "Flaeche")
            addXplanLayer("SO_TextAbschnittFlaeche", "Flaeche")
            addXplanLayer("SO_Gelaendemorphologie", "Flaeche")
            addXplanLayer("SO_SchutzgebietWasserrecht", "Flaeche")
            addXplanLayer("SO_Luftverkehrsrecht", "Flaeche")
            addXplanLayer("SO_SchutzgebietSonstigesRecht", "Flaeche")
            addXplanLayer("FP_Aufschuettung", "Flaeche")
            addXplanLayer("FP_Wasserwirtschaft", "Flaeche")
            addXplanLayer("FP_NutzungsbeschraenkungsFlaeche", "Flaeche")
            addXplanLayer("FP_Nutzungsbeschraenkung", "Flaeche")
            addXplanLayer("FP_Abgrabung", "Flaeche")
            addXplanLayer("FP_SchutzPflegeEntwicklung", "Flaeche")
            addXplanLayer("FP_UnverbindlicheVormerkung", "Flaeche")
            addXplanLayer("FP_PrivilegiertesVorhaben", "Flaeche")
            addXplanLayer("SO_Strassenverkehrsrecht", "Flaeche")
            addXplanLayer("SO_Bauverbotszone", "Flaeche")
            addXplanLayer("SO_Grenze", "Flaeche")
            addXplanLayer("SO_Flaechenobjekt", "Flaeche")
            addXplanLayer("SO_Gebiet", "Flaeche")
            addXplanLayer("SO_Gelaendemorphologie", "Flaeche")
            addXplanLayer("SO_Geometrieobjekt", "Flaeche")
            addXplanLayer("SO_Linienobjekt", "Flaeche")
            addXplanLayer("SO_Objekt", "Flaeche")
            addXplanLayer("SO_Punktobjekt", "Flaeche")
            addXplanLayer("SO_SchutzgebietNaturschutzrecht", "Flaeche")
            addXplanLayer("SO_SonstigesRecht", "Flaeche")
            addXplanLayer("XP_AbstraktesPraesentationsobjekt", "Flaeche")
            # addXplanLayer("XP_BegruendungAbschnitt", "Flaeche") -> existiert nur als Text
            addXplanLayer("XP_DatumAttribut", "Flaeche")
            addXplanLayer("XP_DoubleAttribut", "Flaeche")
            addXplanLayer("XP_ExterneReferenz", "Flaeche")
            addXplanLayer("XP_FPO", "Flaeche")
            addXplanLayer("XP_Gemeinde", "Flaeche")
            addXplanLayer("XP_GenerAttribut", "Flaeche")
            addXplanLayer("XP_Hoehenangabe", "Flaeche")
            addXplanLayer("XP_IntegerAttribut", "Flaeche")
            addXplanLayer("XP_LPO", "Flaeche")
            addXplanLayer("XP_LTO", "Flaeche")
            addXplanLayer("XP_Nutzungsschablone", "Flaeche")
            addXplanLayer("XP_Objekt", "Flaeche")
            addXplanLayer("XP_Plan", "Flaeche")
            addXplanLayer("XP_Plangeber", "Flaeche")
            addXplanLayer("XP_Flaechengeometrie", "Flaeche")
            # addXplanLayer('XP_PPO', 'Flaeche') -> existiert nur als Punkt
            addXplanLayer("XP_Praesentationsobjekt", "Flaeche")
            # addXplanLayer('XP_PTO', 'Flaeche') -> existiert nur als Punkt
            addXplanLayer("XP_SPEMassnahmenDaten", "Flaeche")
            addXplanLayer("XP_SpezExterneReferenz", "Flaeche")
            addXplanLayer("XP_StringAttribut", "Flaeche")
            addXplanLayer("XP_TPO", "Flaeche")
            addXplanLayer("XP_URLAttribut", "Flaeche")
            addXplanLayer("XP_VerbundenerPlan", "Flaeche")
            addXplanLayer("XP_VerfahrensMerkmal", "Flaeche")
            addXplanLayer("XP_WirksamkeitBedingung", "Flaeche")
            addXplanLayer("BP_Plan", "Linie")
            addXplanLayer("BP_StrassenbegrenzungsLinie", "Linie")
            addXplanLayer("BP_NutzungsartenGrenze", "Linie")
            addXplanLayer("BP_EinfahrtsbereichLinie", "Linie")
            addXplanLayer("BP_BauGrenze", "Linie")
            addXplanLayer("BP_BauLinie", "Linie")
            addXplanLayer("BP_VerEntsorgung", "Linie")
            addXplanLayer("BP_AbweichungVonUeberbaubererGrundstuecksFlaeche", "Linie")
            addXplanLayer("BP_AufschuettungsFlaeche", "Linie")
            addXplanLayer("BP_AusgleichsFlaeche", "Linie")
            # addXplanLayer('BP_BaugebietsTeilFlaeche', 'Linie') -> existiert nur als Flaeche
            # addXplanLayer('BP_Bereich', 'Linie') -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("BP_BesondererNutzungszweckFlaeche", "Linie")
            addXplanLayer("BP_BodenschaetzeFlaeche", "Linie")
            addXplanLayer("BP_EingriffsBereich", "Linie")
            addXplanLayer("BP_ErhaltungsBereichFlaeche", "Linie")
            addXplanLayer("BP_FoerderungsFlaeche", "Linie")
            addXplanLayer("BP_FreiFlaeche", "Linie")
            addXplanLayer("BP_GebaeudeFlaeche", "Linie")
            addXplanLayer("BP_GemeinbedarfsFlaeche", "Linie")
            addXplanLayer("BP_GemeinschaftsanlagenFlaeche", "Linie")
            addXplanLayer("BP_GewaesserFlaeche", "Linie")
            # addXplanLayer('BP_GruenFlaeche', 'Linie') -> existiert nur als Flaeche
            # addXplanLayer('BP_KennzeichnungsFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("BP_KleintierhaltungFlaeche", "Linie")
            # addXplanLayer('BP_LandwirtschaftsFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("BP_NebenanlagenAusschlussFlaeche", "Linie")
            # addXplanLayer('BP_NebenanlagenFlaeche', 'Linie') -> existiert nur als Flaeche
            # addXplanLayer('BP_NichtUeberbaubareGrundstuecksflaeche', 'Linie') -> existiert nur als Flaeche
            # addXplanLayer('BP_UeberbaubareGrundstuecksFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("BP_PersGruppenBestimmteFlaeche", "Linie")
            addXplanLayer("BP_RekultivierungsFlaeche", "Linie")
            # addXplanLayer('BP_SchutzPflegeEntwicklungsFlaeche', 'Linie') -> existiert nur als Flaeche
            # addXplanLayer('BP_Sichtflaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("BP_SpielSportanlagenFlaeche", "Linie")
            # addXplanLayer('BP_StrassenVerkehrsFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("SO_Strassenverkehr", "Linie")
            addXplanLayer("SO_Baubeschraenkung", "Linie")
            addXplanLayer("SO_Wasserwirtschaft", "Linie")
            addXplanLayer("SO_Gelaendemorphologie", "Linie")
            addXplanLayer("BP_TechnischeMassnahmenFlaeche", "Linie")
            addXplanLayer("BP_TextlicheFestsetzungsFlaeche", "Linie")
            addXplanLayer("BP_VerkehrsflaecheBesondererZweckbestimmung", "Linie")
            # addXplanLayer('BP_WaldFlaeche', 'Linie') -> existiert nur als Flaeche
            # addXplanLayer('BP_WasserwirtschaftsFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("BP_ZentralerVersorgungsbereich", "Linie")
            addXplanLayer("BP_ZusatzkontingentLaermFlaeche", "Linie")
            addXplanLayer("FP_AusgleichsFlaeche", "Linie")
            addXplanLayer("FP_BebauungsFlaeche", "Linie")
            # addXplanLayer("FP_Bereich", "Linie") -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("FP_KeineZentrAbwasserBeseitigungFlaeche", "Linie")
            # addXplanLayer('FP_LandwirtschaftsFlaeche', 'Linie')  -> existiert nur als Flaeche
            addXplanLayer("FP_NutzungsbeschraenkungsFlaeche", "Linie")
            addXplanLayer("FP_Plan", "Linie")
            addXplanLayer("FP_TextlicheDarstellungsFlaeche", "Linie")
            addXplanLayer("FP_VorbehalteFlaeche", "Linie")
            # addXplanLayer('FP_WaldFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("FP_ZentralerVersorgungsbereich", "Linie")
            addXplanLayer("FP_Nutzungsbeschraenkung", "Linie")
            addXplanLayer("LP_AllgGruenflaeche", "Linie")
            # addXplanLayer("LP_Bereich", "Linie") -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("LP_Biotopverbundflaeche", "Linie")
            addXplanLayer("LP_TextlicheFestsetzungsFlaeche", "Linie")
            addXplanLayer("LP_ZuBegruenendeGrundstueckflaeche", "Linie")
            # addXplanLayer("SO_Bereich", "Linie") -> existiert wahrscheinlich nur als Flaeche
            # addXplanLayer("XP_Bereich", "Linie") kommt so nicht vor
            # addXplanLayer('BP_AbgrabungsFlaeche', 'Linie') -> existiert nur als Flaeche
            addXplanLayer("BP_AbweichungVonBaugrenze", "Linie")
            addXplanLayer("BP_BereichOhneEinAusfahrtLinie", "Linie")
            addXplanLayer("BP_FirstRichtungsLinie", "Linie")
            addXplanLayer("BP_RichtungssektorGrenze", "Linie")
            addXplanLayer("SO_Grenze", "Linie")
            addXplanLayer("BP_AnpflanzungBindungErhaltung", "Linie")
            addXplanLayer("BP_AusgleichsMassnahme", "Linie")
            addXplanLayer("BP_Dachgestaltung", "Linie")
            addXplanLayer("BP_EinfahrtPunkt", "Linie")
            addXplanLayer("BP_EmissionskontingentLaerm", "Linie")
            addXplanLayer("BP_EmissionskontingentLaermGebiet", "Linie")
            addXplanLayer("BP_FestsetzungNachLandesrecht", "Linie")
            addXplanLayer("BP_Flaechenobjekt", "Linie")
            addXplanLayer("BP_Flaechenschlussobjekt", "Linie")
            addXplanLayer("BP_FlaecheOhneFestsetzung", "Linie")
            addXplanLayer("BP_GemeinschaftsanlagenZuordnung", "Linie")
            addXplanLayer("BP_GenerischesObjekt", "Linie")
            addXplanLayer("BP_Geometrieobjekt", "Linie")
            addXplanLayer("BP_HoehenMass", "Linie")
            addXplanLayer("BP_Immissionsschutz", "Linie")
            addXplanLayer("BP_Landwirtschaft", "Linie")
            addXplanLayer("BP_Linienobjekt", "Linie")
            addXplanLayer("BP_Objekt", "Linie")
            addXplanLayer("BP_Punktobjekt", "Linie")
            addXplanLayer("BP_RegelungVergnuegungsstaetten", "Linie")
            addXplanLayer("BP_Richtungssektor", "Linie")
            addXplanLayer("BP_SchutzPflegeEntwicklungsMassnahme", "Linie")
            addXplanLayer("BP_SpezielleBauweise", "Linie")
            addXplanLayer("BP_Strassenkoerper", "Linie")
            addXplanLayer("BP_Ueberlagerungsobjekt", "Linie")
            addXplanLayer("BP_UnverbindlicheVormerkung", "Linie")
            addXplanLayer("BP_Veraenderungssperre", "Linie")
            addXplanLayer("BP_Wegerecht", "Linie")
            addXplanLayer("BP_AbstandsFlaeche", "Linie")
            addXplanLayer("BP_ZusatzkontingentLaerm", "Linie")
            addXplanLayer("BP_AbstandsMass", "Linie")
            addXplanLayer("FP_Abgrabung", "Linie")
            addXplanLayer("FP_AnpassungKlimawandel", "Linie")
            addXplanLayer("FP_Aufschuettung", "Linie")
            addXplanLayer("FP_Bodenschaetze", "Linie")
            addXplanLayer("FP_DarstellungNachLandesrecht", "Linie")
            addXplanLayer("FP_Flaechenobjekt", "Linie")
            addXplanLayer("FP_Flaechenschlussobjekt", "Linie")
            addXplanLayer("FP_FlaecheOhneDarstellung", "Linie")
            addXplanLayer("FP_Gemeinbedarf", "Linie")
            addXplanLayer("FP_GenerischesObjekt", "Linie")
            addXplanLayer("FP_Geometrieobjekt", "Linie")
            addXplanLayer("FP_Gewaesser", "Linie")
            addXplanLayer("FP_Gruen", "Linie")
            addXplanLayer("FP_Kennzeichnung", "Linie")
            addXplanLayer("FP_Landwirtschaft", "Linie")
            addXplanLayer("FP_Linienobjekt", "Linie")
            addXplanLayer("FP_Objekt", "Linie")
            addXplanLayer("FP_PrivilegiertesVorhaben", "Linie")
            addXplanLayer("FP_Punktobjekt", "Linie")
            addXplanLayer("FP_SchutzPflegeEntwicklung", "Linie")
            addXplanLayer("FP_SpielSportanlage", "Linie")
            addXplanLayer("FP_Strassenverkehr", "Linie")
            addXplanLayer("FP_Ueberlagerungsobjekt", "Linie")
            addXplanLayer("FP_UnverbindlicheVormerkung", "Linie")
            addXplanLayer("FP_VerEntsorgung", "Linie")
            addXplanLayer("FP_Wasserwirtschaft", "Linie")
            addXplanLayer("LP_Abgrenzung", "Linie")
            addXplanLayer("LP_AnpflanzungBindungErhaltung", "Linie")
            addXplanLayer("LP_Ausgleich", "Linie")
            addXplanLayer("LP_Bodenschutzrecht", "Linie")
            addXplanLayer("LP_ErholungFreizeit", "Linie")
            addXplanLayer("LP_Flaechenobjekt", "Linie")
            addXplanLayer("LP_Forstrecht", "Linie")
            addXplanLayer("LP_GenerischesObjekt", "Linie")
            addXplanLayer("LP_Geometrieobjekt", "Linie")
            addXplanLayer("LP_Landschaftsbild", "Linie")
            addXplanLayer("LP_Linienobjekt", "Linie")
            addXplanLayer("LP_NutzungsAusschluss", "Linie")
            addXplanLayer("LP_NutzungserfordernisRegelung", "Linie")
            addXplanLayer("LP_Objekt", "Linie")
            addXplanLayer("LP_Plan", "Linie")
            addXplanLayer("LP_PlanerischeVertiefung", "Linie")
            addXplanLayer("LP_Punktobjekt", "Linie")
            addXplanLayer("LP_SchutzobjektInternatRecht", "Linie")
            addXplanLayer("LP_SchutzobjektLandesrecht", "Linie")
            addXplanLayer("LP_SchutzPflegeEntwicklung", "Linie")
            addXplanLayer("LP_SonstigesRecht", "Linie")
            addXplanLayer("LP_WasserrechtGemeingebrEinschraenkungNaturschutz", "Linie")
            addXplanLayer("LP_WasserrechtSchutzgebiet", "Linie")
            addXplanLayer("LP_WasserrechtSonstige", "Linie")
            addXplanLayer("LP_WasserrechtWirtschaftAbflussHochwSchutz", "Linie")
            addXplanLayer("LP_Zwischennutzung", "Linie")
            # ----------------------------------------------------Start LPLAN Linien v6 --------------------------
            addXplanLayer("LP_ReferenzLPObjekt", "Linie")
            addXplanLayer("LP_VorschlagIntegrationBauleitplanung", "Linie")
            addXplanLayer("LP_VorschlagIntegrationRaumordnung", "Linie")
            addXplanLayer("LP_SchutzBestimmterTeileVonNaturUndLandschaft", "Linie")
            addXplanLayer("LP_BiotopverbundBiotopvernetzung", "Linie")
            addXplanLayer("LP_Eingriffsregelung", "Linie")
            addXplanLayer("LP_ZieleErfordernisseMassnahmen", "Linie")
            addXplanLayer("LP_TextAbschnittObjekt", "Linie")
            addXplanLayer("RP_ErneuerbareEnergie", "Linie")
            addXplanLayer("SO_Bauverbotszone", "Linie")
            addXplanLayer("SO_Bodenschutzrecht", "Linie")
            addXplanLayer("SO_Denkmalschutzrecht", "Linie")
            addXplanLayer("SO_Flaechenobjekt", "Linie")
            addXplanLayer("SO_Forstrecht", "Linie")
            addXplanLayer("SO_Gebiet", "Linie")
            addXplanLayer("SO_Gelaendemorphologie", "Linie")
            addXplanLayer("SO_Geometrieobjekt", "Linie")
            addXplanLayer("SO_Gewaesser", "Linie")
            addXplanLayer("SO_Linienobjekt", "Linie")
            addXplanLayer("SO_Luftverkehrsrecht", "Linie")
            addXplanLayer("SO_Objekt", "Linie")
            addXplanLayer("SO_Plan", "Linie")
            addXplanLayer("SO_Punktobjekt", "Linie")
            addXplanLayer("SO_Schienenverkehrsrecht", "Linie")
            addXplanLayer("SO_SchutzgebietNaturschutzrecht", "Linie")
            addXplanLayer("SO_SchutzgebietSonstigesRecht", "Linie")
            addXplanLayer("SO_SchutzgebietWasserrecht", "Linie")
            addXplanLayer("SO_SonstigesRecht", "Linie")
            addXplanLayer("SO_Strassenverkehrsrecht", "Linie")
            addXplanLayer("SO_Wasserrecht", "Linie")
            addXplanLayer("XP_AbstraktesPraesentationsobjekt", "Linie")
            # addXplanLayer("XP_BegruendungAbschnitt", "Linie") -> existiert nur als Text
            addXplanLayer("XP_DatumAttribut", "Linie")
            addXplanLayer("XP_DoubleAttribut", "Linie")
            addXplanLayer("XP_ExterneReferenz", "Linie")
            addXplanLayer("XP_FPO", "Linie")
            addXplanLayer("XP_Gemeinde", "Linie")
            addXplanLayer("XP_Liniengeometrie", "Linie")
            addXplanLayer("XP_GenerAttribut", "Linie")
            addXplanLayer("XP_Hoehenangabe", "Linie")
            addXplanLayer("XP_IntegerAttribut", "Linie")
            addXplanLayer("XP_LPO", "Linie")
            addXplanLayer("XP_LTO", "Linie")
            addXplanLayer("XP_Nutzungsschablone", "Linie")
            addXplanLayer("XP_Objekt", "Linie")
            addXplanLayer("XP_Plan", "Linie")
            addXplanLayer("XP_Plangeber", "Linie")
            # addXplanLayer('XP_PPO', 'Linie') -> existiert nur als Punkt
            addXplanLayer("XP_Praesentationsobjekt", "Linie")
            # addXplanLayer('XP_PTO', 'Linie') -> -> existiert nur als Punkt
            addXplanLayer("XP_SPEMassnahmenDaten", "Linie")
            addXplanLayer("XP_SpezExterneReferenz", "Linie")
            addXplanLayer("XP_StringAttribut", "Linie")
            addXplanLayer("XP_TPO", "Linie")
            addXplanLayer("XP_URLAttribut", "Linie")
            addXplanLayer("XP_VerbundenerPlan", "Linie")
            addXplanLayer("XP_VerfahrensMerkmal", "Linie")
            addXplanLayer("XP_WirksamkeitBedingung", "Linie")
            addXplanLayer("BP_Plan", "Punkt")
            addXplanLayer("BP_AbstandsFlaeche", "Punkt")
            addXplanLayer("BP_AbweichungVonUeberbaubererGrundstuecksFlaeche", "Punkt")
            addXplanLayer("BP_AufschuettungsFlaeche", "Punkt")
            addXplanLayer("BP_AusgleichsFlaeche", "Punkt")
            # addXplanLayer('BP_BaugebietsTeilFlaeche', 'Punkt') -> existiert nur als Flaeche
            # addXplanLayer('BP_Bereich', 'Punkt') -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("BP_BesondererNutzungszweckFlaeche", "Punkt")
            addXplanLayer("BP_BodenschaetzeFlaeche", "Punkt")
            addXplanLayer("BP_EingriffsBereich", "Punkt")
            addXplanLayer("BP_ErhaltungsBereichFlaeche", "Punkt")
            addXplanLayer("BP_FoerderungsFlaeche", "Punkt")
            addXplanLayer("BP_FreiFlaeche", "Punkt")
            addXplanLayer("BP_GebaeudeFlaeche", "Punkt")
            addXplanLayer("BP_GemeinbedarfsFlaeche", "Punkt")
            addXplanLayer("BP_GemeinschaftsanlagenFlaeche", "Punkt")
            addXplanLayer("BP_GewaesserFlaeche", "Punkt")
            # addXplanLayer('BP_GruenFlaeche', 'Punkt') -> existiert nur als Flaeche
            # addXplanLayer('BP_KennzeichnungsFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("BP_KleintierhaltungFlaeche", "Punkt")
            # addXplanLayer('BP_LandwirtschaftsFlaeche', 'Punkt')  -> existiert nur als Flaeche
            addXplanLayer("BP_NebenanlagenAusschlussFlaeche", "Punkt")
            # addXplanLayer('BP_NebenanlagenFlaeche', 'Punkt') -> existiert nur als Flaeche
            # addXplanLayer('BP_NichtUeberbaubareGrundstuecksflaeche', 'Punkt') -> existiert nur als Flaeche
            # addXplanLayer('BP_UeberbaubareGrundstuecksFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("BP_PersGruppenBestimmteFlaeche", "Punkt")
            addXplanLayer("BP_RekultivierungsFlaeche", "Punkt")
            # addXplanLayer('BP_SchutzPflegeEntwicklungsFlaeche', 'Punkt') -> existiert nur als Flaeche
            # addXplanLayer('BP_Sichtflaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("BP_SpielSportanlagenFlaeche", "Punkt")
            # addXplanLayer('BP_StrassenVerkehrsFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("SO_Strassenverkehr", "Punkt")
            addXplanLayer("BP_TechnischeMassnahmenFlaeche", "Punkt")
            addXplanLayer("BP_TextlicheFestsetzungsFlaeche", "Punkt")
            addXplanLayer("BP_VerEntsorgung", "Punkt")
            addXplanLayer("BP_VerkehrsflaecheBesondererZweckbestimmung", "Punkt")
            # addXplanLayer('BP_WaldFlaeche', 'Punkt') -> existiert nur als Flaeche
            # addXplanLayer('BP_WasserwirtschaftsFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("BP_ZentralerVersorgungsbereich", "Punkt")
            addXplanLayer("BP_ZusatzkontingentLaermFlaeche", "Punkt")
            addXplanLayer("FP_AusgleichsFlaeche", "Punkt")
            addXplanLayer("FP_BebauungsFlaeche", "Punkt")
            # addXplanLayer("FP_Bereich", "Punkt") -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("FP_KeineZentrAbwasserBeseitigungFlaeche", "Punkt")
            addXplanLayer("FP_Nutzungsbeschraenkung", "Punkt")
            # addXplanLayer('FP_LandwirtschaftsFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("FP_NutzungsbeschraenkungsFlaeche", "Punkt")
            addXplanLayer("FP_Plan", "Punkt")
            addXplanLayer("FP_TextlicheDarstellungsFlaeche", "Punkt")
            addXplanLayer("FP_VorbehalteFlaeche", "Punkt")
            # addXplanLayer('FP_WaldFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("FP_ZentralerVersorgungsbereich", "Punkt")
            addXplanLayer("LP_AllgGruenflaeche", "Punkt")
            # addXplanLayer("LP_Bereich", "Punkt") -> existiert wahrscheinlich nur als Flaeche
            addXplanLayer("LP_Biotopverbundflaeche", "Punkt")
            addXplanLayer("LP_TextlicheFestsetzungsFlaeche", "Punkt")
            addXplanLayer("LP_ZuBegruenendeGrundstueckflaeche", "Punkt")
            # ----------------------------------------------------Start LPLAN Punktn v6 --------------------------
            addXplanLayer("LP_ReferenzLPObjekt", "Punkt")
            addXplanLayer("LP_VorschlagIntegrationBauleitplanung", "Punkt")
            addXplanLayer("LP_VorschlagIntegrationRaumordnung", "Punkt")
            addXplanLayer("LP_SchutzBestimmterTeileVonNaturUndLandschaft", "Punkt")
            addXplanLayer("LP_BiotopverbundBiotopvernetzung", "Punkt")
            addXplanLayer("LP_Eingriffsregelung", "Punkt")
            addXplanLayer("LP_ZieleErfordernisseMassnahmen", "Punkt")
            addXplanLayer("LP_TextAbschnittObjekt", "Punkt")
            # addXplanLayer("SO_Bereich", "Punkt") -> existiert wahrscheinlich nur als Flaeche
            # addXplanLayer("XP_Bereich", "Punkt") kommt so nicht vor
            # addXplanLayer('BP_AbgrabungsFlaeche', 'Punkt') -> existiert nur als Flaeche
            addXplanLayer("BP_AbweichungVonBaugrenze", "Punkt")
            # addXplanLayer('BP_BauGrenze', 'Punkt') -> existiert nur als Linie
            # addXplanLayer('BP_BauLinie', 'Punkt') -> existiert nur als Linie
            addXplanLayer("BP_BereichOhneEinAusfahrtLinie", "Punkt")
            # addXplanLayer('BP_EinfahrtsbereichLinie', 'Punkt') -> existiert nur als Linie
            addXplanLayer("BP_FirstRichtungsLinie", "Punkt")
            # addXplanLayer('BP_NutzungsartenGrenze', 'Punkt') -> existiert nur als Linie
            addXplanLayer("BP_RichtungssektorGrenze", "Punkt")
            # addXplanLayer('BP_StrassenbegrenzungsLinie', 'Punkt') -> existiert nur als Linie
            addXplanLayer("SO_Grenze", "Punkt")
            addXplanLayer("BP_AbstandsMass", "Punkt")
            addXplanLayer("BP_AnpflanzungBindungErhaltung", "Punkt")
            addXplanLayer("BP_AusgleichsMassnahme", "Punkt")
            addXplanLayer("BP_Dachgestaltung", "Punkt")
            addXplanLayer("BP_EinfahrtPunkt", "Punkt")
            addXplanLayer("BP_EmissionskontingentLaerm", "Punkt")
            addXplanLayer("BP_EmissionskontingentLaermGebiet", "Punkt")
            addXplanLayer("BP_FestsetzungNachLandesrecht", "Punkt")
            addXplanLayer("BP_Flaechenobjekt", "Punkt")
            addXplanLayer("BP_Flaechenschlussobjekt", "Punkt")
            addXplanLayer("BP_FlaecheOhneFestsetzung", "Punkt")
            addXplanLayer("BP_GemeinschaftsanlagenZuordnung", "Punkt")
            addXplanLayer("BP_GenerischesObjekt", "Punkt")
            addXplanLayer("BP_Geometrieobjekt", "Punkt")
            addXplanLayer("BP_HoehenMass", "Punkt")
            addXplanLayer("BP_Immissionsschutz", "Punkt")
            addXplanLayer("BP_Landwirtschaft", "Punkt")
            addXplanLayer("BP_Linienobjekt", "Punkt")
            addXplanLayer("BP_Objekt", "Punkt")
            addXplanLayer("BP_Punktobjekt", "Punkt")
            addXplanLayer("BP_RegelungVergnuegungsstaetten", "Punkt")
            addXplanLayer("BP_Richtungssektor", "Punkt")
            addXplanLayer("BP_SchutzPflegeEntwicklungsMassnahme", "Punkt")
            addXplanLayer("BP_SpezielleBauweise", "Punkt")
            addXplanLayer("BP_Strassenkoerper", "Punkt")
            addXplanLayer("BP_Ueberlagerungsobjekt", "Punkt")
            addXplanLayer("BP_UnverbindlicheVormerkung", "Punkt")
            addXplanLayer("BP_Veraenderungssperre", "Punkt")
            addXplanLayer("BP_Wegerecht", "Punkt")
            addXplanLayer("BP_ZusatzkontingentLaerm", "Punkt")
            addXplanLayer("FP_Abgrabung", "Punkt")
            addXplanLayer("FP_AnpassungKlimawandel", "Punkt")
            addXplanLayer("FP_Aufschuettung", "Punkt")
            addXplanLayer("FP_Bodenschaetze", "Punkt")
            addXplanLayer("FP_DarstellungNachLandesrecht", "Punkt")
            addXplanLayer("FP_Flaechenobjekt", "Punkt")
            addXplanLayer("FP_Flaechenschlussobjekt", "Punkt")
            addXplanLayer("FP_FlaecheOhneDarstellung", "Punkt")
            addXplanLayer("FP_Gemeinbedarf", "Punkt")
            addXplanLayer("FP_GenerischesObjekt", "Punkt")
            addXplanLayer("FP_Geometrieobjekt", "Punkt")
            addXplanLayer("FP_Gewaesser", "Punkt")
            addXplanLayer("FP_Gruen", "Punkt")
            addXplanLayer("FP_Kennzeichnung", "Punkt")
            addXplanLayer("FP_Landwirtschaft", "Punkt")
            addXplanLayer("FP_Linienobjekt", "Punkt")
            addXplanLayer("FP_Objekt", "Punkt")
            addXplanLayer("FP_PrivilegiertesVorhaben", "Punkt")
            addXplanLayer("FP_Punktobjekt", "Punkt")
            addXplanLayer("FP_SchutzPflegeEntwicklung", "Punkt")
            addXplanLayer("FP_SpielSportanlage", "Punkt")
            addXplanLayer("FP_Strassenverkehr", "Punkt")
            addXplanLayer("FP_Ueberlagerungsobjekt", "Punkt")
            addXplanLayer("FP_UnverbindlicheVormerkung", "Punkt")
            addXplanLayer("FP_VerEntsorgung", "Punkt")
            addXplanLayer("FP_Wasserwirtschaft", "Punkt")
            addXplanLayer("LP_Abgrenzung", "Punkt")
            addXplanLayer("LP_AnpflanzungBindungErhaltung", "Punkt")
            addXplanLayer("LP_Ausgleich", "Punkt")
            addXplanLayer("LP_Bodenschutzrecht", "Punkt")
            addXplanLayer("LP_ErholungFreizeit", "Punkt")
            addXplanLayer("LP_Flaechenobjekt", "Punkt")
            addXplanLayer("LP_Forstrecht", "Punkt")
            addXplanLayer("LP_GenerischesObjekt", "Punkt")
            addXplanLayer("LP_Geometrieobjekt", "Punkt")
            addXplanLayer("LP_Landschaftsbild", "Punkt")
            addXplanLayer("LP_Linienobjekt", "Punkt")
            addXplanLayer("LP_NutzungsAusschluss", "Punkt")
            addXplanLayer("LP_NutzungserfordernisRegelung", "Punkt")
            addXplanLayer("LP_Objekt", "Punkt")
            addXplanLayer("LP_Plan", "Punkt")
            addXplanLayer("LP_PlanerischeVertiefung", "Punkt")
            addXplanLayer("LP_Punktobjekt", "Punkt")
            addXplanLayer("LP_SchutzobjektInternatRecht", "Punkt")
            addXplanLayer("LP_SchutzobjektLandesrecht", "Punkt")
            addXplanLayer("LP_SchutzPflegeEntwicklung", "Punkt")
            addXplanLayer("LP_SonstigesRecht", "Punkt")
            addXplanLayer("LP_WasserrechtGemeingebrEinschraenkungNaturschutz", "Punkt")
            addXplanLayer("LP_WasserrechtSchutzgebiet", "Punkt")
            addXplanLayer("LP_WasserrechtSonstige", "Punkt")
            addXplanLayer("LP_WasserrechtWirtschaftAbflussHochwSchutz", "Punkt")
            addXplanLayer("LP_Zwischennutzung", "Punkt")
            addXplanLayer("RP_ErneuerbareEnergie", "Punkt")
            addXplanLayer("SO_Bauverbotszone", "Punkt")
            addXplanLayer("SO_Bodenschutzrecht", "Punkt")
            addXplanLayer("SO_Denkmalschutzrecht", "Punkt")
            addXplanLayer("SO_Flaechenobjekt", "Punkt")
            addXplanLayer("SO_Forstrecht", "Punkt")
            addXplanLayer("SO_Gebiet", "Punkt")
            addXplanLayer("SO_Gelaendemorphologie", "Punkt")
            addXplanLayer("SO_Geometrieobjekt", "Punkt")
            addXplanLayer("SO_Gewaesser", "Punkt")
            addXplanLayer("SO_Baubeschraenkung", "Punkt")
            addXplanLayer("SO_Wasserwirtschaft", "Linie")
            addXplanLayer("SO_Gelaendemorphologie", "Punkt")
            addXplanLayer("SO_Linienobjekt", "Punkt")
            addXplanLayer("SO_Luftverkehrsrecht", "Punkt")
            addXplanLayer("SO_Objekt", "Punkt")
            addXplanLayer("SO_Plan", "Punkt")
            addXplanLayer("SO_Punktobjekt", "Punkt")
            addXplanLayer("SO_Schienenverkehrsrecht", "Punkt")
            addXplanLayer("SO_SchutzgebietNaturschutzrecht", "Punkt")
            addXplanLayer("SO_SchutzgebietSonstigesRecht", "Punkt")
            addXplanLayer("SO_SchutzgebietWasserrecht", "Punkt")
            addXplanLayer("SO_SonstigesRecht", "Punkt")
            addXplanLayer("SO_Strassenverkehrsrecht", "Punkt")
            addXplanLayer("SO_Wasserrecht", "Punkt")
            addXplanLayer("XP_AbstraktesPraesentationsobjekt", "Punkt")
            # addXplanLayer("XP_BegruendungAbschnitt", "Punkt") -> existiert nur als Text
            addXplanLayer("XP_DatumAttribut", "Punkt")
            addXplanLayer("XP_DoubleAttribut", "Punkt")
            addXplanLayer("XP_ExterneReferenz", "Punkt")
            addXplanLayer("XP_FPO", "Punkt")
            addXplanLayer("XP_Gemeinde", "Punkt")
            addXplanLayer("XP_GenerAttribut", "Punkt")
            addXplanLayer("XP_Hoehenangabe", "Punkt")
            addXplanLayer("XP_IntegerAttribut", "Punkt")
            addXplanLayer("XP_LPO", "Punkt")
            addXplanLayer("XP_LTO", "Punkt")
            addXplanLayer("XP_Punktgeometrie", "Punkt")
            addXplanLayer("XP_Nutzungsschablone", "Punkt")
            addXplanLayer("XP_Objekt", "Punkt")
            addXplanLayer("XP_Plan", "Punkt")
            addXplanLayer("XP_Plangeber", "Punkt")
            addXplanLayer("XP_PPO", "Punkt")
            addXplanLayer("XP_Praesentationsobjekt", "Punkt")
            addXplanLayer("XP_PTO", "Punkt")
            addXplanLayer("XP_SPEMassnahmenDaten", "Punkt")
            addXplanLayer("XP_SpezExterneReferenz", "Punkt")
            addXplanLayer("XP_StringAttribut", "Punkt")
            addXplanLayer("XP_TPO", "Punkt")
            addXplanLayer("XP_URLAttribut", "Punkt")
            addXplanLayer("XP_VerbundenerPlan", "Punkt")
            addXplanLayer("XP_VerfahrensMerkmal", "Punkt")
            addXplanLayer("XP_WirksamkeitBedingung", "Punkt")

            addXplanLayer("XP_BegruendungAbschnitt", "Text")
            addXplanLayer("XP_RasterplanBasis", "Text")  # nur XPlanung v3/v4
            addXplanLayer("XP_Rasterdarstellung", "Text")  # nur XPlanung v5
            addXplanLayer("XP_TextAbschnitt", "Text")
            addXplanLayer("SO_TextAbschnitt", "Text")
            addXplanLayer("RP_TextAbschnitt", "Text")
            addXplanLayer("LP_TextAbschnitt", "Text")
            addXplanLayer("FP_TextAbschnitt", "Text")
            addXplanLayer("BP_TextAbschnitt", "Text")

            # project variable "plan_in_deutschland"
            bbox_germany = QgsRectangle(280353, 5235877, 921261, 6106245)
            bbox_germany_crs = QgsCoordinateReferenceSystem("EPSG:25832")

            if bbox_germany_crs != self.dest_crs:
                try:
                    tr = QgsCoordinateTransform(
                        bbox_germany_crs, self.dest_crs, QgsProject().instance()
                    )
                    bbox_germany = tr.transform(bbox_germany)
                except:
                    pass

            var_name_bbox = "plan_in_deutschland_" + self.plan_id

            QgsExpressionContextUtils.setProjectVariable(
                QgsProject.instance(),
                var_name_bbox,
                bbox_germany.intersects(self.group_extent),
            )
            self.logMessage("Ausdrucksvariable erstellt: " + var_name_bbox)

            if (
                self.baugrenze_baulinie is True
                and self.ueberbaubare_grundstuecksflaeche is False
            ):
                self.linie_ohne_flaeche = True

            var_name_linie_ohne_flaeche = "linie_ohne_flaeche_" + self.plan_id

            QgsExpressionContextUtils.setProjectVariable(
                QgsProject.instance(),
                var_name_linie_ohne_flaeche,
                self.linie_ohne_flaeche,
            )
            self.logMessage(
                "Ausdrucksvariable erstellt: " + var_name_linie_ohne_flaeche
            )

            # collapse layers / klappe Layer zusammen
            for group in [child for child in root.children() if child.nodeType() == 0]:
                if new_group.name() == group.name():
                    for layer in group.findLayers():
                        # for some layers setExpanded(False) isn't working for some reason
                        # so we need to expand first
                        layer.setExpanded(True)
                        layer.setExpanded(False)

            canvas = self.iface.mapCanvas()

            def onCanvasRefreshed():
                canvas.mapCanvasRefreshed.disconnect(onCanvasRefreshed)
                scale = canvas.scale()
                # maximum scale 1:1000
                if scale < 1000:
                    canvas.zoomScale(1000)
                elif 1000 < scale < 2000:
                    canvas.zoomScale(2000)
                elif 2000 < scale < 4000:
                    canvas.zoomScale(4000)
                elif 4000 < scale < 8000:
                    canvas.zoomScale(8000)
                elif 8000 < scale < 16000:
                    canvas.zoomScale(16000)
                elif 16000 < scale < 32000:
                    canvas.zoomScale(32000)
                elif 32000 < scale < 64000:
                    canvas.zoomScale(64000)
                elif 64000 < scale < 128000:
                    canvas.zoomScale(128000)
                elif 128000 < scale < 256000:
                    canvas.zoomScale(256000)
                elif 256000 < scale < 512000:
                    canvas.zoomScale(512000)
                elif 512000 < scale < 1024000:
                    canvas.zoomScale(1024000)

                    canvas.refresh()

            canvas.mapCanvasRefreshed.connect(onCanvasRefreshed)

            # zoom to group / Zoom auf die Gruppe
            canvas.setExtent(self.group_extent)
            canvas.zoomByFactor(1.4)
            canvas.refresh()

            # activate tool "Show Map Tips"
            self.iface.actionMapTips().setChecked(True)

            # Add basemap for LP and RP
            if plan_category in ["LP_Plan", "RP_Plan"]:
                basemap_crs = "EPSG:25832"
                if self.project_crs in [
                    "CRS:84",
                    "EPSG:3857",
                    "EPSG:25833",
                    "EPSG:4326",
                    "EPSG:4258",
                    "EPSG:3035",
                    "EPGS:3034",
                    "EPGS:3044",
                    "EPSG:3045",
                    "EPSG:4647",
                ]:
                    basemap_crs = self.project_crs

                url_with_params = f"url=https://sgx.geodatenzentrum.de/wms_basemapde&crs={basemap_crs}&format=image/png&layers=de_basemapde_web_raster_grau&styles"
                rlayer = QgsRasterLayer(
                    url_with_params, "basemap.de Web Raster Grau", "wms"
                )
                if rlayer.isValid():
                    QgsProject.instance().addMapLayer(rlayer, False)
                    root.insertChildNode(-1, QgsLayerTreeLayer(rlayer))
                    rlayerNode = root.findLayer(rlayer.id())
                    rlayerNode.setExpanded(False)
