#131 EGON exporter

* enhances EGON exporter code structure
pull/135/head
mpeltriaux 3 years ago
parent 18c2513863
commit 0269dfb392

@ -5,13 +5,13 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 07.03.22 Created on: 07.03.22
""" """
import base64
import xmltodict import xmltodict
from django.contrib.gis.gdal import OGRGeometry
from django.db.models import Sum from django.db.models import Sum
from django.utils import formats from django.utils import formats
from intervention.models import Intervention from intervention.models import Intervention
from xml.etree import ElementTree as etree
from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP
@ -45,49 +45,83 @@ class EgonGmlBuilder:
self.intervention = intervention self.intervention = intervention
self.gml = self.build_gml() self.gml = self.build_gml()
def build_gml(self): def _gen_flurstuecksKennzeichen(self, parcel):
""" Generates oneo:flurstuecksKennzeichen to provide backwards compatibility
Args:
parcel (Parcel): The requested parcel
Returns:
str
"""
gmrkng_code = "000000"
flr_code = "{0:03d}".format(int(parcel.flr or 0))
flrstckzhlr_code = "{0:05d}".format(int(parcel.flrstck_zhlr or 0))
flrstcknnr_code = "{0:06d}".format(int(parcel.flrstck_nnr or 0))
return gmrkng_code + flr_code + flrstckzhlr_code + flrstcknnr_code
def _sum_all_payments(self):
all_payments = self.intervention.payments.aggregate( all_payments = self.intervention.payments.aggregate(
summed=Sum("amount") summed=Sum("amount")
)["summed"] )["summed"]
return all_payments
def _gen_kompensationsArt(self):
comp_type = "Ersatzzahlung" comp_type = "Ersatzzahlung"
if self.intervention.compensations.exists(): if self.intervention.compensations.exists():
comp_type += " und Kompensation" comp_type += " und Kompensation"
return comp_type
def _gen_geometry_list(self):
geom = self.intervention.geometry.geom geom = self.intervention.geometry.geom
geom.transform(DEFAULT_SRID_RLP) geom.transform(DEFAULT_SRID_RLP)
geoms_list = [ geoms_list = [
{ {
"gml:polygonMember": { "gml:Polygon": {
"gml:Polygon": { "gml:exterior": {
"gml:exterior": { "gml:LinearRing": {
"gml:LinearRing": { "gml:posList": " ".join([f"{str(coord[0])},{str(coord[1])}" for coord in coords[0]])
"gml:posList": " ".join([f"{str(coord[0])},{str(coord[1])}" for coord in coords[0]])
}
} }
} }
} }
} for coords in geom.coords } for coords in geom.coords
] ]
return geoms_list
def _gen_raumreferenz(self):
parcels = self.intervention.get_underlying_parcels() parcels = self.intervention.get_underlying_parcels()
spatial_reference_list = [ spatial_reference_list = [
{ {
"oneo:Raumreferenz": { "oneo:datumAbgleich": None,
"oneo:datumAbgleich": None, "oneo:ortsangabe": {
"oneo:ortsangabe": { "oneo:Ortsangaben": {
"oneo:Ortsangaben": { "oneo:kreisSchluessel": parcel.district.krs,
"oneo:kreisSchluessel": parcel.district.krs, "oneo:gemeindeSchluessel": parcel.district.gmnd,
"oneo:gemeindeSchluessel": parcel.district.gmnd, "oneo:verbandsgemeindeSchluessel": parcel.gmrkng,
"oneo:verbandsgemeindeSchluessel": parcel.gmrkng, "oneo:flurstuecksKennzeichen": self._gen_flurstuecksKennzeichen(parcel),
"oneo:flurstuecksKennzeichen": None, }
} },
},
}
} for parcel in parcels } for parcel in parcels
] ]
return spatial_reference_list
def _gen_foto(self):
revoc_docs, regular_docs = self.intervention.get_documents()
docs_list = [
{
"oneo:Foto": {
"oneo:aufnahmezeitpunkt": formats.localize(doc.date_of_creation),
"oneo:bemerkung": doc.comment,
"oneo:fotoverweis": base64.b64encode(doc.file.read()).decode("utf-8"),
"oneo:dateiname": doc.title,
"oneo:hauptfoto": False,
}
} for doc in regular_docs
]
return docs_list
t = { def build_gml(self):
xml_dict = {
"wfs:FeatureCollection": { "wfs:FeatureCollection": {
"oneo:Eingriffsverfahren": { "oneo:Eingriffsverfahren": {
"@gml:id": self.intervention.identifier, "@gml:id": self.intervention.identifier,
@ -96,8 +130,8 @@ class EgonGmlBuilder:
"oneo:bemerkungZulassungsstelle": None, "oneo:bemerkungZulassungsstelle": None,
"oneo:eintragungsstelle": self.intervention.responsible.conservation_office.long_name, "oneo:eintragungsstelle": self.intervention.responsible.conservation_office.long_name,
"oneo:zulassungsstelle": self.intervention.responsible.registration_office.long_name, "oneo:zulassungsstelle": self.intervention.responsible.registration_office.long_name,
"oneo:ersatzzahlung": all_payments, "oneo:ersatzzahlung": self._sum_all_payments(),
"oneo:kompensationsart": comp_type, "oneo:kompensationsart": self._gen_kompensationsArt(),
"oneo:verfahrensrecht": self.intervention.legal.laws.first().short_name, "oneo:verfahrensrecht": self.intervention.legal.laws.first().short_name,
"oneo:verfahrenstyp": self.intervention.legal.process_type.long_name, "oneo:verfahrenstyp": self.intervention.legal.process_type.long_name,
"oneo:eingreifer": { "oneo:eingreifer": {
@ -123,7 +157,7 @@ class EgonGmlBuilder:
"gml:multiSurfaceProperty": { "gml:multiSurfaceProperty": {
"gml:MultiPolygon": { "gml:MultiPolygon": {
"@srsName": f"http://www.opengis.net/gml/srs/epsg.xml#{DEFAULT_SRID_RLP}", "@srsName": f"http://www.opengis.net/gml/srs/epsg.xml#{DEFAULT_SRID_RLP}",
"#text": geoms_list, "gml:polygonMember": self._gen_geometry_list(),
} }
}, },
}, },
@ -132,19 +166,12 @@ class EgonGmlBuilder:
"oneo:bemerkung": self.intervention.comment, "oneo:bemerkung": self.intervention.comment,
"oneo:verantwortlicheStelle": None, "oneo:verantwortlicheStelle": None,
"oneo:veroffentlichtAm": None, "oneo:veroffentlichtAm": None,
"oneo:raumreferenz": spatial_reference_list, "oneo:raumreferenz": {
"oneo:foto": { "oneo:Raumreferenz": self._gen_raumreferenz(),
"oneo:Foto": {
"oneo:aufnahmezeitpunkt": None,
"oneo:bemerkung": None,
"oneo:fotoverweis": None,
"oneo:dateiname": None,
"oneo:hauptfoto": False,
}
}, },
"oneo:foto": self._gen_foto(),
} }
}, },
} }
gml = xmltodict.unparse(t, pretty=True) gml = xmltodict.unparse(xml_dict)
print(gml) return gml
return gml

Loading…
Cancel
Save