Commit 8b6cdd3b authored by Luna Riegel's avatar Luna Riegel
Browse files

Merge branch 'dev_embedded_geodb' into 'dev'

!Geodatabase implementation

See merge request !36
parents 2fe401b3 e2cce980
Pipeline #12243 passed with stage
in 2 minutes and 14 seconds
package de.hft.stuttgart.citydoctor2.zip;
import java.util.zip.ZipException;
/**
* Signals that a ZIP-file is corrupted and couldn't be parsed.
*/
public class MalformedZipFileException extends ZipException {
public MalformedZipFileException() {
super();
}
public MalformedZipFileException(String message) {
super(message);
}
}
package de.hft.stuttgart.citydoctor2.zip;
/**
* Error types for {@link CityGmlZipEntry} objects.
*/
public enum ZipEntryErrorType {
INVALID_CITY_GML_FILE, EXCESSIVE_FILESIZE, IO_ERROR
}
package de.hft.stuttgart.citydoctor2.zip;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ZipParser {
private static final Logger logger = LogManager.getLogger(ZipParser.class);
}
CityDoctorValidation.Version=${versionString}
DistanceError.distanceFromPlane=distance from plane
AboutDialog.developedBy=Developed by
AboutDialog.closeBtn=Close
AboutDialog.contact=Contact
AboutDialog.developedBy=Developed by
AboutDialog.title=CityDoctor 3 - About
AboutDialog.closeBtn=Close
CheckDialog.title=Check Configuration
CheckDialog.schematronFiles=Schematron Files
CheckDialog.schematronChooserTitle=Choose schematron file..
CheckDialog.validationConfiguration=Validation Configuration
CheckDialog.startingChecks=Starting checks
CheckDialog.checksDone=Checks done
CheckDialog.failedChecks=Failed to execute checks
CheckDialog.schematronFileNotExisting=Schematron file does not exist, ignoring
CheckContainer.error=Unexpected exception while executing check: {}
CheckDialog.availableChecksLabel=Available Checks
CheckDialog.cancelBtn=Cancel
CheckDialog.checkBtn=Check
CheckDialog.checkEnabled=Enabled
CheckDialog.checkName=Name
CheckDialog.parameterValue=Value
CheckDialog.checksDone=Checks done
CheckDialog.checksReenabledAlert=Some checks have been reenabled so that other wanted checks can be executed\nSee the log for more information.
CheckDialog.checksTab=Checks
CheckDialog.failedChecks=Failed to execute checks
CheckDialog.filterTab=Filter
CheckDialog.geometricChecksLabel=Geometric Checks
CheckDialog.globalParametersLabel=Global Parameters
CheckDialog.noPathError=Output path is missing!
CheckDialog.outputPathBtn=Select
CheckDialog.outputPathLabel=Output directory (Required):
CheckDialog.parameterUnit=Unit
CheckDialog.parameterValue=Value
CheckDialog.pdfReportsOption=Create PDF reports
CheckDialog.schematronChooserTitle=Choose schematron file ...
CheckDialog.schematronFileLabel=Schematron File:
CheckDialog.schematronFileNotExisting=Schematron file does not exist, Schematron will be skipped
CheckDialog.schematronFiles=Schematron Files
CheckDialog.selectBtn=Select
CheckDialog.semanticChecksLabel=Semantic Checks
CheckDialog.startingChecks=Starting checks
CheckDialog.streamCheckLabel=Citymodels are not loaded and kept in memory. Check results are saved to the QualityADE in copies of the input files.
CheckDialog.streamCheckOption=Use low memory mode
CheckDialog.title=Check Configuration
CheckDialog.validationConfiguration=Validation Configuration
CheckDialog.xmlReportsOption=Create XML reports
Checker.checkFeature=Checking feature: {}
Checker.checksFinished=Finished executing checks. Total time: {0}
Checker.dbStillUnresponsive=Checker still unable to load some CityObjects from database!
Checker.dbUnresponsive=Checker could not load some CityObjects from database!
Checker.executeCheck=Executing check: {}
Checker.failPdf=Failed to write PDF Report.
Checker.failReports=Failed to write reports.
Checker.failXml=Failed to write XML Error Report.
Checker.finishedSchematron=Finished Schematron validation
Checker.futuresCheckFailures=Encountered check failures due to the following errors:
Checker.noCheckSatisfiesRequirement=Could not find any check that satisfies requirement {}, it will not be checked
Checker.schematronCompleted=Schematron completed
Checker.schematronFileNotFound=Schematron file {} could not be found
Checker.schematronInterrupted=Main Thread was interrupted while waiting for Schematron
Checker.schematronStillRunning=Schematron is still running. Waiting for completion, this may take some time
Checker.schematronValidation=Schematron-validation thread started
Checker.shutdownInterrupted=Main Thread got interrupted during ThreadPool shutdown
Checker.validationInterrupted=Validation aborted: Checker got interrupted
Checker.waitAndRetry=Waiting a second before retrying...
Checks.missingCheck=Could not find check for id: {}
CityDoctorController.exportSuccess=Successfully exported feature
CityDoctorController.noDatamodel=Datamodel is null, no checks could be done
CityDoctorController.noSourceFile=Source file is null, no checks could be done
CityDoctorController.noZipFile=ZIP archive is null, no checks could be done
CityDoctorController.exportSuccess=Successfully exported feature
CityDoctorController.saveZipArchiveReports=Successfully exported validation reports!
CityDoctorValidation.Version=${versionString}
CityDoctorValidation.inputFileNotExisting= Input file '{}' does not exist.
CityDoctorValidation.loadingDefaultConfig=No configuration file given, loading default configuration
CityDoctorValidation.noConfig=No configuration file specified with -config [FILE]
CityDoctorValidation.noInputFile=No input file specified. (-in [FILE])
CityDoctorValidation.noOutputFile=No output file specified. (-out [FILE])
CityDoctorValidation.notExactlyOneConfigFile=Specify exactly one file as configuration
CityDoctorValidation.notExactlyOneInputFile=Specify exactly one file as input.
CityDoctorValidation.notExactlyOneOutputFile=Specify exactly one file as output.
CityDoctorValidation.notExactlyOnePDFOutput=Specify exactly one file as pdfReport
CityDoctorValidation.notExactlyOneXMLOutput=Specify exactly one file as xmlReport
CityDoctorValidation.wrongInputFileFormat=Input file '{}' does not end with .gml or .xml
CityGmlParser.chunkReadFailed=Failed to read GML file in chunks, falling back to reading the complete file
CityGmlParser.convertCrsToUtmZoneN=Converting coordinate system to UTM zone {}N
CityGmlParser.convertCrsToUtmZoneS=Converting coordinate system to UTM zone {}S
CityGmlParser.creating4jContextFailed=Unable to create citygml4j context
CityGmlParser.creatingAdePluginsFailed=Unable to add ADE plugins to citygml4j
CityGmlParser.errorReadingGmlFile=Error while reading city gml file\n{}
CityGmlParser.errorWritingGmlFile=Error while writing city gml file\n{}
CityGmlParser.failedEPSGParse=Could not read EPSG code, fallback to metric system
CityGmlParser.missingCityModel=File does not contain a CityModel definition! Temporary CityModel will be created.
CityGmlParser.missingEPSGCode=No EPSG code found, assuming metric system
CityGmlParser.noConversionNeeded=Coordinate system is in meters, no conversion done
CityGmlParser.notValidGmlFile=This is not a valid GML-File\n
CityGmlParser.parsedObjects=Parsed model with {} objects
CityGmlWriterUtils.unknownADEError= Found error {} that cannot be converted to ADE error. It will not be written
CityGmlZipArchive.generalException=Encountered an unexpected error while reading the ZIP archive
CityGmlZipArchive.ioError=Accessing the ZIP archive failed
CityGmlZipArchive.malformedZipFile=Parsing of ZIP archive aborted, ZIP file is malformed!
DatabaseHandler.batchCommitFailure=Batch-commit aborted: Critical failure while trying to write CityObject {} to database!
DatabaseHandler.connectionFailure=Connection to embedded database could not be opened!
DatabaseHandler.fetchErrorIdsFailure=Fetching list of GmlIDs of CityObjects with errors failed!
DatabaseHandler.getAllCityObjectsFailure=Fetching of all CityObjects failed!
DatabaseHandler.getBBoxIntersectFailure= Connection to database failed while trying to fetch bbox intersecting objects of CityObject {}
DatabaseHandler.getBufferIntersectFailure=Connection to database failed while trying to fetch buffer intersecting objects of CityObject {}
DatabaseHandler.getFeatureCountFailure=Connection to database failed while trying to get count of CityObjects!
DatabaseHandler.marshallingFailure=Writing CityObject {} to database failed!
DatabaseHandler.serializationFailure=Serialization of CityObject {} failed!
DatabaseHandler.setupFailure=FATAL ERROR: Creation of embedded database failed!
DatabaseHandler.tableFailure=FATAL ERROR: Creation of features table failed!
DatabaseHandler.unmarshallingFailure=Loading of CityObject {} from embedded database failed!
DistanceError.distanceFromPlane=distance from plane
ErrorItemVisitor.childId=Child id
ErrorItemVisitor.component=Component
ErrorItemVisitor.degeneratedRing=Degenerated ring
ErrorItemVisitor.deviation=Deviation
ErrorItemVisitor.distance=Distance
ErrorItemVisitor.intersection=Intersection
ErrorItemVisitor.nameOfAttribute=Name of attribute
ErrorItemVisitor.pointTouchesEdge=Point touches edge
ErrorItemVisitor.triangles=Triangles
ExceptionDialog.stacktrace=The exception stacktrace was:
FilterPane.buildings=Buildings
FeatureMapper.polygonUnreferenced=Polygon {} is referenced but not found in feature polygons
FilterPane.bridges=Bridges
FilterPane.buildings=Buildings
FilterPane.landUse=Land Use
FilterPane.transportation=Transportation
FilterPane.vegetation=Vegetation
FilterPane.water=Water
MainToolBar.wireframe=Show/Hide Wireframe
GeometryMapper.emptyPolygon=Found polygon without exterior ring, ignoring
LibraryObject.fileMissing=Implicit geometry references non-existing library object file {}
LibraryObject.parsingError=Encountered an error while parsing library object {}
MainToolBar.culling=Enable/Disable Culling
MainToolBar.writeReports=Write Reports
MainToolBar.executeChecks=Execute Checks
MainToolBar.showWorld=Show entire city model
MainToolBar.resetCamera=Reset view
MainToolBar.hideRoof=Show/Hide roof BoundarySurfaces
MainToolBar.resetCamera=Reset view
MainToolBar.showWorld=Show entire city model
MainToolBar.wireframe=Show/Hide Wireframe
MainToolBar.writeReports=Write Reports
MainToolBar.zip=Open zip-entry selection window
MainWindow.missingConfig=Could not find configuration file.
MainWindow.loadGivenFile=Loading given file, please wait
MainWindow.finishedLoading=Finished loading
MainWindow.checking=Checking, please wait
MainWindow.writeXml=Writing xml report
MainWindow.finishedXml=Finished xml report
MainWindow.writePdf=Writing pdf report
MainWindow.finishedPdf=Finished pdf report
MainWindow.loadFailed=Failed to load given gml file: {}
MainWindow.all=All
MainWindow.withErrors=With errors
MainWindow.export=Export feature
MainWindow.attributeTab=Attributes
MainWindow.availableLabel=Available:
MainWindow.bridgeTab=Bridges
MainWindow.buildingsTab=Buildings
MainWindow.checking=Checking, please wait
MainWindow.cityfurnitureTab=CityFurniture
MainWindow.clearBtn=Clear
MainWindow.copyId=Copy GML-ID
MainWindow.delete=Delete feature
MainWindow.infoTopLevelExport=Only top-level object can be exported!
MainWindow.edgesTab=Edges
MainWindow.errorsTab=Errors
MainWindow.export=Export feature
MainWindow.finishedLoading=Finished loading
MainWindow.finishedPdf=Finished pdf report
MainWindow.finishedXml=Finished xml report
MainWindow.focusCityObject=Focus object
MainWindow.globalErrorsTab=Global Errors
MainWindow.infoTopLevelCopyID=GML-ID can only be copied from top-level object!
mainWindow.warnCopyIdFailed=Could not copy GML-ID!
OpenFileDialog.select=Select CityGML file
MainWindow.infoTopLevelExport=Only top-level object can be exported!
MainWindow.languageChange=For the change in language to apply, restart CityDoctor2.
MainWindow.buildingsTab=Buildings
MainWindow.vegetationTab=Vegetation
MainWindow.transportationTab=Transportation
MainWindow.tunnelTab=Tunnels
MainWindow.bridgeTab=Bridges
MainWindow.waterTab=Water
MainWindow.terrainTab=Terrain
MainWindow.cityfurnitureTab=CityFurniture
MainWindow.loadFailed=Failed to load given gml file: {}
MainWindow.loadGivenFile=Loading given file, please wait
MainWindow.logTab=Log
MainWindow.memoryLabel=Memory:
MainWindow.missingConfig=Could not find configuration file.
MainWindow.otherObjectsTab=Other
MainWindow.viewLabel=View
MainWindow.showLabel=Show:
MainWindow.searchLabel=Search:
MainWindow.searchBtn=Search
MainWindow.clearBtn=Clear
MainWindow.errorsTab=Errors
MainWindow.polygonsTab=Polygons
MainWindow.edgesTab=Edges
MainWindow.searchBtn=Search
MainWindow.searchLabel=Search:
MainWindow.showLabel=Show:
MainWindow.terrainTab=Terrain
MainWindow.transportationTab=Transportation
MainWindow.tunnelTab=Tunnels
MainWindow.vegetationTab=Vegetation
MainWindow.verticesTab=Vertices
MainWindow.attributeTab=Attributes
MainWindow.logTab=Log
MainWindow.globalErrorsTab=Global Errors
MainWindow.focusCityObject=Focus object
MainWindow.viewLabel=View
MainWindow.warnCopyIdFailed=Could not copy GML-ID!
MainWindow.waterTab=Water
MainWindow.withErrors=With errors
MainWindow.writePdf=Writing pdf report
MainWindow.writeXml=Writing xml report
OpenFileDialog.cancelBtn=Cancel
OpenFileDialog.fileLabel=File:
OpenFileDialog.selectBtn=Select
OpenFileDialog.loadBtn=Load
OpenFileDialog.settingsPane=Parser Preferences
OpenFileDialog.loadFailed=Failed to load CityGML File
OpenFileDialog.lowMemoryLabel=Low Memory Consumption Mode
OpenFileDialog.roundingPlacesLabel=NumberOfRoundingPlaces
OpenFileDialog.select=Select CityGML file
OpenFileDialog.selectBtn=Select
OpenFileDialog.settingsPane=Parser Preferences
OpenFileDialog.xmlValidationLabel=Use XML Validation
Checker.failXml=Failed to write XML Error Report.
Checker.failPdf=Failed to write PDF Report.
Checker.checksFinished=Finished executing checks
Checker.schematronValidation=Starting Schematron validation
Checker.finishedSchematron=Finished Schematron validation
Checker.failReports=Failed to write reports.
Checker.checkFeature=Checking feature: {}
Checker.executeCheck=Executing check: {}
ValidationConfiguration.reenable={} has been disabled but {} depends on it, reenabling
TimeFormatter.hours={0} hours
TimeFormatter.lessThanASecond=< 1 second
TimeFormatter.minutes={0} minutes
TimeFormatter.oneHour=1 hour
TimeFormatter.oneMinute=1 minute
TimeFormatter.oneSecond=1 second
TimeFormatter.seconds={0} seconds
Unit.Degree=Degree
Unit.Radian=Radian
ValidationConfiguration.missingSchematron={} is not an existing file, disabling schematron check
CheckContainer.error=Unexpected exception while executing check: {}
Checks.missingCheck=Could not find check for id: {}
OpenFileDialog.cancelBtn=Cancel
CheckDialog.checksTab=Checks
CheckDialog.filterTab=Filter
CheckDialog.globalParametersLabel=Global Parameters
CheckDialog.availableChecksLabel=Available Checks
CheckDialog.geometricChecksLabel=Geometric Checks
CheckDialog.semanticChecksLabel=Semantic Checks
CheckDialog.schematronFileLabel=Schematron File:
CheckDialog.selectBtn=Select
CheckDialog.checkBtn=Check
CheckDialog.cancelBtn=Cancel
CheckDialog.streamCheckOption=Use low memory mode
CheckDialog.streamCheckLabel=Citymodels are not loaded and kept in memory. Check results are saved to the QualityADE in copies of the input files.
CheckDialog.outputPathLabel=Output directory (Required):
CheckDialog.outputPathBtn=Select
CheckDialog.pdfReportsOption=Create PDF reports
CheckDialog.xmlReportsOption=Create XML reports
CheckDialog.noPathError=Output path is missing!
ZipEntryManager.title=Zip-entry manager
ZipEntryManager.entryListTitle=Zip-entries
ZipEntryManager.metadata=Metadata
ZipEntryManager.subpathLbl=Subpath:
ZipEntryManager.erroneousLbl=Erroneous:
ZipEntryManager.excessiveFileSize=Filesize exceeds memory
ZipEntryManager.invalidCityGml=Invalid CityGML file
ZipEntryManager.ioError=Unable to access file
ZipEntryManager.filesizeLbl=Filesize:
ZipEntryManager.validatedLbl=Validated:
ZipEntryManager.objectCountLbl=Object count:
ZipEntryManager.loadBtn=Load CityGML model
ZipEntryManager.decompressBtn=Unpack file
ZipEntryManager.decompressAllBtn=Unpack all files
ZipEntryManager.checkAllBtn=Check all files
ZipEntryManager.showReportBtn=Show error statistic
ZipEntryManager.saveBtn=Export validation results
ZipEntryManager.cancelBtn=Cancel
ZipEntryManager.unknownValue=N/A
ZipEntryManager.yes=Yes
ZipEntryManager.no=No
CityGmlZipArchive.ioError=Accessing the ZIP archive failed
CityGmlZipArchive.malformedZipFile=Parsing of ZIP archive aborted, ZIP file is malformed!
CityGmlZipArchive.generalException=Encountered an unexpected error while reading the ZIP archive
WriteReportDialog.writeBtn=Save
ValidationConfiguration.reenable={} has been disabled but {} depends on it, reenabling
WriteReportDialog.cancelBtn=Cancel
WriteReportDialog.errorStatisticsLabel=Error Statistics
WriteReportDialog.saveImageBtn=Save Image...
WriteReportDialog.selectPdfBtn=Select
WriteReportDialog.selectXmlFile=Select
WriteReportDialog.writeBtn=Save
WriteReportDialog.xAxisLabel=Error
WriteReportDialog.yAxisLabel=Count
Unit.Radian=Radian
Unit.Degree=Degree
FeatureMapper.polygonUnreferenced=Polygon {} is referenced but not found in feature polygons
GeometryMapper.emptyPolygon=Found polygon without exterior ring, ignoring
CityGmlParser.parsedObjects=Parsed model with {} objects
CityGmlParser.chunkReadFailed=Failed to read GML file in chunks, falling back to reading the complete file
CityGmlParser.notValidGmlFile=This is not a valid GML-File\n
CityGmlParser.errorReadingGmlFile=Error while reading city gml file\n{}
CityGmlParser.errorWritingGmlFile=Error while writing city gml file\n{}
CityGmlParser.noConversionNeeded=Coordinate system is in meters, no conversion done
CityGmlParser.failedEPSGParse=Could not read EPSG code, fallback to metric system
CityGmlParser.missingEPSGCode=No EPSG code found, assuming metric system
OpenFileDialog.loadFailed=Failed to load CityGML File
MainWindow.memoryLabel=Memory:
CheckDialog.checksReenabledAlert=Some checks have been reenabled so that other wanted checks can be executed\nSee the log for more information.
MainWindow.availableLabel=Available:
OpenFileDialog.lowMemoryLabel=Low Memory Consumption Mode
ErrorItemVisitor.intersection=Intersection
ErrorItemVisitor.component=Component
ErrorItemVisitor.nameOfAttribute=Name of attribute
ErrorItemVisitor.childId=Child id
ErrorItemVisitor.distance=Distance
ErrorItemVisitor.pointTouchesEdge=Point touches edge
ErrorItemVisitor.degeneratedRing=Degenerated ring
ErrorItemVisitor.deviation=Deviation
ErrorItemVisitor.triangles=Triangles
\ No newline at end of file
WriteReportDialog.yAxisLabel=Count
\ No newline at end of file
DistanceError.distanceFromPlane=Abstand von der Ebene
AboutDialog.developedBy=Entwickelt von
AboutDialog.closeBtn=Schlie\u00DFen
AboutDialog.contact=Kontakt
AboutDialog.developedBy=Entwickelt von
AboutDialog.title=CityDoctor 3 - \u00DCber
AboutDialog.closeBtn=Schlie\u00DFen
CheckDialog.title=Pr\u00fcfungskonfiguration
CheckDialog.schematronFiles=Schematron Dateien
CheckDialog.schematronChooserTitle=W\u00e4hle Schematron Datei..
CheckDialog.validationConfiguration=Validierungs Konfiguration
CheckDialog.startingChecks=Starte Pr\u00fcfung
CheckContainer.error=Unerwarteter Fehler bei der Ausf\u00fchrung von Pr\u00fcfung: {}
CheckDialog.availableChecksLabel=Verf\u00fcgbare Pr\u00fcfungen
CheckDialog.cancelBtn=Abbrechen
CheckDialog.checkBtn=Pr\u00fcfen
CheckDialog.checkEnabled=Aktiv
CheckDialog.checkName=Name
CheckDialog.checksDone=Pr\u00fcfung abgeschlossen
CheckDialog.checksReenabledAlert=Manche Pr\u00fcfungen wurden reaktiviert damit andere gewollte Pr\u00fcfungen durchgef\u00fchrt werden k\u00f6nnen\nMehr Details sind im Log geschrieben
CheckDialog.checksTab=Pr\u00fcfungen
CheckDialog.failedChecks=Konnte Pr\u00fcfungen nicht ausf\u00fchren
CheckDialog.schematronFileNotExisting=Schematron Datei existiert nicht, ignoriere
CheckDialog.checkEnabled=Aktiv
CheckDialog.parameterValue=Wert
CheckDialog.filterTab=Filter
CheckDialog.geometricChecksLabel=Geometrische Pr\u00fcfungen
CheckDialog.globalParametersLabel=Globale Parameter
CheckDialog.noPathError=Ausgabepfad wurde nicht gesetzt!
CheckDialog.outputPathBtn=Ausw\u00e4hlen
CheckDialog.outputPathLabel=Ausgabeordner (Pflichtfeld):
CheckDialog.parameterUnit=Einheit
CityDoctorController.noDatamodel=Datenmodell ist null, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.noSourceFile=Quelldatei ist null, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.noZipFile=ZIP-Archiv ist null, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.exportSuccess=Feature export erfolgreich abgeschlossen
CheckDialog.parameterValue=Wert
CheckDialog.pdfReportsOption=PDF-Berichte erstellen
CheckDialog.schematronChooserTitle=W\u00e4hle Schematron Datei ...
CheckDialog.schematronFileLabel=Schematron Datei:
CheckDialog.schematronFileNotExisting=Schematron Datei existiert nicht, Schematron-Pr\u00fcfung wird \u00fcbersprungen
CheckDialog.schematronFiles=Schematron Dateien
CheckDialog.selectBtn=Ausw\u00e4hlen
CheckDialog.semanticChecksLabel=Semantische Pr\u00fcfungen
CheckDialog.startingChecks=Starte Pr\u00fcfung
CheckDialog.streamCheckLabel=Stadtmodelle werden nicht in den Arbeitsspeicher geladen. Ergebnisse werden in der QualityADE in Kopien der Eingangsdateien gespeichert.
CheckDialog.streamCheckOption=Niedrigen Arbeitsspeicherverbrauchsmodus aktivieren
CheckDialog.title=Pr\u00fcfungskonfiguration
CheckDialog.validationConfiguration=Validierungskonfiguration
CheckDialog.xmlReportsOption=XML-Berichte erstellen
Checker.checkFeature=Pr\u00fcfe Feature: {}
Checker.checksFinished=Durchf\u00fchrung der Pr\u00fcfungen abgeschlossen. Gesamtzeit: {0}
Checker.dbStillUnresponsive=Pr\u00fcfung konnte weiterhin einige CityObjects nicht aus der Datenbank laden!
Checker.dbUnresponsive=Pr\u00fcfung konnte einige CityObjects nicht aus der Datenbank laden!
Checker.executeCheck=F\u00fchre Pr\u00fcfung aus: {}
Checker.failPdf=Konnte PDF-Fehlerbericht nicht schreiben.
Checker.failReports=Konnte Pr\u00fcfberichte nicht schreiben.
Checker.failXml=Konnte XML-Fehlerbericht nicht schreiben.
Checker.finishedSchematron=Schematron-Pr\u00fcfung abgeschlossen
Checker.futuresCheckFailures=Einige Pr\u00fcfungen sind aufgrund folgender Fehler fehlgeschlagen:
Checker.noCheckSatisfiesRequirement=Keine Pr\u00fcfung erf\u00fcllt die Anforderung {}, Anforderung wird nicht gepr\u00fcft
Checker.schematronCompleted=Schematron-Pr\u00fcfung abgeschlossen
Checker.schematronFileNotFound=Schematron Datei {} konnte nicht gefunden werden
Checker.schematronInterrupted=Main Thread hat Interrupt-Befehl w\u00e4hrend dem Warten auf Schematron Abschluss erhalten!
Checker.schematronStillRunning=Schematron-Pr\u00fcfung ist noch nicht abgeschlossen. Warten auf Abschluss der Pr\u00fcfung, dies kann einiges an Zeit beanspruchen
Checker.schematronValidation=Schematron-Pr\u00fcfung gestartet
Checker.shutdownInterrupted=Main-Thread hat einen Interrupt-Befehl w\u00e4hrend dem ThreadPool shutdown erhalten
Checker.validationInterrupted=Validierung abgebrochen: Pr\u00fcfung hat Interrupt-Befehl erhalten
Checker.waitAndRetry=Wiederhole Pr\u00fcfung nach kurzer Wartezeit ...
Checks.missingCheck=Konnte keine Pr\u00fcfung f\u00fcr id {} finden
CityDoctorController.exportSuccess=Exportieren des Features erfolgreich abgeschlossen
CityDoctorController.noDatamodel=Datenmodell ist NULL, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.noSourceFile=Quelldatei ist NULL, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.noZipFile=ZIP-Archiv ist NULL, keine Pr\u00fcfungen konnten ausgef\u00fchrt werden
CityDoctorController.saveZipArchiveReports=Validierungsberichte erfolgreich exportiert!
CityDoctorValidation.Version=${versionString}
CityDoctorValidation.inputFileNotExisting=Eingabedatei '{}' existiert nicht.
CityDoctorValidation.loadingDefaultConfig=Keine Konfigurationsdatei angegeben, Standardkonfiguration wird geladen.
CityDoctorValidation.noConfig=Keine Konfigurationsdatei angegeben. (-config [DATEIPFAD])
CityDoctorValidation.noInputFile=Keine Eingabedatei angegeben. (-in [DATEIPFAD])
CityDoctorValidation.noOutputFile=Keinen Ausgabedateipfad angegeben. (-out [DATEIPFAD])
CityDoctorValidation.notExactlyOneConfigFile=Es muss exakt eine Konfigurationsdatei angegeben werden.
CityDoctorValidation.notExactlyOneInputFile=Es muss exakt eine Eingabedatei angegeben werden.
CityDoctorValidation.notExactlyOneOutputFile=Es muss exakt ein Ausgabedateipfad angegeben werden.
CityDoctorValidation.notExactlyOnePDFOutput=Es muss exakt ein Ausgabedateipfad f\u00fcr den PDF-Bericht angegeben werden.
CityDoctorValidation.notExactlyOneXMLOutput=Es muss exakt ein Ausgabedateipfad f\u00fcr den XML-Bericht angegeben werden.
CityDoctorValidation.wrongInputFileFormat=Eingabedatei '{}' ist keine .gml oder .xml Datei.
CityGmlParser.chunkReadFailed=Konnte Datei nicht in St\u00fccken lesen, versuche komplett zu lesen
CityGmlParser.convertCrsToUtmZoneN=Konvertiere Koordinatensystem zu UTM Zone {}N
CityGmlParser.convertCrsToUtmZoneS=Konvertiere Koordinatensystem zu UTM Zone {}S
CityGmlParser.creating4jContextFailed=Erstellen des Citygml4j Kontext fehlgeschlagen
CityGmlParser.creatingAdePluginsFailed=Erstellen des ADE Plugins f\u00fcr citygml4j fehlgeschlagen
CityGmlParser.errorReadingGmlFile=Fehler beim lesen der CityGML Datei\n{}
CityGmlParser.errorWritingGmlFile=Fehler beim schreiben der CityGML Datei\n{}
CityGmlParser.failedEPSGParse=Lesen des EPSG-Codes fehlgeschlagen, greife auf metrisches System zur\u00fcck
CityGmlParser.missingCityModel=Datei enth\u00e4lt kein CityModel! Tempor\u00e4res CityModel wird erstellt.
CityGmlParser.missingEPSGCode=Kein EPSG-Code wurde gefunden! Gehe von metrischem System aus
CityGmlParser.noConversionNeeded=Koordinatensystem in Metern, keine Konvertierung notwendig
CityGmlParser.notValidGmlFile=Dies ist keine korrekte CityGML Datei
CityGmlParser.parsedObjects=Modell mit {} Objekten gelesen
CityGmlWriterUtils.unknownADEError= Fehler {} kann nicht zu einem ADE-Fehler konvertiert werden. Fehler wird nicht ausgegeben
CityGmlZipArchive.generalException=Unerwarteter Fehler beim Einlesen des ZIP-Archivs
CityGmlZipArchive.ioError=Zugriff auf ZIP-Datei fehlgeschlagen
CityGmlZipArchive.malformedZipFile=Einlesen des ZIP-Archivs abgebrochen, ZIP-Datei ist fehlerhaft!
DatabaseHandler.batchCommitFailure=Batch-commit abgebrochen: Auftreten eines kritischen Fehlers beim Versuch CityObject {} in die Datenbank zu schreiben!
DatabaseHandler.connectionFailure=Verbindung zur eingebetteten Datenbank konnte nicht hergestellt werden!
DatabaseHandler.fetchErrorIdsFailure=Abfragen der Liste von CityObjects mit Fehlern ist fehlgeschlagen!
DatabaseHandler.getAllCityObjectsFailure=Abfragen der Liste aller CityObjects ist fehlgeschlagen!
DatabaseHandler.getBBoxIntersectFailure=Verbindung zur Datenbank konnte nicht hergestellt werden, abfragen der BoundingBox-\u00dcberschneidungen von CityObject {} fehlgeschlagen!
DatabaseHandler.getBufferIntersectFailure=Verbindung zur Datenbank konnte nicht hergestellt werden, abfragen der Buffer-\u00dcberschneidungen von CityObject {} fehlgeschlagen!
DatabaseHandler.getFeatureCountFailure=Verbindung zur Datenbank konnte nicht hergestellt werden, abfragen der Anzahl an CityObjects fehlgeschlagen!
DatabaseHandler.marshallingFailure=Schreiben des CityObject {} in die Datenbank fehlgeschlagen!
DatabaseHandler.serializationFailure=Serialisierung des CityObject {} fehlgeschlagen!
DatabaseHandler.setupFailure=KRITISCHER FEHLER: Erstellen der eingebetteten Datenbank fehlgeschlagen!
DatabaseHandler.tableFailure=KRITISCHER FEHLER: Erstellen der "features" Tabelle fehlgeschlagen!
DatabaseHandler.unmarshallingFailure=Laden des CityObject {} aus der Datenbank fehlgeschlagen!
DistanceError.distanceFromPlane=Abstand von der Ebene
ErrorItemVisitor.childId=Kind ID
ErrorItemVisitor.component=Komponente
ErrorItemVisitor.degeneratedRing=Degenerierter Ring
ErrorItemVisitor.deviation=Abweichung
ErrorItemVisitor.distance=Distanz
ErrorItemVisitor.intersection=Verschneidung
ErrorItemVisitor.nameOfAttribute=Name des Attributs
ErrorItemVisitor.pointTouchesEdge=Punkt ber\u00fchrt Kante
ErrorItemVisitor.triangles=Dreiecke
ExceptionDialog.stacktrace=Der Stacktrace des Fehlers war:
FilterPane.buildings=Geb\u00e4ude
FeatureMapper.polygonUnreferenced=Polygon {} wurde referenziert, konnte aber nicht gefunden werden!
FilterPane.bridges=Br\u00fccken
FilterPane.buildings=Geb\u00e4ude
FilterPane.landUse=Landnutzung
FilterPane.transportation=Transport
FilterPane.vegetation=Vegetation
FilterPane.water=Wasser
MainToolBar.wireframe=Zeige/Verstecke Gitternetz
MainToolBar.culling=Aktiviere/Deaktiviere Entfernen der R\u00fcckseiten
MainToolBar.writeReports=Schreibe Reports
GeometryMapper.emptyPolygon=Polygon ohne externen Ring gefunden. Polygon wird ignoriert
LibraryObject.fileMissing=Die ImplicitGeometry eines Features verweist auf eine nicht vorhandene LibraryObject-Datei {}
LibraryObject.parsingError=LibraryObject-Datei {} konnte aufgrund eines Fehlers nicht ausgelesen werden
MainToolBar.culling=Aktiviere/Deaktiviere Entfernen der Polygon-R\u00fcckseiten
MainToolBar.executeChecks=F\u00fchre Pr\u00fcfungen aus
MainToolBar.showWorld=Gesamtes Stadtmodell anzeigen
MainToolBar.resetCamera=Ansicht zur\u00fccksetzen
MainToolBar.hideRoof=Zeige/Verstecke Dach BoundarySurfaces
MainToolBar.hideRoof=Zeige/Verstecke Dach-BoundarySurfaces
MainToolBar.resetCamera=Kamera-Ansicht zur\u00fccksetzen
MainToolBar.showWorld=Zeige gesamtes Stadtmodell an
MainToolBar.wireframe=Aktiviere/Deaktiviere Gitternetz-Modus
MainToolBar.writeReports=Schreibe Berichte
MainToolBar.zip=Zip-eintrag Auswahlfenster \u00f6ffnen
MainWindow.missingConfig=Konnte Konfigurationsdatei nicht finden.
MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten
MainWindow.finishedLoading=Fertig geladen
MainWindow.checking=Pr\u00fcfe, bitte warten
MainWindow.writeXml=Schreibe Xml Report
MainWindow.finishedXml=Xml Report abgeschlossen
MainWindow.writePdf=Schreibe Pdf Report
MainWindow.finishedPdf=Pdf Report abgeschlossen
MainWindow.loadFailed=Konnte GML-Datei nicht laden: {}
MainWindow.all=Alle
MainWindow.withErrors=Mit Fehlern
MainWindow.export=Feature Exportieren
MainWindow.attributeTab=Attribute
MainWindow.availableLabel=Verf\u00fcgbar:
MainWindow.bridgeTab=Br\u00fccken
MainWindow.buildingsTab=Geb\u00e4ude
MainWindow.checking=Pr\u00fcfe, bitte warten
MainWindow.cityfurnitureTab=Stadtm\u00f6bel
MainWindow.clearBtn=Leeren
MainWindow.copyId=GML-ID kopieren
MainWindow.delete=Feature L\u00f6schen
MainWindow.infoTopLevelExport=Export ist nur f\u00fcr Featureobjekt basis m\u00f6glich!
MainWindow.edgesTab=Kanten
MainWindow.errorsTab=Fehler
MainWindow.export=Feature Exportieren
MainWindow.finishedLoading=Fertig geladen
MainWindow.finishedPdf=Pdf-Bericht abgeschlossen
MainWindow.finishedXml=Xml-Bericht abgeschlossen
MainWindow.focusCityObject=Objekt fokussieren
MainWindow.globalErrorsTab=Globale Fehler
MainWindow.infoTopLevelCopyID=GML-ID kann nur von Featureobjekt basis kopiert werden!
mainWindow.warnCopyIdFailed=Kopieren der ID fehlgeschlagen!
OpenFileDialog.select=W\u00e4hle CityGML Datei aus
MainWindow.infoTopLevelExport=Export ist nur f\u00fcr Featureobjekt basis m\u00f6glich!
MainWindow.languageChange=Um die Spracheinstellung zu \u00fcbernehmen muss CityDoctor2 neugestartet werden.
MainWindow.buildingsTab=Geb\u00e4ude
MainWindow.vegetationTab=Vegetation
MainWindow.transportationTab=Verkehrsobjekte
MainWindow.tunnelTab=Tunnel
MainWindow.bridgeTab=Br\u00fccken
MainWindow.waterTab=Gew\u00e4sser
MainWindow.terrainTab=Gel\u00e4nde
MainWindow.cityfurnitureTab=Stadtm\u00f6bel
MainWindow.loadFailed=Konnte GML-Datei nicht laden: {}
MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten
MainWindow.logTab=Log
MainWindow.memoryLabel=Speicher:
MainWindow.missingConfig=Konnte Konfigurationsdatei nicht finden.
MainWindow.otherObjectsTab=Andere
MainWindow.viewLabel=Ansicht
MainWindow.showLabel=Zeige:
MainWindow.searchLabel=Suche:
MainWindow.searchBtn=Suche
MainWindow.clearBtn=Leeren
MainWindow.errorsTab=Fehler
MainWindow.polygonsTab=Polygone
MainWindow.edgesTab=Kanten
MainWindow.searchBtn=Suche
MainWindow.searchLabel=Suche:
MainWindow.showLabel=Zeige:
MainWindow.terrainTab=Gel\u00e4nde
MainWindow.transportationTab=Verkehrsobjekte
MainWindow.tunnelTab=Tunnel
MainWindow.vegetationTab=Vegetation
MainWindow.verticesTab=Punkte
MainWindow.attributeTab=Attribute
MainWindow.logTab=Log
MainWindow.globalErrorsTab=Globale Fehler
MainWindow.focusCityObject=Objekt fokussieren
MainWindow.viewLabel=Ansicht
MainWindow.warnCopyIdFailed=Kopieren der ID fehlgeschlagen!
MainWindow.waterTab=Gew\u00e4sser
MainWindow.withErrors=Mit Fehlern
MainWindow.writePdf=Schreibe Pdf-Bericht
MainWindow.writeXml=Schreibe Xml-Bericht
OpenFileDialog.cancelBtn=Abbrechen
OpenFileDialog.fileLabel=Datei:
OpenFileDialog.selectBtn=Ausw\u00e4hlen
OpenFileDialog.loadBtn=Laden
OpenFileDialog.loadFailed=Konnte CityGML Datei nicht laden
OpenFileDialog.lowMemoryLabel=Reduzierter Speicherverbrauchsmodus
OpenFileDialog.roundingPlacesLabel=Anzahl der Rundungsstellen
OpenFileDialog.select=W\u00e4hle CityGML Datei aus
OpenFileDialog.selectBtn=Ausw\u00e4hlen
OpenFileDialog.settingsPane=Parser Einstellungen
OpenFileDialog.roundingPlacesLabel=NumberOfRoundingPlaces
OpenFileDialog.xmlValidationLabel=F\u00fchre XML-Validierung aus
Checker.failXml=Konnte XML Fehlerbericht nicht schreiben.
Checker.failPdf=Konnte PDF Fehlerbericht nicht schreiben.
Checker.checksFinished=Pr\u00fcfungen beendet
Checker.schematronValidation=Starte Schematron Pr\u00fcfung
Checker.finishedSchematron=Schematron Pr\u00fcfung abgeschlossen
Checker.failReports=Konnte Pr\u00fcfberichte nicht schreiben.
Checker.checkFeature=Pr\u00fcfe Feature: {}
Checker.executeCheck=F\u00fchre Pr\u00fcfung aus: {}
ValidationConfiguration.reenable={} ist deaktiviert wird aber von {} ben\u00f6tigt, reaktiviere
TimeFormatter.hours={0} Stunden
TimeFormatter.lessThanASecond=< 1 Sekunde
TimeFormatter.minutes={0} Minuten
TimeFormatter.oneHour=1 Stunde
TimeFormatter.oneMinute=1 Minute
TimeFormatter.oneSecond=1 Sekunde
TimeFormatter.seconds={0} Sekunden
Unit.Degree=Grad
Unit.Radian=Radiant
ValidationConfiguration.missingSchematron={} existiert nicht, deaktiviere Schematron Pr\u00fcfung
CheckContainer.error=Unerwarteter Fehler bei der Ausf\u00fchrung von Pr\u00fcfung: {}
Checks.missingCheck=Konnte keine Pr\u00fcfung f\u00fcr id {} finden
OpenFileDialog.cancelBtn=Abbrechen
CheckDialog.checksTab=Pr\u00fcfungen
CheckDialog.filterTab=Filter
CheckDialog.globalParametersLabel=Globale Parameter
CheckDialog.availableChecksLabel=Verf\u00fcgbare Pr\u00fcfungen
CheckDialog.geometricChecksLabel=Geometrische Pr\u00fcfungen
CheckDialog.semanticChecksLabel=Semantische Pr\u00fcfungen
CheckDialog.schematronFileLabel=Schematron Datei
CheckDialog.selectBtn=Ausw\u00e4hlen
CheckDialog.checkBtn=Pr\u00fcfen
CheckDialog.cancelBtn=Abbrechen
CheckDialog.streamCheckOption=Niedrigen Arbeitsspeicherverbrauchsmodus aktivieren
CheckDialog.streamCheckLabel=Stadtmodelle werden nicht in den Arbeitsspeicher geladen. Ergebnisse werden in der QualityADE in Kopien der Eingangsdateien gespeichert.
CheckDialog.outputPathLabel=Ausgabeordner (Pflichtfeld):
CheckDialog.outputPathBtn=Ausw\u00e4hlen
CheckDialog.pdfReportsOption=PDF Berichte erstellen
CheckDialog.xmlReportsOption=XML Berichte erstellen
CheckDialog.noPathError=Ausgabepfad wurde nicht gesetzt!
ZipEntryManager.title=Zipeintrag Manager
ZipEntryManager.entryListTitle=Zipeintr\u00e4ge
ZipEntryManager.metadata=Metadaten
ZipEntryManager.subpathLbl=Unterpfad:
ZipEntryManager.erroneousLbl=Fehlerhaft:
ZipEntryManager.excessiveFileSize=Datei zu gro\u00DF
ZipEntryManager.invalidCityGml=Ung\u00fcltige CityGML Datei
ZipEntryManager.ioError=Dateizugriff fehlgeschlagen
ZipEntryManager.filesizeLbl=Dateigr\u00f6\u00DFe:
ZipEntryManager.validatedLbl=Validiert:
ZipEntryManager.objectCountLbl=Objektanzahl:
ZipEntryManager.loadBtn=CityGML Modell laden
ZipEntryManager.decompressBtn=Datei entpacken
ZipEntryManager.decompressAllBtn=Alle Dateien entpacken
ZipEntryManager.checkAllBtn=Alle Dateien pr\u00fcfen
ZipEntryManager.showReportBtn=Fehlerstatistik anzeigen
ZipEntryManager.saveBtn=Validierungsergebnisse exportieren
ZipEntryManager.cancelBtn=Abbruch
ZipEntryManager.unknownValue=Unbekannt
ZipEntryManager.yes=Ja
ZipEntryManager.no=Nein
CityGmlZipArchive.ioError=Zugriff auf ZIP-Datei fehlgeschlagen
CityGmlZipArchive.malformedZipFile=Einlesen des ZIP-Archivs abgebrochen, ZIP-Datei ist fehlerhaft!
CityGmlZipArchive.generalException=Unerwarteter Fehler beim Einlesen des ZIP-Archivs
WriteReportDialog.writeBtn=Speichern
ValidationConfiguration.reenable={} ist deaktiviert wird aber von {} ben\u00f6tigt, reaktiviere
WriteReportDialog.cancelBtn=Abbrechen
WriteReportDialog.errorStatisticsLabel=Fehler Statistik
WriteReportDialog.saveImageBtn=Bild Speichern
WriteReportDialog.selectPdfBtn=Ausw\u00e4hlen
WriteReportDialog.selectXmlFile=Ausw\u00e4hlen
WriteReportDialog.writeBtn=Speichern
WriteReportDialog.xAxisLabel=Fehler
WriteReportDialog.yAxisLabel=Anzahl
Unit.Radian=Radiant
Unit.Degree=Grad
FeatureMapper.polygonUnreferenced=Polygon {} ist referenziert, konnte aber nicht gefunden werden
GeometryMapper.emptyPolygon=Polygon ohne externen Ring gefunden, ignoriere
CityGmlParser.parsedObjects=Modell mit {} Objekten gelesen
CityGmlParser.chunkReadFailed=Konnte Datei nicht in St\u00fccken lesen, versuche komplett zu lesen
CityGmlParser.notValidGmlFile=Dies ist keine korrekte CityGML Datei\n
CityGmlParser.errorReadingGmlFile=Fehler beim lesen der CityGML Datei\n{}
CityGmlParser.errorWritingGmlFile=Fehler beim schreiben der CityGML Datei\n{}
CityGmlParser.noConversionNeeded=Koordinatensystem in Metern, keine Konvertierung notwendig
CityGmlParser.failedEPSGParse=Lesen des EPSG Codes fehlgeschlagen, greife auf metrisches System zur\u00fcck
CityGmlParser.missingEPSGCode=Kein EPSG Code gefunden, nehme metrisches System an
OpenFileDialog.loadFailed=Konnte CityGML Datei nicht laden
MainWindow.memoryLabel=Speicher:
CheckDialog.checksReenabledAlert=Manche Pr\u00fcfungen wurden reaktiviert damit andere gewollte Pr\u00fcfungen durchgef\u00fchrt werden k\u00f6nnen\nMehr Details sind im Log geschrieben
MainWindow.availableLabel=Verf\u00fcgbar:
OpenFileDialog.lowMemoryLabel=Reduzierter Speicherverbrauchsmodus
ErrorItemVisitor.intersection=Verschneidung
ErrorItemVisitor.component=Komponente
ErrorItemVisitor.nameOfAttribute=Name des Attributs
ErrorItemVisitor.childId=Kind ID
ErrorItemVisitor.distance=Distanz
ErrorItemVisitor.pointTouchesEdge=Punkt ber\u00fchrt Kante
ErrorItemVisitor.degeneratedRing=Degenerierter Ring
ErrorItemVisitor.deviation=Abweichung
ErrorItemVisitor.triangles=Dreiecke
\ No newline at end of file
WriteReportDialog.yAxisLabel=Anzahl
\ No newline at end of file
......@@ -14,5 +14,8 @@
<Logger name="org.apache.fop" level="INFO">
<AppenderRef ref="console" />
</Logger>
<Logger name="com.zaxxer.hikari" level="INFO" additivity="false">
<AppenderRef ref="console"/>
</Logger>
</Loggers>
</Configuration>
\ No newline at end of file
package de.hft.stuttgart.citydoctor2.database;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryTestUtils;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.citygml4j.core.model.building.AbstractBuilding;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.List;
import static de.hft.stuttgart.citydoctor2.database.SerializationTest.assertCityObjectEquality;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
public class EmbeddedDataBaseHandlerTest {
private EmbeddedDatabaseHandler handler;
@Before
public void resetDatabase() {
try {
handler = new EmbeddedDatabaseHandler();
handler.setupFeaturesTable();
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testGetBboxIntersectingObjects() {
Building b = new Building();
Building b2 = new Building();
b2.setGmlObject(Mockito.mock(AbstractBuilding.class));
Building b3 = new Building();
Building b4 = new Building();
b4.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD0));
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0, Geometry.Orientation.OUTWARD);
ConcretePolygon polygon = new ConcretePolygon();
geom.getPolygons().add(polygon);
polygon.setParent(geom);
LinearRing lr = new LinearRing(LinearRing.LinearRingType.EXTERIOR);
polygon.setExteriorRing(lr);
Vertex v1 = new Vertex(10, 10, 8);
lr.getVertices().add(v1);
Vertex v2 = new Vertex(14, 15, 7);
lr.getVertices().add(v2);
Vertex v3 = new Vertex(14, 15, 3);
lr.getVertices().add(v3);
Vertex v4 = new Vertex(10, 10, 3);
lr.getVertices().add(v4);
lr.getVertices().add(v1);
geom.updateEdgesAndVertices();
b.addGeometry(geom);
Geometry geom2 = new Geometry(GeometryType.SOLID, Lod.LOD0, Geometry.Orientation.OUTWARD);
ConcretePolygon polygon2 = new ConcretePolygon();
geom2.getPolygons().add(polygon2);
polygon2.setParent(geom2);
LinearRing lr2 = new LinearRing(LinearRing.LinearRingType.EXTERIOR);
polygon2.setExteriorRing(lr2);
Vertex v1b2 = new Vertex(6, 6, 8);
lr2.getVertices().add(v1b2);
Vertex v2b2 = new Vertex(11, 13, 7);
lr2.getVertices().add(v2b2);
Vertex v3b2 = new Vertex(11, 13, 3);
lr2.getVertices().add(v3b2);
Vertex v4b2 = new Vertex(6, 6, 3);
lr2.getVertices().add(v4b2);
lr2.getVertices().add(v1b2);
geom2.updateEdgesAndVertices();
b2.addGeometry(geom2);
Geometry geom3 = new Geometry(GeometryType.SOLID, Lod.LOD0, Geometry.Orientation.OUTWARD);
ConcretePolygon polygon3 = new ConcretePolygon();
geom3.getPolygons().add(polygon3);
polygon3.setParent(geom3);
LinearRing lr3 = new LinearRing(LinearRing.LinearRingType.EXTERIOR);
polygon3.setExteriorRing(lr3);
Vertex v1b3 = new Vertex(6, 6, 8);
lr3.getVertices().add(v1b3);
Vertex v2b3 = new Vertex(10, 9.999, 7);
lr3.getVertices().add(v2b3);
Vertex v3b3 = new Vertex(10, 9.999, 3);
lr3.getVertices().add(v3b3);
Vertex v4b3 = new Vertex(6, 6, 3);
lr3.getVertices().add(v4b3);
lr3.getVertices().add(v1b3);
geom3.updateEdgesAndVertices();
b3.addGeometry(geom3);
handler.marshallCityObject(b);
handler.marshallCityObject(b2);
handler.marshallCityObject(b3);
handler.marshallCityObject(b4);
assertEquals(4, handler.getFeatureCount());
List<GmlId> objects = handler.getGeometryCollisionCandidates(b);
assertEquals(1, objects.size());
assertEquals(4, handler.getFeatureCount());
CityObject co = handler.unmarshallCityObject(objects.get(0));
assertNotNull(co);
assertCityObjectEquality(b2, co);
}
@Test
public void testGetBboxBufferIntersectingObjects() {
Building b = new Building();
Building b2 = new Building();
b2.setGmlObject(Mockito.mock(AbstractBuilding.class));
Building b3 = new Building();
Building b4 = new Building();
b4.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD0));
Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD0, Geometry.Orientation.OUTWARD);
ConcretePolygon polygon = new ConcretePolygon();
geom.getPolygons().add(polygon);
polygon.setParent(geom);
LinearRing lr = new LinearRing(LinearRing.LinearRingType.EXTERIOR);
polygon.setExteriorRing(lr);
Vertex v1 = new Vertex(10, 10, 8);
lr.getVertices().add(v1);
Vertex v2 = new Vertex(14, 15, 7);
lr.getVertices().add(v2);
Vertex v3 = new Vertex(14, 15, 3);
lr.getVertices().add(v3);
Vertex v4 = new Vertex(10, 10, 3);
lr.getVertices().add(v4);
lr.getVertices().add(v1);
geom.updateEdgesAndVertices();
b.addGeometry(geom);
Geometry geom2 = new Geometry(GeometryType.SOLID, Lod.LOD0, Geometry.Orientation.OUTWARD);
ConcretePolygon polygon2 = new ConcretePolygon();
geom2.getPolygons().add(polygon2);
polygon2.setParent(geom2);
LinearRing lr2 = new LinearRing(LinearRing.LinearRingType.EXTERIOR);
polygon2.setExteriorRing(lr2);
Vertex v1b2 = new Vertex(6, 6, 8);
lr2.getVertices().add(v1b2);
Vertex v2b2 = new Vertex(9, 9, 7);
lr2.getVertices().add(v2b2);
Vertex v3b2 = new Vertex(9, 9, 3);
lr2.getVertices().add(v3b2);
Vertex v4b2 = new Vertex(6, 6, 3);
lr2.getVertices().add(v4b2);
lr2.getVertices().add(v1b2);
geom2.updateEdgesAndVertices();
b2.addGeometry(geom2);
Geometry geom3 = new Geometry(GeometryType.SOLID, Lod.LOD0, Geometry.Orientation.OUTWARD);
ConcretePolygon polygon3 = new ConcretePolygon();
geom3.getPolygons().add(polygon3);
polygon3.setParent(geom3);
LinearRing lr3 = new LinearRing(LinearRing.LinearRingType.EXTERIOR);
polygon3.setExteriorRing(lr3);
Vertex v1b3 = new Vertex(4, 4, 8);
lr3.getVertices().add(v1b3);
Vertex v2b3 = new Vertex(8.999, 8.999, 7);
lr3.getVertices().add(v2b3);
Vertex v3b3 = new Vertex(8.999, 8.999, 3);
lr3.getVertices().add(v3b3);
Vertex v4b3 = new Vertex(4, 4, 3);
lr3.getVertices().add(v4b3);
lr3.getVertices().add(v1b3);
geom3.updateEdgesAndVertices();
b3.addGeometry(geom3);
handler.marshallCityObject(b);
handler.marshallCityObject(b2);
handler.marshallCityObject(b3);
handler.marshallCityObject(b4);
assertEquals(4, handler.getFeatureCount());
List<GmlId> objects = handler.getBufferCollisionCandidates(b, Math.sqrt(2));
assertEquals(1, objects.size());
assertEquals(4, handler.getFeatureCount());
CityObject co = handler.unmarshallCityObject(objects.get(0));
assertNotNull(co);
assertCityObjectEquality(b2, co);
}
@Test
public void testMarshallingRoundTripSimpleSolid() throws InvalidGmlFileException, CityGmlParseException {
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = CityGmlParser.parseCityGmlFile("src/test/resources/SimpleSolid_SrefBS.gml", config);
Building b = model.getBuildings().toList().get(0);
assertNotNull(b);
handler.marshallCityObject(b);
assertEquals(1, handler.getFeatureCount());
CityObject b2 = handler.unmarshallCityObject(b.getGmlId());
assertNotNull(b2);
assertEquals(1, handler.getFeatureCount());
assertCityObjectEquality(b, b2);
}
@Test
public void testMarshallingRoundTripFzk() throws InvalidGmlFileException, CityGmlParseException {
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = CityGmlParser.parseCityGmlFile("src/test/resources/FZK_haus.gml", config);
Building b = model.getBuildings().toList().get(0);
assertNotNull(b);
assertEquals(1, handler.getFeatureCount());
handler.marshallCityObject(b);
assertEquals(1, handler.getFeatureCount());
CityObject b2 = handler.unmarshallCityObject(b.getGmlId());
assertNotNull(b2);
assertEquals(1, handler.getFeatureCount());
assertCityObjectEquality(b, b2);
}
}
package de.hft.stuttgart.citydoctor2.database;
import de.hft.stuttgart.citydoctor2.datastructure.*;
import org.citygml4j.core.model.building.AbstractBuilding;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;
import static org.mockito.Mockito.mock;
public class FeatureCacheTest {
@Test
public void testPut(){
FeatureCache cache = new FeatureCache();
Building b = new Building();
b.setGmlObject(mock(AbstractBuilding.class));
b.setGmlId(new GmlId("test"));
b.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD0));
assertEquals(0, cache.getTotalFeatureCount());
cache.put(b);
cache.synchronize();
assertEquals(1, cache.getTotalFeatureCount());
}
@Test
public void testGet(){
FeatureCache cache = new FeatureCache();
assertNull(cache.get(new GmlId("test")));
Building b = new Building();
b.setGmlObject(mock(AbstractBuilding.class));
b.setGmlId(new GmlId("test"));
b.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID, Lod.LOD0));
assertEquals(0, cache.getTotalFeatureCount());
cache.put(b);
cache.synchronize();
CityObject b2 = cache.get(new GmlId("test"));
assertEquals(b.getGmlId(), b2.getGmlId());
}
@Test
public void testStateHandlingFromIdle(){
FeatureCache cache = new FeatureCache();
assertEquals(FeatureCache.CacheState.IDLE, cache.getState());
AutoCloseable parsingContext = cache.startParsingMode();
try(parsingContext){
assertEquals(FeatureCache.CacheState.PARSING, cache.getState());
} catch (Exception e){
throw new RuntimeException(e);
}
assertEquals(FeatureCache.CacheState.IDLE, cache.getState());
AutoCloseable checkingContext = cache.startCheckingMode();
try(checkingContext){
assertEquals(FeatureCache.CacheState.CHECKING, cache.getState());
} catch (Exception e){
throw new RuntimeException(e);
}
assertEquals(FeatureCache.CacheState.IDLE, cache.getState());
}
@Test
public void testCheckingModeStateCollision(){
FeatureCache cache = new FeatureCache();
assertEquals(FeatureCache.CacheState.IDLE, cache.getState());
AutoCloseable checkingContext = cache.startCheckingMode();
try(checkingContext){
assertEquals(FeatureCache.CacheState.CHECKING, cache.getState());
assertThrows(IllegalStateException.class, cache::startParsingMode);
} catch (Exception e){
throw new RuntimeException(e);
}
}
@Test
public void testParsingModeStateCollision(){
FeatureCache cache = new FeatureCache();
assertEquals(FeatureCache.CacheState.IDLE, cache.getState());
AutoCloseable parsingContext = cache.startParsingMode();
try(parsingContext){
assertEquals(FeatureCache.CacheState.PARSING, cache.getState());
assertThrows(IllegalStateException.class, cache::startCheckingMode);
} catch (Exception e){
throw new RuntimeException(e);
}
}
}
package de.hft.stuttgart.citydoctor2.database;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import de.hft.stuttgart.citydoctor2.utils.visitors.CityObjectCollector;
import org.apache.commons.lang3.SerializationUtils;
import org.junit.Test;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class SerializationTest {
static void assertCityObjectEquality(CityObject c1, CityObject c2) {
assertEquals(c1.getGmlId(), c2.getGmlId());
assertEquals(c1.getFeatureType(), c2.getFeatureType());
assertEquals(c1.getGmlObject().getId(), c2.getGmlObject().getId());
CityObjectCollector collector = new CityObjectCollector();
c1.accept(collector);
Set<CityObject> coB = collector.getCityObjects();
collector = new CityObjectCollector();
c2.accept(collector);
Set<CityObject> coB2 = collector.getCityObjects();
assertEquals(coB.size(), coB2.size());
}
@Test
public void testRoundtripSimpleSolid() throws CityGmlParseException, InvalidGmlFileException {
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = CityGmlParser.parseCityGmlFile("src/test/resources/SimpleSolid_SrefBS.gml", config);
Building b = model.getBuildings().toList().get(0);
assertNotNull(b);
Building b2 = SerializationUtils.roundtrip(b);
assertNotNull(b2);
assertCityObjectEquality(b, b2);
}
@Test
public void testRoundtripFzk() throws CityGmlParseException, InvalidGmlFileException {
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = CityGmlParser.parseCityGmlFile("src/test/resources/FZK_haus.gml", config);
Building b = model.getBuildings().toList().get(0);
assertNotNull(b);
Building b2 = SerializationUtils.roundtrip(b);
assertCityObjectEquality(b, b2);
}
}
......@@ -51,11 +51,9 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
public class BoundarySurfaceTest {
//Todo: Check this class for rework potential with the new Visitors
@Test
public void testVisitorPropagation() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
......@@ -68,7 +66,7 @@ public class BoundarySurfaceTest {
@Test
public void testAccept() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
AtomicInteger bsCounter = new AtomicInteger(0);
......@@ -86,7 +84,7 @@ public class BoundarySurfaceTest {
@Test
public void testAcceptWithoutFittingCheck() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
AtomicInteger bsCounter = new AtomicInteger(0);
......@@ -104,7 +102,7 @@ public class BoundarySurfaceTest {
@Test
public void testPrepareForChecking() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2, Orientation.OUTWARD);
Geometry spyGeom = Mockito.spy(geom);
bs.addGeometry(spyGeom);
......@@ -114,7 +112,7 @@ public class BoundarySurfaceTest {
@Test
public void testContainsError() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
assertFalse(bs.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
......@@ -124,9 +122,9 @@ public class BoundarySurfaceTest {
@Test
public void testContainsErrorInOpening() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
assertFalse(bs.containsError(CheckId.C_GE_P_HOLE_OUTSIDE));
Opening o = new Opening(OpeningType.WINDOW, SurfaceFeatureType.BUILDING, bs, null);
Opening o = new Opening(OpeningType.WINDOW, bs, null);
bs.addOpening(o);
o.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
......@@ -136,7 +134,7 @@ public class BoundarySurfaceTest {
@Test
public void testClearAllContainedCheckResults() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
Opening oMock = Mockito.mock(Opening.class);
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
......@@ -149,7 +147,7 @@ public class BoundarySurfaceTest {
@Test
public void testContainsAnyError() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
assertFalse(bs.containsAnyError());
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
......@@ -159,19 +157,18 @@ public class BoundarySurfaceTest {
@Test
public void testCollectContainedErrors() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
bs.addCheckResult(
new CheckResult(CheckId.C_GE_P_HOLE_OUTSIDE, ResultStatus.ERROR, Mockito.mock(CheckError.class)));
List<CheckError> errors = new ArrayList<>();
bs.collectContainedErrors(errors);
assertEquals(1, errors.size());
;
}
@Test
public void testReCreateGeometriesWithoutId() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNotNull(ws.getId());
}
......@@ -180,7 +177,7 @@ public class BoundarySurfaceTest {
public void testReCreateGeometriesWithId() {
WallSurface ws = new WallSurface();
ws.setId("test");
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
// nothing has changed
assertEquals("test", ws.getId());
......@@ -190,89 +187,52 @@ public class BoundarySurfaceTest {
}
@Test
public void testReCreateGeometriesMultiSurfaceLod2() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNotNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceBridgeLod2() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BRIDGE, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNotNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceBridgeLod3() {
public void testReCreateGeometriesMultiSurfaceLod0() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BRIDGE, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNotNull(ws.getLod0MultiSurface());
assertNull(ws.getLod1MultiSurface());
assertNull(ws.getLod2MultiSurface());
assertNotNull(ws.getLod3MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceBridgeLod4() {
public void testReCreateGeometriesMultiSurfaceLod1() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BRIDGE, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD1));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNull(ws.getLod0MultiSurface());
assertNotNull(ws.getLod1MultiSurface());
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNotNull(ws.getDeprecatedProperties().getLod4MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceTunnelLod2() {
public void testReCreateGeometriesMultiSurfaceLod2() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNull(ws.getLod0MultiSurface());
assertNull(ws.getLod1MultiSurface());
assertNotNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceTunnelLod3() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNull(ws.getLod2MultiSurface());
assertNotNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceTunnelLod4() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNotNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceLod3() {
WallSurface ws = new WallSurface();
ws.setId("test");
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface( BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD3));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNull(ws.getLod0MultiSurface());
assertNull(ws.getLod1MultiSurface());
assertNull(ws.getLod2MultiSurface());
assertNotNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
......@@ -281,30 +241,21 @@ public class BoundarySurfaceTest {
@Test
public void testReCreateGeometriesMultiSurfaceLod4() {
WallSurface ws = new WallSurface();
ws.setId("test");
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD4));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNull(ws.getLod0MultiSurface());
assertNull(ws.getLod1MultiSurface());
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNotNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testReCreateGeometriesMultiSurfaceLod0() {
WallSurface ws = new WallSurface();
ws.setId("test");
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.MULTI_SURFACE, Lod.LOD0));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
assertNotNull(ws.getLod0MultiSurface());
}
@Test(expected = IllegalStateException.class)
public void testReCreateGeometriesSolid() {
WallSurface ws = new WallSurface();
ws.setId("test");
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
bs.addGeometry(GeometryTestUtils.createDummyGeometry(GeometryType.SOLID));
bs.reCreateGeometries(GeometryFactory.newInstance(), new ParserConfiguration(8, false));
}
......@@ -312,8 +263,7 @@ public class BoundarySurfaceTest {
@Test
public void testReCreateGeometriesOpenings() {
WallSurface ws = new WallSurface();
ws.setId("test");
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
GeometryFactory factory = GeometryFactory.newInstance();
......@@ -325,7 +275,7 @@ public class BoundarySurfaceTest {
@Test
public void testGetGmlObject() {
WallSurface ws = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
assertEquals(ws, bs.getGmlObject());
}
......@@ -338,7 +288,7 @@ public class BoundarySurfaceTest {
assertNotNull(ws.getLod2MultiSurface());
assertNotNull(ws.getLod3MultiSurface());
assertNotNull(ws.getDeprecatedProperties().getLod4MultiSurface());
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, ws);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, ws);
Opening oMock = Mockito.mock(Opening.class);
bs.addOpening(oMock);
bs.accept(new UnsetGeometriesVisitor());
......@@ -348,41 +298,9 @@ public class BoundarySurfaceTest {
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testUnsetGmlGeometriesBridge() {
WallSurface ws = new WallSurface();
ws.setLod2MultiSurface(new MultiSurfaceProperty());
ws.setLod3MultiSurface(new MultiSurfaceProperty());
ws.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
assertNotNull(ws.getLod2MultiSurface());
assertNotNull(ws.getLod3MultiSurface());
assertNotNull(ws.getDeprecatedProperties().getLod4MultiSurface());
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BRIDGE, BoundarySurfaceType.WALL, ws);
bs.unsetGmlGeometries();
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testUnsetGmlGeometriesTunnel() {
WallSurface ws = new WallSurface();
ws.setLod2MultiSurface(new MultiSurfaceProperty());
ws.setLod3MultiSurface(new MultiSurfaceProperty());
ws.getDeprecatedProperties().setLod4MultiSurface(new MultiSurfaceProperty());
assertNotNull(ws.getLod2MultiSurface());
assertNotNull(ws.getLod3MultiSurface());
assertNotNull(ws.getDeprecatedProperties().getLod4MultiSurface());
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, ws);
bs.unsetGmlGeometries();
assertNull(ws.getLod2MultiSurface());
assertNull(ws.getLod3MultiSurface());
assertNull(ws.getDeprecatedProperties().getLod4MultiSurface());
}
@Test
public void testGetFeatureType() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
assertEquals(FeatureType.BOUNDARY_SURFACE, bs.getFeatureType());
}
......@@ -392,17 +310,11 @@ public class BoundarySurfaceTest {
BoundarySurface bs = new BoundarySurface(aco);
assertEquals(aco, bs.getGmlObject());
}
@Test
public void testSetFeatureType() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, null);
bs.setFeatureType(SurfaceFeatureType.BRIDGE);
assertEquals(SurfaceFeatureType.BRIDGE, bs.getSurfaceFeatureType());
}
@Test
public void testSetType() {
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.TUNNEL, BoundarySurfaceType.WALL, null);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, null);
bs.setType(BoundarySurfaceType.ROOF);
assertEquals(BoundarySurfaceType.ROOF, bs.getType());
}
......
......@@ -51,7 +51,6 @@ import de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor;
public class BridgeObjectTest {
//TODO: Rework this class with the new Visitors
@Test
public void testAccept() {
......
......@@ -64,7 +64,7 @@ public class BuildingTest {
b.setCityGmlBuilding(createCityGmlBuilding());
RoofSurface rs = new RoofSurface();
rs.setId("testRoof");
BoundarySurface surface = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.ROOF, rs);
BoundarySurface surface = new BoundarySurface(BoundarySurfaceType.ROOF, rs);
Geometry geomSurface = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2, Orientation.OUTWARD);
geomSurface.addPolygon(new LinkedPolygon(p, geomSurface));
geomSurface.updateEdgesAndVertices();
......@@ -75,7 +75,8 @@ public class BuildingTest {
assertNotSame(b, copy);
assertEquals(b.getGmlId(), copy.getGmlId());
copy.prepareForChecking();
Geometry copyGeom = copy.getGeometries().get(0);
assertNotSame(geom, copyGeom);
......
......@@ -27,11 +27,14 @@ import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import de.hft.stuttgart.citydoctor2.database.FeatureCache;
import de.hft.stuttgart.citydoctor2.database.UnconnectedCache;
import org.citygml4j.core.ade.ADEException;
import org.citygml4j.core.model.CityGMLVersion;
import org.citygml4j.core.model.core.AbstractFeatureProperty;
import org.citygml4j.core.model.core.CityModel;
import org.citygml4j.xml.writer.CityGMLWriteException;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
......@@ -63,28 +66,40 @@ import de.hft.stuttgart.quality.model.types.ValidationPlan;
public class CityDoctorModelTest {
private File mockFile;
private ParserConfiguration config;
private CityDoctorModel model;
private final FeatureCache featureCache = new FeatureCache();
@Before
public void setUp(){
mockFile = Mockito.mock(File.class);
Mockito.when(mockFile.getName()).thenReturn("test");
config = new ParserConfiguration(8, false);
featureCache.resetCache();
model = new CityDoctorModel(config, mockFile, featureCache);
}
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test(expected = IllegalArgumentException.class)
public void testCityDoctorModelNoConfig() {
new CityDoctorModel(null, null);
new CityDoctorModel(null, mockFile, new UnconnectedCache());
}
@Test(expected = IllegalArgumentException.class)
public void testCityDoctorModelNoFile() {
new CityDoctorModel(config, null, new UnconnectedCache());
}
@Test
public void testSetValidated() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
model.setValidated(Mockito.mock(ValidationPlan.class));
assertTrue(model.isValidated());
}
@Test
public void testAddGlobalError() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
CheckError err = Mockito.mock(CheckError.class);
model.addGlobalError(err);
assertEquals(err, model.getGlobalErrors().get(0));
......@@ -92,9 +107,6 @@ public class CityDoctorModelTest {
@Test
public void testAddGlobalErrors() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
CheckError err1 = Mockito.mock(CheckError.class);
CheckError err2 = Mockito.mock(CheckError.class);
List<CheckError> errors = new ArrayList<>();
......@@ -107,19 +119,15 @@ public class CityDoctorModelTest {
@Test
public void testGetFile() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
assertEquals(f, model.getFile());
assertEquals(mockFile, model.getFile());
}
@Test
public void testCreateFeatureStream() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Building b = Mockito.mock(Building.class);
Mockito.when(b.getGmlId()).thenReturn(new GmlId("b"));
Vegetation v = Mockito.mock(Vegetation.class);
Mockito.when(v.getGmlId()).thenReturn(new GmlId("v"));
model.addBuilding(b);
model.addVegetation(v);
assertTrue(model.createFeatureStream().anyMatch(c -> c == b));
......@@ -129,9 +137,6 @@ public class CityDoctorModelTest {
@Test
public void testSaveAsWithoutValidation() throws CityGMLWriteException, ADEException,
IOException, CityGmlParseException, InvalidGmlFileException, CityDoctorWriteException {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
model.setParsedCityGMLVersion(CityGMLVersion.v2_0);
CityModel cModel = new CityModel();
model.setCityModel(cModel);
......@@ -147,7 +152,7 @@ public class CityDoctorModelTest {
assertTrue(saveFile.length() > 0);
CityDoctorModel parsedModel = CityGmlParser.parseCityGmlFile(saveFile.getAbsolutePath(), config);
Building parsedBuilding = parsedModel.getBuildings().get(0);
Building parsedBuilding = parsedModel.getBuildings().toList().get(0);
assertEquals("testId", parsedBuilding.getGmlId().getGmlString());
assertEquals(1, parsedBuilding.getGeometries().size());
}
......@@ -155,9 +160,7 @@ public class CityDoctorModelTest {
@Test
public void testSaveAsWithValidation() throws CityGMLWriteException, ADEException,
IOException, CityGmlParseException, InvalidGmlFileException, CityDoctorWriteException {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
model.setParsedCityGMLVersion(CityGMLVersion.v2_0);
CityModel cModel = new CityModel();
ValidationPlan plan = new ValidationPlan();
......@@ -214,7 +217,7 @@ public class CityDoctorModelTest {
assertTrue(saveFile.length() > 0);
CityDoctorModel parsedModel = CityGmlParser.parseCityGmlFile(saveFile.getAbsolutePath(), config);
Building parsedBuilding = parsedModel.getBuildings().get(0);
Building parsedBuilding = parsedModel.getBuildings().toList().get(0);
assertEquals("testId", parsedBuilding.getGmlId().getGmlString());
assertEquals(1, parsedBuilding.getGeometries().size());
List<CityObjectProperties> props = parsedBuilding.getGmlObject().getADEProperties(CityObjectProperties.class);
......@@ -234,9 +237,6 @@ public class CityDoctorModelTest {
@Test
public void testCollectErrors() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Building b = new Building();
model.addBuilding(b);
CheckError error = Mockito.mock(CheckError.class);
......@@ -247,18 +247,12 @@ public class CityDoctorModelTest {
@Test
public void testGetFileName() {
File f = new File("test");
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
assertEquals("test", model.getFileName());
assertEquals(f, model.getFile());
assertEquals(mockFile, model.getFile());
}
@Test
public void testSetCityModel() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
CityModel cModel = Mockito.mock(CityModel.class);
model.setCityModel(cModel);
assertEquals(cModel, model.getCityModel());
......@@ -266,111 +260,99 @@ public class CityDoctorModelTest {
@Test
public void testAddBuilding() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Building b = Mockito.mock(Building.class);
Mockito.when(b.getGmlId()).thenReturn(new GmlId("b"));
model.addBuilding(b);
assertEquals(b, model.getBuildings().get(0));
assertEquals(b, model.getBuildings().toList().get(0));
}
@Test
public void testAddBridge() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
BridgeObject b = Mockito.mock(BridgeObject.class);
Mockito.when(b.getGmlId()).thenReturn(new GmlId("b"));
model.addBridge(b);
assertEquals(b, model.getBridges().get(0));
assertEquals(b, model.getBridges().toList().get(0));
}
@Test
public void testAddVegetation() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Vegetation veg = Mockito.mock(Vegetation.class);
Mockito.when(veg.getGmlId()).thenReturn(new GmlId("v"));
model.addVegetation(veg);
assertEquals(veg, model.getVegetation().get(0));
assertEquals(veg, model.getVegetation().toList().get(0));
}
@Test
public void testAddTunnel() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Tunnel tunnel = Mockito.mock(Tunnel.class);
Mockito.when(tunnel.getGmlId()).thenReturn(new GmlId("t"));
model.addTunnel(tunnel);
assertEquals(tunnel, model.getTunnels().get(0));
assertEquals(tunnel, model.getTunnels().toList().get(0));
}
@Test
public void testAddTransportation() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
TransportationObject trans = Mockito.mock(TransportationObject.class);
Mockito.when(trans.getGmlId()).thenReturn(new GmlId("t"));
model.addTransportation(trans);
assertEquals(trans, model.getTransportation().get(0));
assertEquals(trans, model.getTransportation().toList().get(0));
}
@Test
public void testAddLand() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
LandObject land = Mockito.mock(LandObject.class);
Mockito.when(land.getGmlId()).thenReturn(new GmlId("l"));
model.addLand(land);
assertEquals(land, model.getLand().get(0));
assertEquals(land, model.getLand().toList().get(0));
}
@Test
public void testAddWater() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
WaterObject water = Mockito.mock(WaterObject.class);
Mockito.when(water.getGmlId()).thenReturn(new GmlId("w"));
model.addWater(water);
assertEquals(water, model.getWater().get(0));
assertEquals(water, model.getWater().toList().get(0));
}
@Test
public void testAddCityFurniture() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
CityFurniture cf = Mockito.mock(CityFurniture.class);
Mockito.when(cf.getGmlId()).thenReturn(new GmlId("cf"));
model.addCityFurniture(cf);
assertEquals(cf, model.getCityFurniture().get(0));
assertEquals(cf, model.getCityFurniture().toList().get(0));
}
@Test
public void testAddGenericCityObject() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
public void testAddOtherCityObject() {
GenericCityObject gen = Mockito.mock(GenericCityObject.class);
model.addGenericCityObject(gen);
assertEquals(gen, model.getGenericCityObjects().get(0));
Mockito.when(gen.getGmlId()).thenReturn(new GmlId("g"));
model.addOtherCityObject(gen);
assertEquals(gen, model.getOtherCityObjects().toList().get(0));
}
@Test
public void testGetNumberOfFeatures() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Building b = Mockito.mock(Building.class);
Mockito.when(b.getGmlId()).thenReturn(new GmlId("b"));
BridgeObject bo = Mockito.mock(BridgeObject.class);
Mockito.when(bo.getGmlId()).thenReturn(new GmlId("bo"));
Vegetation veg = Mockito.mock(Vegetation.class);
Mockito.when(veg.getGmlId()).thenReturn(new GmlId("ve"));
Tunnel tunnel = Mockito.mock(Tunnel.class);
Mockito.when(tunnel.getGmlId()).thenReturn(new GmlId("t"));
TransportationObject trans = Mockito.mock(TransportationObject.class);
Mockito.when(trans.getGmlId()).thenReturn(new GmlId("tr"));
LandObject land = Mockito.mock(LandObject.class);
Mockito.when(land.getGmlId()).thenReturn(new GmlId("l"));
WaterObject water = Mockito.mock(WaterObject.class);
Mockito.when(water.getGmlId()).thenReturn(new GmlId("w"));
CityFurniture cf = Mockito.mock(CityFurniture.class);
Mockito.when(cf.getGmlId()).thenReturn(new GmlId("cf"));
GenericCityObject generic = Mockito.mock(GenericCityObject.class);
Mockito.when(generic.getGmlId()).thenReturn(new GmlId("g"));
model.addBuilding(b);
model.addBridge(bo);
......@@ -380,7 +362,7 @@ public class CityDoctorModelTest {
model.addLand(land);
model.addWater(water);
model.addCityFurniture(cf);
model.addGenericCityObject(generic);
model.addOtherCityObject(generic);
assertEquals(9, model.getNumberOfFeatures());
......@@ -388,31 +370,25 @@ public class CityDoctorModelTest {
@Test
public void testGetParserConfig() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
assertEquals(config, model.getParserConfig());
}
@Test
public void testReplaceBuilding() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Building b1 = Mockito.mock(Building.class);
Mockito.when(b1.getGmlId()).thenReturn(new GmlId("b1"));
Building b2 = Mockito.mock(Building.class);
Mockito.when(b2.getGmlId()).thenReturn(new GmlId("b2"));
model.addBuilding(b1);
assertEquals(b1, model.getBuildings().get(0));
assertEquals(b1, model.getBuildings().toList().get(0));
model.replaceFeature(b1, b2);
assertEquals(b2, model.getBuildings().get(0));
assertEquals(1, model.getBuildings().size());
assertEquals(b2, model.getBuildings().toList().get(0));
assertEquals(1, model.getBuildings().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceBuildingMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Building b1 = Mockito.mock(Building.class);
Building b2 = Mockito.mock(Building.class);
model.replaceFeature(b1, b2);
......@@ -420,23 +396,19 @@ public class CityDoctorModelTest {
@Test
public void testReplaceBridge() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
BridgeObject b1 = Mockito.mock(BridgeObject.class);
Mockito.when(b1.getGmlId()).thenReturn(new GmlId("b1"));
BridgeObject b2 = Mockito.mock(BridgeObject.class);
Mockito.when(b2.getGmlId()).thenReturn(new GmlId("b2"));
model.addBridge(b1);
assertEquals(b1, model.getBridges().get(0));
assertEquals(b1, model.getBridges().toList().get(0));
model.replaceFeature(b1, b2);
assertEquals(b2, model.getBridges().get(0));
assertEquals(1, model.getBridges().size());
assertEquals(b2, model.getBridges().toList().get(0));
assertEquals(1, model.getBridges().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceBridgeMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
BridgeObject b1 = Mockito.mock(BridgeObject.class);
BridgeObject b2 = Mockito.mock(BridgeObject.class);
model.replaceFeature(b1, b2);
......@@ -444,23 +416,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceVegetation() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Vegetation v1 = Mockito.mock(Vegetation.class);
Mockito.when(v1.getGmlId()).thenReturn(new GmlId("v1"));
Vegetation v2 = Mockito.mock(Vegetation.class);
Mockito.when(v2.getGmlId()).thenReturn(new GmlId("v2"));
model.addVegetation(v1);
assertEquals(v1, model.getVegetation().get(0));
assertEquals(v1, model.getVegetation().toList().get(0));
model.replaceFeature(v1, v2);
assertEquals(v2, model.getVegetation().get(0));
assertEquals(1, model.getVegetation().size());
assertEquals(v2, model.getVegetation().toList().get(0));
assertEquals(1, model.getVegetation().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceVegetationMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Vegetation v1 = Mockito.mock(Vegetation.class);
Vegetation v2 = Mockito.mock(Vegetation.class);
model.replaceFeature(v1, v2);
......@@ -468,23 +437,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceTunnel() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Tunnel t1 = Mockito.mock(Tunnel.class);
Mockito.when(t1.getGmlId()).thenReturn(new GmlId("t1"));
Tunnel t2 = Mockito.mock(Tunnel.class);
Mockito.when(t2.getGmlId()).thenReturn(new GmlId("t2"));
model.addTunnel(t1);
assertEquals(t1, model.getTunnels().get(0));
assertEquals(t1, model.getTunnels().toList().get(0));
model.replaceFeature(t1, t2);
assertEquals(t2, model.getTunnels().get(0));
assertEquals(1, model.getTunnels().size());
assertEquals(t2, model.getTunnels().toList().get(0));
assertEquals(1, model.getTunnels().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceTunnelMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
Tunnel t1 = Mockito.mock(Tunnel.class);
Tunnel t2 = Mockito.mock(Tunnel.class);
model.replaceFeature(t1, t2);
......@@ -492,23 +458,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceTransportation() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
TransportationObject t1 = Mockito.mock(TransportationObject.class);
Mockito.when(t1.getGmlId()).thenReturn(new GmlId("t1"));
TransportationObject t2 = Mockito.mock(TransportationObject.class);
Mockito.when(t2.getGmlId()).thenReturn(new GmlId("t2"));
model.addTransportation(t1);
assertEquals(t1, model.getTransportation().get(0));
assertEquals(t1, model.getTransportation().toList().get(0));
model.replaceFeature(t1, t2);
assertEquals(t2, model.getTransportation().get(0));
assertEquals(1, model.getTransportation().size());
assertEquals(t2, model.getTransportation().toList().get(0));
assertEquals(1, model.getTransportation().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceTransportationMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
TransportationObject t1 = Mockito.mock(TransportationObject.class);
TransportationObject t2 = Mockito.mock(TransportationObject.class);
model.replaceFeature(t1, t2);
......@@ -516,23 +479,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceLand() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
LandObject lo1 = Mockito.mock(LandObject.class);
Mockito.when(lo1.getGmlId()).thenReturn(new GmlId("lo1"));
LandObject lo2 = Mockito.mock(LandObject.class);
Mockito.when(lo2.getGmlId()).thenReturn(new GmlId("lo2"));
model.addLand(lo1);
assertEquals(lo1, model.getLand().get(0));
assertEquals(lo1, model.getLand().toList().get(0));
model.replaceFeature(lo1, lo2);
assertEquals(lo2, model.getLand().get(0));
assertEquals(1, model.getLand().size());
assertEquals(lo2, model.getLand().toList().get(0));
assertEquals(1, model.getLand().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceLandMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
LandObject lo1 = Mockito.mock(LandObject.class);
LandObject lo2 = Mockito.mock(LandObject.class);
model.replaceFeature(lo1, lo2);
......@@ -540,23 +500,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceWater() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
WaterObject t1 = Mockito.mock(WaterObject.class);
Mockito.when(t1.getGmlId()).thenReturn(new GmlId("t1"));
WaterObject t2 = Mockito.mock(WaterObject.class);
Mockito.when(t2.getGmlId()).thenReturn(new GmlId("t2"));
model.addWater(t1);
assertEquals(t1, model.getWater().get(0));
assertEquals(t1, model.getWater().toList().get(0));
model.replaceFeature(t1, t2);
assertEquals(t2, model.getWater().get(0));
assertEquals(1, model.getWater().size());
assertEquals(t2, model.getWater().toList().get(0));
assertEquals(1, model.getWater().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceWaterMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
WaterObject t1 = Mockito.mock(WaterObject.class);
WaterObject t2 = Mockito.mock(WaterObject.class);
model.replaceFeature(t1, t2);
......@@ -564,23 +521,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceCityFurniture() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
CityFurniture cf1 = Mockito.mock(CityFurniture.class);
Mockito.when(cf1.getGmlId()).thenReturn(new GmlId("cf1"));
CityFurniture cf2 = Mockito.mock(CityFurniture.class);
Mockito.when(cf2.getGmlId()).thenReturn(new GmlId("cf2"));
model.addCityFurniture(cf1);
assertEquals(cf1, model.getCityFurniture().get(0));
assertEquals(cf1, model.getCityFurniture().toList().get(0));
model.replaceFeature(cf1, cf2);
assertEquals(cf2, model.getCityFurniture().get(0));
assertEquals(1, model.getCityFurniture().size());
assertEquals(cf2, model.getCityFurniture().toList().get(0));
assertEquals(1, model.getCityFurniture().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceCityFurnitureMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
CityFurniture cf1 = Mockito.mock(CityFurniture.class);
CityFurniture cf2 = Mockito.mock(CityFurniture.class);
model.replaceFeature(cf1, cf2);
......@@ -588,23 +542,20 @@ public class CityDoctorModelTest {
@Test
public void testReplaceGenericCityObject() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
GenericCityObject gco1 = Mockito.mock(GenericCityObject.class);
Mockito.when(gco1.getGmlId()).thenReturn(new GmlId("gco1"));
GenericCityObject gco2 = Mockito.mock(GenericCityObject.class);
model.addGenericCityObject(gco1);
assertEquals(gco1, model.getGenericCityObjects().get(0));
Mockito.when(gco2.getGmlId()).thenReturn(new GmlId("gco2"));
model.addOtherCityObject(gco1);
assertEquals(gco1, model.getOtherCityObjects().toList().get(0));
model.replaceFeature(gco1, gco2);
assertEquals(gco2, model.getGenericCityObjects().get(0));
assertEquals(1, model.getGenericCityObjects().size());
assertEquals(gco2, model.getOtherCityObjects().toList().get(0));
assertEquals(1, model.getOtherCityObjects().toList().size());
}
@Test(expected = IllegalStateException.class)
public void testReplaceGenericCityObjectMissing() {
File f = Mockito.mock(File.class);
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = new CityDoctorModel(config, f);
GenericCityObject gco1 = Mockito.mock(GenericCityObject.class);
GenericCityObject gco2 = Mockito.mock(GenericCityObject.class);
model.replaceFeature(gco1, gco2);
......
......@@ -16,7 +16,7 @@ public class CompositePolygonTest {
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel m = CityGmlParser.parseCityGmlFile("src/test/resources/FZK_haus.gml", config);
Building b = m.getBuildings().get(0);
Building b = m.getBuildings().toList().get(0);
assertNotNull(b);
assertFalse(b.getBoundarySurfaces().isEmpty());
for (BoundarySurface bs : b.getBoundarySurfaces()) {
......
......@@ -96,7 +96,7 @@ public class GeometryTest {
public void testRemovePolygonConcreteWithLink() {
ParserConfiguration config = new ParserConfiguration(4, false);
AbstractConstructionSurface abs = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, abs);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, abs);
var gmlBi = new org.citygml4j.core.model.building.BuildingInstallation();
Installation bi = new Installation();
bi.setGmlObject(gmlBi);
......@@ -133,7 +133,7 @@ public class GeometryTest {
public void testRemovePolygonOnlyConcrete() {
ParserConfiguration config = new ParserConfiguration(4, false);
AbstractConstructionSurface abs = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, abs);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, abs);
Geometry geom = new Geometry(GeometryType.MULTI_SURFACE, Lod.LOD2, Orientation.OUTWARD);
ConcretePolygon p = new ConcretePolygon();
......@@ -156,7 +156,7 @@ public class GeometryTest {
public void testRemovePolygonLinked() {
ParserConfiguration config = new ParserConfiguration(4, false);
AbstractConstructionSurface abs = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, abs);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, abs);
var gmlBi = new org.citygml4j.core.model.building.BuildingInstallation();
Installation bi = new Installation();
bi.setGmlObject(gmlBi);
......@@ -193,7 +193,7 @@ public class GeometryTest {
public void testReplacePolygon() {
ParserConfiguration config = new ParserConfiguration(4, false);
AbstractConstructionSurface abs = new WallSurface();
BoundarySurface bs = new BoundarySurface(SurfaceFeatureType.BUILDING, BoundarySurfaceType.WALL, abs);
BoundarySurface bs = new BoundarySurface(BoundarySurfaceType.WALL, abs);
var gmlBi = new org.citygml4j.core.model.building.BuildingInstallation();
Installation bi = new Installation();
bi.setGmlObject(gmlBi);
......
......@@ -26,7 +26,6 @@ import static org.mockito.Mockito.mock;
public class VegetationTest {
//TODO: Recreate geometries tests
@Test
public void testContainsError() {
......
......@@ -63,20 +63,20 @@ public class FeatureMapperTest {
public void testVisitWaterBody() {
WaterBody body = new WaterBody();
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(mock(ParserConfiguration.class),
new File("").toPath());
new File("").toPath(), false);
mapper.visit(body);
assertEquals(1, mapper.getModel().getWater().size());
assertEquals(1, mapper.getModel().getWater().toList().size());
body.setId("test1");
mapper.visit(body);
assertEquals(2, mapper.getModel().getWater().size());
WaterObject waterObject = mapper.getModel().getWater().get(1);
assertEquals(2, mapper.getModel().getWater().toList().size());
WaterObject waterObject = mapper.getModel().getWater().toList().get(1);
assertEquals("test1", waterObject.getGmlId().getGmlString());
body.getDeprecatedProperties().setLod1MultiSurface(createDummyMsp());
mapper.visit(body);
assertEquals(3, mapper.getModel().getWater().size());
assertEquals(3, mapper.getModel().getWater().toList().size());
assertNull(body.getDeprecatedProperties().getLod1MultiSurface());
Geometry geometry = mapper.getModel().getWater().get(2).getGeometries().get(0);
Geometry geometry = mapper.getModel().getWater().toList().get(2).getGeometries().get(0);
assertEquals(1, geometry.getPolygons().size());
assertEquals(Lod.LOD1, geometry.getLod());
assertEquals(GeometryType.MULTI_SURFACE, geometry.getType());
......@@ -86,7 +86,7 @@ public class FeatureMapperTest {
public void testVisitPlantCover() {
PlantCover cover = new PlantCover();
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(mock(ParserConfiguration.class),
new File("").toPath());
new File("").toPath(), false);
mapper.visit(cover);
}
......@@ -124,12 +124,12 @@ public class FeatureMapperTest {
body.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
ParserConfiguration config = new ParserConfiguration(8, false);
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(config, folder.newFile().toPath());
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(config, folder.newFile().toPath(), false);
mapper.visit(body);
CityDoctorModel model = mapper.getModel();
assertEquals(1, model.getWater().size());
WaterObject waterObject = model.getWater().get(0);
assertEquals(1, model.getWater().toList().size());
WaterObject waterObject = model.getWater().toList().get(0);
Geometry geometry = waterObject.getGeometries().get(0);
assertEquals(1, geometry.getVertices().size());
Vertex vertex = geometry.getVertices().get(0);
......@@ -152,12 +152,12 @@ public class FeatureMapperTest {
body.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
ParserConfiguration config = new ParserConfiguration(8, false);
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(config, folder.newFile().toPath());
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(config, folder.newFile().toPath(), false);
mapper.visit(body);
CityDoctorModel model = mapper.getModel();
assertEquals(1, model.getWater().size());
WaterObject waterObject = model.getWater().get(0);
assertEquals(1, model.getWater().toList().size());
WaterObject waterObject = model.getWater().toList().get(0);
Geometry geometry = waterObject.getGeometries().get(0);
assertEquals(2, geometry.getVertices().size());
Vertex vertex = geometry.getVertices().get(0);
......@@ -199,12 +199,12 @@ public class FeatureMapperTest {
body.getDeprecatedProperties().setLod1MultiSurface(new MultiSurfaceProperty(ms));
ParserConfiguration config = new ParserConfiguration(8, false);
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(config, folder.newFile().toPath());
Citygml3FeatureMapper mapper = new Citygml3FeatureMapper(config, folder.newFile().toPath(), false);
mapper.visit(body);
CityDoctorModel model = mapper.getModel();
assertEquals(1, model.getWater().size());
WaterObject waterObject = model.getWater().get(0);
assertEquals(1, model.getWater().toList().size());
WaterObject waterObject = model.getWater().toList().get(0);
Geometry geometry = waterObject.getGeometries().get(0);
assertEquals(7, geometry.getVertices().size());
assertEquals(8, geometry.getEdges().size());
......
......@@ -49,7 +49,7 @@ public class CityGml3ParserTest {
ParserConfiguration config = new ParserConfiguration(8, false);
CityDoctorModel model = CityGmlParser.parseCityGmlFile("src/test/resources/SimpleSolid_SrefBS.gml", config);
assertNotNull(model);
List<Building> buildings = model.getBuildings();
List<Building> buildings = model.getBuildings().toList();
assertEquals(1, buildings.size());
Building building = buildings.get(0);
assertEquals("_Simple_BD.1", building.getGmlId().getGmlString());
......
package de.hft.stuttgart.citydoctor2.zip;
import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class ZipTest {
ParserConfiguration config = new ParserConfiguration(8, false);
@Test
public void testUnzipping() throws MalformedZipFileException {
CityGmlZipArchive cgmlArch = CityGmlZipArchive.register("src/test/resources/zip/mock_archive.zip");
assertNotNull(cgmlArch);
cgmlArch.mountArchive(config);
checkMockArchive(cgmlArch);
}
private void checkMockArchive(CityGmlZipArchive cgmlArch) {
assertEquals(5, cgmlArch.getEntries().size());
for (CityGmlZipEntry entry : cgmlArch.getEntries()) {
assertNotNull(entry);
assertTrue(entry.getEntrySubPath().matches("^mock[1-5].gml$"));
assertNull(entry.getErrorType());
assertNotNull(entry.getModel());
assertEquals(1, entry.getModel().getNumberOfFeatures());
}
}
@Test
public void testZipping() throws IOException {
CityGmlZipArchive cgmlArch = CityGmlZipArchive.register("src/test/resources/zip/mock_archive.zip");
assertNotNull(cgmlArch);
cgmlArch.mountArchive(config);
Path tmpDir = null;
try {
tmpDir = Files.createTempDirectory("testTmp");
tmpDir.toFile().deleteOnExit();
String expPath = tmpDir + "/export.zip";
cgmlArch.exportToZipFile(expPath);
CityGmlZipArchive cgmlExport = CityGmlZipArchive.register(expPath);
assertNotNull(cgmlExport);
cgmlExport.mountArchive(config);
checkMockArchive(cgmlExport);
} finally {
if (tmpDir != null) {
FileUtils.deleteDirectory(tmpDir.toFile());
}
}
}
@Test
public void testEpsgParsing() throws MalformedZipFileException {
CityGmlZipArchive cgmlArch = CityGmlZipArchive.register("src/test/resources/zip/epsg.zip");
assertNotNull(cgmlArch);
cgmlArch.mountArchive(config);
CityGmlZipEntry entry = cgmlArch.getEntry("epsg1.gml");
assertNotNull(entry);
String srsName = entry.getModel().getCityModel().getBoundedBy().getEnvelope().getSrsName().split(":")[6];
assertEquals("25832", srsName);
entry = cgmlArch.getEntry("epsg2.gml");
assertNotNull(entry);
srsName = entry.getModel().getCityModel().getBoundedBy().getEnvelope().getSrsName().split(":")[6];
assertEquals("7415", srsName);
}
@Test
public void testXMLValidation() throws MalformedZipFileException {
ParserConfiguration valConfig = new ParserConfiguration(8, true);
CityGmlZipArchive cgmlArch = CityGmlZipArchive.register("src/test/resources/zip/validate.zip");
assertNotNull(cgmlArch);
cgmlArch.mountArchive(valConfig);
assertNull(cgmlArch.getEntry("valCorrect.gml").getErrorType());
assertEquals(ZipEntryErrorType.INVALID_CITY_GML_FILE, cgmlArch.getEntry("valFaulty.gml").getErrorType());
}
@Test
public void testImplicitParsing() throws MalformedZipFileException {
CityGmlZipArchive cgmlArch = CityGmlZipArchive.register("src/test/resources/zip/implicit.zip");
assertNotNull(cgmlArch);
cgmlArch.mountArchive(config);
CityDoctorModel mainModel = cgmlArch.getEntry("Main_model.gml").getModel();
assertEquals(18, mainModel.getGenericCityObjects().size());
}
}
<?xml version="1.0" encoding="utf-8"?>
<!-- Exported with 3DIS GmbH (https://www.3dis.de) CityEditor 2.26.2.0 -->
<!-- Date: 2023-02-20 13:26:02 +0100 ModelName: unnamed ModelPath: S:\PUBLICATIONS\2023-05-09-Lindau\Daten\CityGML-3-0\Buildings\FZK-Haus-Storey\FZK-Haus-LoD2-Texture-CG30-V01.skp -->
<!-- This CityGML model is made for testing CityGML Version 3.0 by KHH from the Institut for Automation and Applied Informatics (IAI) at Karlsruhe Institute of Technology (KIT) -->
<!-- If you use this CityGML model for publication, please refer to the Institut for Automation and Applied Informatics (IAI) at Karlsruhe Institute of Technology (KIT) -->
<!-- This model is made using Sketchup with CityEditor (3DIS GmbH), CityGML-Tools (VCS) and manual work -->
<!-- 2023-04-28 KHH / IAI Mannually converted to CityGML 3.0 -->
<core:CityModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:con="http://www.opengis.net/citygml/construction/3.0"
xmlns:core="http://www.opengis.net/citygml/3.0" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:bldg="http://www.opengis.net/citygml/building/3.0"
xmlns:app="http://www.opengis.net/citygml/appearance/3.0"
xmlns:gen="http://www.opengis.net/citygml/generics/3.0" xmlns:xAL="urn:oasis:names:tc:ciq:xal:3"
xsi:schemaLocation="http://www.opengis.net/citygml/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/core.xsd
http://www.opengis.net/citygml/appearance/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/appearance.xsd
http://www.opengis.net/citygml/bridge/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/bridge.xsd
http://www.opengis.net/citygml/building/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/building.xsd
http://www.opengis.net/citygml/cityfurniture/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/cityFurniture.xsd
http://www.opengis.net/citygml/cityobjectgroup/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/cityObjectGroup.xsd
http://www.opengis.net/citygml/generics/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/generics.xsd
http://www.opengis.net/citygml/landuse/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/landUse.xsd
http://www.opengis.net/citygml/relief/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/relief.xsd
http://www.opengis.net/citygml/transportation/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/transportation.xsd
http://www.opengis.net/citygml/tunnel/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/tunnel.xsd
http://www.opengis.net/citygml/vegetation/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/vegetation.xsd
http://www.opengis.net/citygml/waterbody/3.0 https://sdm-web.cloud.iai.kit.edu/CityGML-3-0/Schema/waterBody.xsd">
<gml:name>FZK-Haus</gml:name>
<gml:boundedBy>
<gml:Envelope srsName="EPSG:25832" srsDimension="3">
<gml:lowerCorner>458900.0 5438785.0 113.5</gml:lowerCorner>
<gml:upperCorner>458912.0 5438795.0 120.017691</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<core:cityObjectMember>
<bldg:Building gml:id="KIT-Test-Building-01">
<gml:description>KIT Test Building FZK-Haus adapted for CityGML 3.0</gml:description>
<gml:name>KIT Test Building FZK-Haus for CityGML 3.0</gml:name>
<core:genericAttribute>
<gen:StringAttribute>
<gen:name>@cityeditor:layer</gen:name>
<gen:value>LoD2-Ausgeblendet</gen:value>
</gen:StringAttribute>
</core:genericAttribute>
<core:lod2Solid>
<gml:Solid>
<gml:exterior>
<gml:Shell>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.nfWbzHM5j2MqtisYAjgV"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.B9OH2yr4U3AkPsKWbFy2"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.ioJ6HX4PnhWvLSYhPA7h"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.VdnPNlkOAJHnTVZL5R37"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.as933cYedpVOQ8Wqm9j7"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.cdHLpEJXgkf3Hq9x6PF7"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.CUXCVrNXAnCgCUjdXnY1"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.WH3ZPoThoidUosBGLd28"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.8Oi6zRMGuUdvjDA3942O"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.87LG6xx5gYYjprCeHCDY"> </gml:surfaceMember>
<gml:surfaceMember
xlink:href="#KIT-Test-Building-01_PG.Y4DuK1eWWjbSOQxjL75Z"
> </gml:surfaceMember>
</gml:Shell>
</gml:exterior>
</gml:Solid>
</core:lod2Solid>
<con:conditionOfConstruction>projected</con:conditionOfConstruction>
<con:height>
<con:Height>
<con:highReference>highestRoofEdge</con:highReference>
<con:lowReference>lowestGroundPoint</con:lowReference>
<con:status>measured</con:status>
<con:value uom="urn:adv:uom:m">6.52</con:value>
</con:Height>
</con:height>
<con:occupancy>
<core:Occupancy>
<core:numberOfOccupants>2</core:numberOfOccupants>
</core:Occupancy>
</con:occupancy>
<bldg:buildingSubdivision>
<bldg:Storey>
<gml:name>Ground Floor</gml:name>
<core:boundary>
<con:GroundSurface>
<gml:name>Ground</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.B9OH2yr4U3AkPsKWbFy2">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3"> 458912.0 5438785.0
113.5 458900.0 5438785.0 113.5 458900.0 5438795.0
113.5 458912.0 5438795.0 113.5 458912.0 5438785.0
113.5 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:GroundSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Ground Floor / Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.WH3ZPoThoidUosBGLd28">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.kb6UBRDjXdQhuZgyrrXF">
<gml:posList srsDimension="3"> 458912.0 5438795.0
113.5 458912.0 5438795.0 116.4 458912.0 5438785.0
116.4 458912.0 5438785.0 113.5 458912.0 5438795.0
113.5 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Ground Floor / Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.8Oi6zRMGuUdvjDA3942O">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.dQRaAbGZocTDsiXUS3Wo">
<gml:posList srsDimension="3"> 458912.0 5438785.0
113.5 458912.0 5438785.0 116.4 458900.0 5438785.0
116.4 458900.0 5438785.0 113.5 458912.0 5438785.0
113.5 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Ground Floor / Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.87LG6xx5gYYjprCeHCDY">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.z42J72DCA0DG7fsjO1iJ">
<gml:posList srsDimension="3"> 458900.0 5438785.0
113.5 458900.0 5438785.0 116.4 458900.0 5438795.0
116.4 458900.0 5438795.0 113.5 458900.0 5438785.0
113.5 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Ground Floor / Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.Y4DuK1eWWjbSOQxjL75Z">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.CvfxHmYhr7DvEJeZnfKH">
<gml:posList srsDimension="3"> 458900.0 5438795.0
113.5 458900.0 5438795.0 116.4 458912.0 5438795.0
116.4 458912.0 5438795.0 113.5 458900.0 5438795.0
113.5 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C">
<gml:name>02 Ground Floor - Kitchen</gml:name>
<core:boundary>
<core:ClosureSurface>
<gml:name>Ground Floor / Kitchen / Closure Surface North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.HDg32RNpWPKMVUcmzWlH">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695
5438789.01 116.2 458903.8 5438789.01 116.2
458903.8 5438789.01 113.7 458904.695 5438789.01
113.7 458904.695 5438789.01 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</core:ClosureSurface>
</core:boundary>
<core:boundary>
<core:ClosureSurface>
<gml:name>Ground Floor / Kitchen / Closure Surface East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.h1lSemSyhjPbSya7pg52">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695
5438789.01 116.2 458904.695 5438789.01 113.7
458904.695 5438785.3 113.7 458904.695 5438785.3
116.2 458904.695 5438789.01 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</core:ClosureSurface>
</core:boundary>
<core:boundary>
<con:CeilingSurface>
<gml:name>Ground Floor / Kitchen / Ceiling</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.LQ2c1FrzBD3S1F1ZULYR">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438785.3
116.2 458900.3 5438789.01 116.2 458903.8
5438789.01 116.2 458904.695 5438789.01 116.2
458904.695 5438785.3 116.2 458900.3 5438785.3
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Kitchen / Interior Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.4wy6a0dmvxybhb3QrHf6">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438785.3
116.2 458900.3 5438785.3 113.7 458900.3 5438789.01
113.7 458900.3 5438789.01 116.2 458900.3 5438785.3
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Kitchen / Interior Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.3mYYx1afWs6KeCCJ9gVM">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695 5438785.3
116.2 458904.695 5438785.3 113.7 458900.3
5438785.3 113.7 458900.3 5438785.3 116.2
458904.695 5438785.3 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Kitchen / Interior Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.opgbxC1uQdXkQuNtZf1V">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438789.01
113.7 458903.8 5438789.01 113.7 458903.8
5438789.01 116.2 458900.3 5438789.01 116.2
458900.3 5438789.01 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Ground Floor / Kitchen / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yW3mEChk0gvSkdeU7G3C_PG.avFqXdbSjQLDHP36SuyA">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438789.01
113.7 458900.3 5438789.01 113.7 458900.3 5438785.3
113.7 458904.695 5438785.3 113.7 458904.695
5438789.01 113.7 458903.8 5438789.01
113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z">
<gml:name>03 Ground Floor - Corridor</gml:name>
<core:boundary>
<core:ClosureSurface>
<gml:name>Ground Floor / Corridor / Closure Surface South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.nqPs4tcxPaS3p6OZw2JR">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.41 5438789.01
113.7 458904.695 5438789.01 113.7 458904.695
5438789.01 116.2 458907.41 5438789.01 116.2
458907.41 5438789.01 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</core:ClosureSurface>
</core:boundary>
<core:boundary>
<core:ClosureSurface>
<gml:name>Ground Floor / Corridor / Closure Surface South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.qg0s5acCsfhIfr6PB4Wq">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438789.01
116.2 458904.695 5438789.01 116.2 458904.695
5438789.01 113.7 458903.8 5438789.01 113.7
458903.8 5438789.01 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</core:ClosureSurface>
</core:boundary>
<core:boundary>
<con:CeilingSurface>
<gml:name>Ground Floor / Corridor / Ceiling</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.3JAm3zajWz8Rynn4jCYp">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438789.25
116.2 458900.3 5438789.25 116.2 458900.3
5438790.75 116.2 458907.41 5438790.75 116.2
458907.41 5438789.01 116.2 458904.695 5438789.01
116.2 458903.8 5438789.01 116.2 458903.8
5438789.25 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Corridor / Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.JflNuIX7gp1oMxUXGW8Y">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.41 5438790.75
116.2 458907.41 5438790.75 113.7 458907.41
5438789.01 113.7 458907.41 5438789.01 116.2
458907.41 5438790.75 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Corridor / Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.ALQ0ACBrfU0RLMnmcma7">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438790.75
113.7 458907.41 5438790.75 113.7 458907.41
5438790.75 116.2 458900.3 5438790.75 116.2
458900.3 5438790.75 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Corridor / Wall West I</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.B3YW3ludzkRW2rTyzqaL">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438789.25
113.7 458900.3 5438790.75 113.7 458900.3
5438790.75 116.2 458900.3 5438789.25 116.2
458900.3 5438789.25 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Corridor / Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.AvVrIqiQJpKsdHwXCgRR">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438789.25
113.7 458900.3 5438789.25 113.7 458900.3
5438789.25 116.2 458903.8 5438789.25 116.2
458903.8 5438789.25 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Corridor / Wall West II </gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.otBjqVnvyltlHrGgaE9a">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438789.01
113.7 458903.8 5438789.25 113.7 458903.8
5438789.25 116.2 458903.8 5438789.01 116.2
458903.8 5438789.01 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Ground Floor / Corridor / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.duiY1tKGgRCVPb6UyU7Z_PG.2GqEiZO40CFLu1hUeFDW">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438789.01
113.7 458904.695 5438789.01 113.7 458907.41
5438789.01 113.7 458907.41 5438790.75 113.7
458900.3 5438790.75 113.7 458900.3 5438789.25
113.7 458903.8 5438789.25 113.7 458903.8
5438789.01 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG">
<gml:name>04 Ground Floor - Living Room</gml:name>
<core:boundary>
<core:ClosureSurface>
<gml:name>Ground Floor / Living Room / Closure Surface West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.DHvu37iMnMUf6fRRZJDx">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695 5438785.3
116.2 458904.695 5438785.3 113.7 458904.695
5438789.01 113.7 458904.695 5438789.01 116.2
458904.695 5438785.3 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</core:ClosureSurface>
</core:boundary>
<core:boundary>
<core:ClosureSurface>
<gml:name>Ground Floor / Living Room / Closure Surface North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.GTyC4CgGGJCAHGWCrfaU">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695
5438789.01 113.7 458907.41 5438789.01 113.7
458907.41 5438789.01 116.2 458904.695 5438789.01
116.2 458904.695 5438789.01 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</core:ClosureSurface>
</core:boundary>
<core:boundary>
<con:CeilingSurface>
<gml:name>Ground Floor / Living Room / Ceiling</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.9D1bOyQRA7KFEpsi1Hjr">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695
5438789.01 116.2 458907.41 5438789.01 116.2
458911.7 5438789.01 116.2 458911.7 5438785.3 116.2
458904.695 5438785.3 116.2 458904.695 5438789.01
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Living Room / Interior Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.OIMEC4yqF8TyKbGa3bjv">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438789.01
116.2 458907.41 5438789.01 116.2 458907.41
5438789.01 113.7 458911.7 5438789.01 113.7
458911.7 5438789.01 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Living Room / Interior Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.jQaBBkJMFLl7D0JzhfXk">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438785.3
116.2 458911.7 5438785.3 113.7 458904.695
5438785.3 113.7 458904.695 5438785.3 116.2
458911.7 5438785.3 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Living Room / Interior Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.H8M9QNeJCUq5HlnwK4K0">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438789.01
116.2 458911.7 5438789.01 113.7 458911.7 5438785.3
113.7 458911.7 5438785.3 116.2 458911.7 5438789.01
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Ground Floor / Living Room / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.Op5veFsmiFULpCjDeSwG_PG.BJcZsFiOyU6A9c1XO6p4">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.695 5438785.3
113.7 458911.7 5438785.3 113.7 458911.7 5438789.01
113.7 458907.41 5438789.01 113.7 458904.695
5438789.01 113.7 458904.695 5438785.3
113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA">
<gml:name>05 Ground Floor - Bedroom</gml:name>
<core:boundary>
<con:CeilingSurface>
<gml:name>Ground Floor / Bedroom / Ceiling</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA_PG.OyFIcm7RArOIL1LdXwtq">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438789.25
116.2 458907.65 5438789.25 116.2 458907.65
5438794.7 116.2 458911.7 5438794.7 116.2 458911.7
5438789.25 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bedroom / Interior Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA_PG.95irT11n4ZgMiX2q4250">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.65 5438789.25
116.2 458907.65 5438789.25 113.7 458907.65
5438794.7 113.7 458907.65 5438794.7 116.2
458907.65 5438789.25 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bedroom / Interior Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA_PG.9t7FtD4sXx9ALWHmlDtS">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438789.25
116.2 458911.7 5438789.25 113.7 458907.65
5438789.25 113.7 458907.65 5438789.25 116.2
458911.7 5438789.25 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bedroom / Interior Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA_PG.BxBfyPe1b1miAWxEeLnW">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.65 5438794.7
116.2 458907.65 5438794.7 113.7 458911.7 5438794.7
113.7 458911.7 5438794.7 116.2 458907.65 5438794.7
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bedroom / Interior Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA_PG.RcepErHZFrkQD6M3yjKg">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438794.7
116.2 458911.7 5438794.7 113.7 458911.7 5438789.25
113.7 458911.7 5438789.25 116.2 458911.7 5438794.7
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Ground Floor / Bedroom / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.woCShAp7GrZQRRPhEnlA_PG.Eys5xIoR03TkxIj9vTk1">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438789.25
113.7 458911.7 5438794.7 113.7 458907.65 5438794.7
113.7 458907.65 5438789.25 113.7 458911.7
5438789.25 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W">
<gml:name>06 Ground Floor - Bathroom</gml:name>
<core:boundary>
<con:CeilingSurface>
<gml:name>Ground Floor / Bathroom / Ceiling</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W_PG.wbld7fzImYe8NWrZcGRY">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.41 5438790.99
116.2 458904.04 5438790.99 116.2 458904.04
5438794.7 116.2 458907.41 5438794.7 116.2
458907.41 5438790.99 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bathroom / Interior Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W_PG.uUYnQpymZNNZmWGwOZfy">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.04 5438790.99
116.2 458904.04 5438790.99 113.7 458904.04
5438794.7 113.7 458904.04 5438794.7 116.2
458904.04 5438790.99 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bathroom / Interior Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W_PG.OrC8rOQfwZzlZoSOCFlx">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.41 5438790.99
116.2 458907.41 5438790.99 113.7 458904.04
5438790.99 113.7 458904.04 5438790.99 116.2
458907.41 5438790.99 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bathroom / Interior Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W_PG.nVLVnQvjY4Gi9GmQs19d">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458904.04 5438794.7
116.2 458904.04 5438794.7 113.7 458907.41
5438794.7 113.7 458907.41 5438794.7 116.2
458904.04 5438794.7 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Bathroom / Interior Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W_PG.8AXQPYriLaYYGfwI2w7d">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.41 5438794.7
116.2 458907.41 5438794.7 113.7 458907.41
5438790.99 113.7 458907.41 5438790.99 116.2
458907.41 5438794.7 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Ground Floor / Bathroom / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.AfxdvkCh4we3s3I4Dy4W_PG.mr7MWYpWAyS3j0YfB27d">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458907.41 5438790.99
113.7 458907.41 5438794.7 113.7 458904.04
5438794.7 113.7 458904.04 5438790.99 113.7
458907.41 5438790.99 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL">
<gml:name>07 Ground Floor - Office</gml:name>
<core:boundary>
<con:CeilingSurface>
<gml:name>Ground Floor / Office / Ceiling</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL_PG.CsTLhL534vWs7g0e1aTh">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438790.99
116.2 458900.3 5438790.99 116.2 458900.3 5438794.7
116.2 458903.8 5438794.7 116.2 458903.8 5438790.99
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Office / Interior Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL_PG.rIbl0lq2kSGyKbzXloFX">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438790.99
116.2 458900.3 5438790.99 113.7 458900.3 5438794.7
113.7 458900.3 5438794.7 116.2 458900.3 5438790.99
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Office / Interior Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL_PG.0BJ7pQ8ZNJTgMEdPP3hB">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438790.99
116.2 458903.8 5438790.99 113.7 458900.3
5438790.99 113.7 458900.3 5438790.99 116.2
458903.8 5438790.99 116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Office / Interior Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL_PG.b6Nl2FrZvZc3YYCRlfjO">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438794.7
116.2 458900.3 5438794.7 113.7 458903.8 5438794.7
113.7 458903.8 5438794.7 116.2 458900.3 5438794.7
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Ground Floor / Office / Interior Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL_PG.bF2t5nIuHqZao3PVpgVl">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438794.7
116.2 458903.8 5438794.7 113.7 458903.8 5438790.99
113.7 458903.8 5438790.99 116.2 458903.8 5438794.7
116.2</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Ground Floor / Office / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.yVH3lRCjUIBvv88usXTL_PG.eeylEeI5HrDpBEX6feEv">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458903.8 5438790.99
113.7 458903.8 5438794.7 113.7 458900.3 5438794.7
113.7 458900.3 5438790.99 113.7 458903.8
5438790.99 113.7</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
</bldg:Storey>
</bldg:buildingSubdivision>
<bldg:buildingSubdivision>
<bldg:Storey>
<gml:name>Second Floor</gml:name>
<core:boundary>
<con:RoofSurface>
<gml:name>Second Floor / Roof South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.as933cYedpVOQ8Wqm9j7">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.FJ2G4jJFUVmWcdGG3gyw">
<gml:posList srsDimension="3"> 458912.0 5438790.0
120.017691 458900.0 5438790.0 120.017691 458900.0
5438785.0 117.13094 458912.0 5438785.0 117.13094
458912.0 5438790.0 120.017691 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:RoofSurface>
</core:boundary>
<core:boundary>
<con:RoofSurface>
<gml:name>Second Floor / Roof North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.CUXCVrNXAnCgCUjdXnY1">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.cYvvi9l6K4nl9jeHjt03">
<gml:posList srsDimension="3"> 458900.0 5438790.0
120.017691 458912.0 5438790.0 120.017691 458912.0
5438795.0 117.13094 458900.0 5438795.0 117.13094
458900.0 5438790.0 120.017691 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:RoofSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Second Floor / Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.nfWbzHM5j2MqtisYAjgV">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.l5vPQsQlvAxe0PfGrItK">
<gml:posList srsDimension="3"> 458900.0 5438785.0
117.13094 458900.0 5438785.0 116.4 458912.0
5438785.0 116.4 458912.0 5438785.0 117.13094
458900.0 5438785.0 117.13094 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Second Floor / Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.VdnPNlkOAJHnTVZL5R37">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.CWPcEAowucw9pxGFPH3S">
<gml:posList srsDimension="3"> 458900.0 5438795.0
117.13094 458900.0 5438795.0 116.4 458900.0
5438785.0 116.4 458900.0 5438785.0 117.13094
458900.0 5438790.0 120.017691 458900.0 5438795.0
117.13094 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Second Floor / Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.ioJ6HX4PnhWvLSYhPA7h">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.VpCnRrYqLGD4bFFZLmWC">
<gml:posList srsDimension="3"> 458912.0 5438785.0
117.13094 458912.0 5438785.0 116.4 458912.0
5438795.0 116.4 458912.0 5438795.0 117.13094
458912.0 5438790.0 120.017691 458912.0 5438785.0
117.13094 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<core:boundary>
<con:WallSurface>
<gml:name>Second Floor / Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="KIT-Test-Building-01_PG.cdHLpEJXgkf3Hq9x6PF7">
<gml:exterior>
<gml:LinearRing
gml:id="KIT-Test-Building-01_LR.ODQPptDGkQ9xxB6LArAA">
<gml:posList srsDimension="3"> 458912.0 5438795.0
117.13094 458912.0 5438795.0 116.4 458900.0
5438795.0 116.4 458900.0 5438795.0 117.13094
458912.0 5438795.0 117.13094 </gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:WallSurface>
</core:boundary>
<bldg:buildingRoom>
<bldg:BuildingRoom gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC">
<gml:name>01 Second Floor - Galery</gml:name>
<core:boundary>
<con:CeilingSurface>
<gml:name>Second Floor / Galery / Ceiling North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.MrztnJe3cIqx0g03yvP8">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438794.7
117.073205 458911.7 5438794.7 117.073205 458911.7
5438790.0 119.786751 458900.3 5438790.0 119.786751
458900.3 5438794.7 117.073205</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:CeilingSurface>
<gml:name>Second Floor / Galery / Ceiling South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.dOu2It7QvIkAvQUT8eLp">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438785.3
117.073205 458900.3 5438790.0 119.786751 458911.7
5438790.0 119.786751 458911.7 5438785.3 117.073205
458900.3 5438785.3 117.073205</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:CeilingSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Second Floor / Galery / Interior Wall North</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.E6fMYbyqNfDDUJrvbM3a">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438794.7
116.4 458911.7 5438794.7 117.073205 458900.3
5438794.7 117.073205 458900.3 5438794.7 116.4
458911.7 5438794.7 116.4</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Second Floor / Galery / Interior Wall East</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.A7Fo8PEsLEyMB32PGMHq">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438794.7
117.073205 458911.7 5438794.7 116.4 458911.7
5438785.3 116.4 458911.7 5438785.3 117.073205
458911.7 5438790.0 119.786751 458911.7 5438794.7
117.073205</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Second Floor / Galery / Interior Wall West</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.yAt1pSqygx9MVsIQPGXO">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438790.0
119.786751 458900.3 5438785.3 117.073205 458900.3
5438785.3 116.4 458900.3 5438794.7 116.4 458900.3
5438794.7 117.073205 458900.3 5438790.0
119.786751</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:InteriorWallSurface>
<gml:name>Second Floor / Galery / Interior Wall South</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.lViHXUkDwidWS9ze3lOE">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458900.3 5438785.3
116.4 458900.3 5438785.3 117.073205 458911.7
5438785.3 117.073205 458911.7 5438785.3 116.4
458900.3 5438785.3 116.4</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:InteriorWallSurface>
</core:boundary>
<core:boundary>
<con:FloorSurface>
<gml:name>Second Floor / Galery / Floor</gml:name>
<core:lod2MultiSurface>
<gml:MultiSurface>
<gml:surfaceMember>
<gml:Polygon
gml:id="_Room-Objects-Surfaces_BD.1k0OduRPxnDi7ZvjVnPC_PG.hI0W1wCa6RYPDNx4Mj1A">
<gml:exterior>
<gml:LinearRing>
<gml:posList srsDimension="3">458911.7 5438785.3
116.4 458911.7 5438794.7 116.4 458900.3 5438794.7
116.4 458900.3 5438785.3 116.4 458911.7 5438785.3
116.4</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</core:lod2MultiSurface>
</con:FloorSurface>
</core:boundary>
</bldg:BuildingRoom>
</bldg:buildingRoom>
</bldg:Storey>
</bldg:buildingSubdivision>
</bldg:Building>
</core:cityObjectMember>
<core:appearanceMember>
<app:Appearance>
<app:surfaceData>
<app:ParameterizedTexture>
<app:imageURI>textures/FZK-Haus-Front.png</app:imageURI>
<app:wrapMode>wrap</app:wrapMode>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.nfWbzHM5j2MqtisYAjgV</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> -6.01592849610218e-17 1.000011046207786
-3.0079642480510886e-17 0.7987000468203478
1.0000000000000002 0.7987000468203478 1.0000000000000002
1.000011046207786 -6.01592849610218e-17
1.000011046207786</app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.l5vPQsQlvAxe0PfGrItK</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.8Oi6zRMGuUdvjDA3942O</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> 1.0000000000000002
-4.454490602082857e-31 1.0000000000000002 0.7987000468203478
-3.007964248051091e-17 0.7987000468203478 0.0
-5.359579389737923e-47 1.0000000000000002
-4.454490602082857e-31 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.dQRaAbGZocTDsiXUS3Wo</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
</app:ParameterizedTexture>
</app:surfaceData>
<app:surfaceData>
<app:ParameterizedTexture>
<app:imageURI>textures/FZK-Haus-Right.png</app:imageURI>
<app:wrapMode>wrap</app:wrapMode>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.ioJ6HX4PnhWvLSYhPA7h</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> 7.560328766851198e-17
0.5570891737385654 5.087501393878691e-16 0.444942234223729
1.0000000000000004 0.44494223422372897 1.0000000000000004
0.5570891737385655 0.49999999999999994 0.9999986887435715
7.560328766851198e-17 0.5570891737385654 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.VpCnRrYqLGD4bFFZLmWC</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.WH3ZPoThoidUosBGLd28</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> 1.0000000000000004
-2.907494171674344e-16 1.0000000000000004
0.44494223422372897 5.087501393878691e-16 0.444942234223729
7.560328766851198e-17 -2.907494171674344e-16
1.0000000000000004
-2.907494171674344e-16</app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.kb6UBRDjXdQhuZgyrrXF</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
</app:ParameterizedTexture>
</app:surfaceData>
<app:surfaceData>
<app:ParameterizedTexture>
<app:imageURI>textures/FZK-Haus-Left.png</app:imageURI>
<app:wrapMode>wrap</app:wrapMode>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.VdnPNlkOAJHnTVZL5R37</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> -1.0 0.5570891737385658
-0.9999999999999996 0.44494223422372936
4.331468517193571e-16 0.44494223422372936
4.331468517193571e-16 0.5570891737385657
-0.49999999999999944 0.9999986887435719 -1.0
0.5570891737385658 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.CWPcEAowucw9pxGFPH3S</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.87LG6xx5gYYjprCeHCDY</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> 4.331468517193571e-16
-1.1157709843049066e-47 4.331468517193571e-16
0.44494223422372936 -0.9999999999999996 0.44494223422372936
-1.0 -8.368282382286802e-48 4.331468517193571e-16
-1.1157709843049066e-47 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.z42J72DCA0DG7fsjO1iJ</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
</app:ParameterizedTexture>
</app:surfaceData>
<app:surfaceData>
<app:ParameterizedTexture>
<app:imageURI>textures/Roofing_Shingles_GAF_Estates.jpg</app:imageURI>
<app:wrapMode>wrap</app:wrapMode>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.as933cYedpVOQ8Wqm9j7</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> 21.47458840372227 18.00558453022584
1.8506199769767277e-15 18.00558453022584
-1.2918958832001822e-15 4.124469685250767 21.47458840372227
4.124469685250767 21.47458840372227 18.00558453022584 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.FJ2G4jJFUVmWcdGG3gyw</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.CUXCVrNXAnCgCUjdXnY1</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> -2.0055287249601352e-15
-2.816087737236785 -21.47458840372227 -2.816087737236785
-21.47458840372227 -16.697202582211872
1.8024740244805496e-15 -16.697202582211872
-2.0055287249601352e-15 -2.816087737236785 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.cYvvi9l6K4nl9jeHjt03</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
</app:ParameterizedTexture>
</app:surfaceData>
<app:surfaceData>
<app:ParameterizedTexture>
<app:imageURI>textures/FZK-Haus-Back.png</app:imageURI>
<app:wrapMode>wrap</app:wrapMode>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.cdHLpEJXgkf3Hq9x6PF7</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> -1.0000000000000002 1.000011046207795
-1.0000000000000002 0.7987000468203566
2.7071678232459823e-16 0.7987000468203567
3.007964248051091e-16 1.000011046207795 -1.0000000000000002
1.000011046207795 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.ODQPptDGkQ9xxB6LArAA</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
<app:textureParameterization>
<app:TextureAssociation>
<app:target>#KIT-Test-Building-01_PG.Y4DuK1eWWjbSOQxjL75Z</app:target>
<app:textureParameterization>
<app:TexCoordList>
<app:textureCoordinates> 3.0079642480510913e-16
-1.4416909618544142e-15 2.707167823245983e-16
0.7987000468203463 -1.0000000000000002 0.7987000468203463
-1.0000000000000002 -1.4416909618544138e-15
3.0079642480510913e-16 -1.4416909618544142e-15 </app:textureCoordinates>
<app:ring>#KIT-Test-Building-01_LR.CvfxHmYhr7DvEJeZnfKH</app:ring>
</app:TexCoordList>
</app:textureParameterization>
</app:TextureAssociation>
</app:textureParameterization>
</app:ParameterizedTexture>
</app:surfaceData>
<app:surfaceData>
<app:X3DMaterial>
<app:ambientIntensity>0.2</app:ambientIntensity>
<app:diffuseColor>0.4666666666666667 0.34509803921568627
0.21176470588235294</app:diffuseColor>
<app:emissiveColor>0.0 0.0 0.0</app:emissiveColor>
<app:specularColor>1.0 1.0 1.0</app:specularColor>
<app:shininess>0.2</app:shininess>
<app:transparency>0.0</app:transparency>
<app:isSmooth>false</app:isSmooth>
<app:target>#KIT-Test-Building-01_PG.B9OH2yr4U3AkPsKWbFy2</app:target>
</app:X3DMaterial>
</app:surfaceData>
</app:Appearance>
</core:appearanceMember>
</core:CityModel>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment