Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
660255ab
Commit
660255ab
authored
Mar 13, 2025
by
Riegel
Browse files
Merge branch 'dev_gui_features_zip_loading' into 'dev'
TransportationObject model rework See merge request
!27
parents
2459496d
7c62b358
Pipeline
#11009
passed with stage
in 1 minute and 12 seconds
Changes
23
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
CHANGELOG.md
View file @
660255ab
...
...
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on
[
Keep a Changelog
](
https://keepachangelog.com/en/1.1.0/
)
,
and this project adheres to
[
Semantic Versioning
](
https://semver.org/spec/v2.0.0.html
)
.
## [3.17.0] (
TBD
)
## [3.17.0] (
2025-03-13
)
### Added
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java
View file @
660255ab
...
...
@@ -50,6 +50,7 @@ public class ConcretePolygon extends Polygon {
private
BoundarySurface
partOfSurface
;
private
Installation
partfOfInstallation
;
private
CompositeCollection
partOfComposite
=
null
;
private
PatchCollection
partOfPatch
=
null
;
private
Geometry
parent
;
private
LinkedPolygon
linkedFromPolygon
;
...
...
@@ -141,6 +142,18 @@ public class ConcretePolygon extends Polygon {
this
.
partOfComposite
=
comp
;
}
protected
void
setPartOfPatch
(
PatchCollection
pc
)
{
this
.
partOfPatch
=
pc
;
}
public
PatchCollection
getPartOfPatch
(
PatchCollection
pc
)
{
return
partOfPatch
;
}
public
boolean
isPatchMember
()
{
return
partOfPatch
!=
null
;
}
public
CompositeCollection
getPartOfComposite
()
{
return
partOfComposite
;
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java
0 → 100644
View file @
660255ab
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.ArrayList
;
import
java.util.List
;
public
final
class
PatchCollection
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
-
1748657379840997228L
;
private
List
<
ConcretePolygon
>
patchMembers
=
new
ArrayList
<>();
public
void
addPatchMember
(
ConcretePolygon
patchMember
)
{
patchMembers
.
add
(
patchMember
);
patchMember
.
setPartOfPatch
(
this
);
}
public
List
<
ConcretePolygon
>
getPatchMembers
()
{
return
new
ArrayList
<>(
patchMembers
);
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TopLevelTransportFeature.java
0 → 100644
View file @
660255ab
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.citygml4j.core.model.deprecated.transportation.TransportationComplex
;
import
org.citygml4j.core.model.transportation.Railway
;
import
org.citygml4j.core.model.transportation.Road
;
import
org.citygml4j.core.model.transportation.Square
;
import
org.citygml4j.core.model.transportation.Track
;
import
org.citygml4j.core.model.transportation.Waterway
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
TopLevelTransportFeature
extends
TransportationSpace
{
private
final
List
<
TransportSection
>
sections
=
new
ArrayList
<>();
private
final
List
<
TransportSection
>
intersections
=
new
ArrayList
<>();
public
static
TopLevelTransportFeature
from
(
Track
t
)
{
TopLevelTransportFeature
top
=
new
TopLevelTransportFeature
(
TransportationType
.
TRACK
);
top
.
setGmlObject
(
t
);
return
top
;
}
public
static
TopLevelTransportFeature
from
(
Road
r
)
{
TopLevelTransportFeature
top
=
new
TopLevelTransportFeature
(
TransportationType
.
ROAD
);
top
.
setGmlObject
(
r
);
return
top
;
}
public
static
TopLevelTransportFeature
from
(
Waterway
w
)
{
TopLevelTransportFeature
top
=
new
TopLevelTransportFeature
(
TransportationType
.
WATERWAY
);
top
.
setGmlObject
(
w
);
return
top
;
}
public
static
TopLevelTransportFeature
from
(
Railway
r
)
{
TopLevelTransportFeature
top
=
new
TopLevelTransportFeature
(
TransportationType
.
RAILWAY
);
top
.
setGmlObject
(
r
);
return
top
;
}
public
static
TopLevelTransportFeature
from
(
Square
s
)
{
TopLevelTransportFeature
top
=
new
TopLevelTransportFeature
(
TransportationType
.
SQUARE
);
top
.
setGmlObject
(
s
);
return
top
;
}
public
static
TopLevelTransportFeature
from
(
TransportationComplex
tc
)
{
TopLevelTransportFeature
top
=
new
TopLevelTransportFeature
(
TransportationType
.
TRANSPORTATION_COMPLEX
);
top
.
setGmlObject
(
tc
);
return
top
;
}
private
TopLevelTransportFeature
(
TransportationType
type
)
{
super
(
type
);
}
public
void
addSection
(
TransportSection
section
)
{
sections
.
add
(
section
);
}
public
void
addIntersection
(
TransportSection
section
)
{
intersections
.
add
(
section
);
}
public
List
<
TransportSection
>
getSections
()
{
return
sections
;
}
public
List
<
TransportSection
>
getIntersections
()
{
return
intersections
;
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
super
.
reCreateGeometries
(
factory
,
config
);
for
(
TransportSection
section
:
sections
)
{
section
.
reCreateGeometries
(
factory
,
config
);
}
for
(
TransportSection
section
:
intersections
)
{
section
.
reCreateGeometries
(
factory
,
config
);
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
TransportSection
section
:
sections
)
{
if
(
section
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
TransportSection
section
:
intersections
)
{
if
(
section
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
TransportSection
section
:
sections
)
{
section
.
clearAllContainedCheckResults
();
}
for
(
TransportSection
section
:
intersections
)
{
section
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
TransportSection
section
:
sections
)
{
section
.
collectContainedErrors
(
errors
);
}
for
(
TransportSection
section
:
intersections
)
{
section
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
TransportSection
section
:
sections
)
{
if
(
section
.
containsAnyError
())
{
return
true
;
}
}
for
(
TransportSection
section
:
intersections
)
{
if
(
section
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
TransportSection
section
:
sections
)
{
section
.
accept
(
c
);
}
for
(
TransportSection
section
:
intersections
)
{
section
.
accept
(
c
);
}
}
@Override
public
void
unsetGmlGeometries
()
{
super
.
unsetGmlGeometries
();
for
(
TransportSection
section
:
sections
)
{
section
.
unsetGmlGeometries
();
}
for
(
TransportSection
section
:
intersections
)
{
section
.
unsetGmlGeometries
();
}
}
@Override
public
CityObject
getTopLevelCityObject
()
{
return
this
;
}
@Override
public
String
toString
()
{
return
"TopLevelTransportFeature [id="
+
getGmlId
()
+
"]"
;
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
TransportSection
section
:
sections
)
{
section
.
prepareForChecking
();
}
for
(
TransportSection
section
:
intersections
)
{
section
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
TransportSection
section
:
sections
)
{
section
.
clearMetaInformation
();
}
for
(
TransportSection
section
:
intersections
)
{
section
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
for
(
TransportSection
section
:
sections
)
{
section
.
collectInstances
(
handler
);
}
for
(
TransportSection
section
:
intersections
)
{
section
.
collectInstances
(
handler
);
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
TransportationObject
originalTo
=
(
TransportationObject
)
original
;
for
(
TransportSection
section
:
sections
)
{
section
.
fillValues
(
originalTo
,
handler
);
}
for
(
TransportSection
section
:
intersections
)
{
section
.
fillValues
(
originalTo
,
handler
);
}
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
TopLevelTransportFeature
(
type
);
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficAreaObject.java
0 → 100644
View file @
660255ab
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
org.citygml4j.core.model.transportation.AuxiliaryTrafficArea
;
import
org.citygml4j.core.model.transportation.TrafficArea
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurface
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty
;
public
class
TrafficAreaObject
extends
TransportationObject
{
public
enum
TrafficAreaType
{
TRAFFIC_AREA
,
AUXILIARY_TRAFFIC_AREA
}
public
TrafficAreaObject
(
TrafficAreaType
trafficAreaType
)
{
if
(
trafficAreaType
==
TrafficAreaType
.
TRAFFIC_AREA
)
{
setType
(
TransportationType
.
TRAFFIC_AREA
);
}
else
{
setType
(
TransportationType
.
AUXILLIARY_TRAFFIC_AREA
);
}
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
switch
(
type
)
{
case
TRAFFIC_AREA:
TrafficArea
ta
=
(
TrafficArea
)
super
.
getGmlObject
();
setMultiSurfaceAccordingToLod
(
ta
,
ms
,
geom
.
getLod
());
break
;
case
AUXILLIARY_TRAFFIC_AREA:
AuxiliaryTrafficArea
ata
=
(
AuxiliaryTrafficArea
)
super
.
getGmlObject
();
setMultiSurfaceAccordingToLod
(
ata
,
ms
,
geom
.
getLod
());
break
;
}
}
else
{
throw
new
IllegalStateException
(
"Geometry in TransportationObject cannot be of type "
+
geom
.
getType
()
+
". Only MultiSurface allowed"
);
}
}
}
private
void
setMultiSurfaceAccordingToLod
(
AuxiliaryTrafficArea
ata
,
MultiSurface
ms
,
Lod
lod
)
{
switch
(
lod
)
{
case
LOD0:
ata
.
setLod0MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD1:
ata
.
setLod1MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
ata
.
setLod2MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
ata
.
setLod3MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD4:
ata
.
getDeprecatedProperties
().
setLod4MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
"cannot set geometry with LOD for AuxiliaryTrafficArea: "
+
lod
);
}
}
private
void
setMultiSurfaceAccordingToLod
(
TrafficArea
ta
,
MultiSurface
ms
,
Lod
lod
)
{
switch
(
lod
)
{
case
LOD0:
ta
.
setLod0MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD1:
ta
.
setLod1MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
ta
.
setLod2MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
ta
.
setLod3MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD4:
ta
.
getDeprecatedProperties
().
setLod4MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
"cannot set geometry with LOD for TrafficArea: "
+
lod
);
}
}
@Override
public
void
unsetGmlGeometries
()
{
switch
(
type
)
{
case
TRAFFIC_AREA:
TrafficArea
ta
=
(
TrafficArea
)
super
.
getGmlObject
();
ta
.
setLod2MultiSurface
(
null
);
ta
.
setLod3MultiSurface
(
null
);
ta
.
getDeprecatedProperties
().
setLod4MultiSurface
(
null
);
break
;
case
AUXILLIARY_TRAFFIC_AREA:
AuxiliaryTrafficArea
ata
=
(
AuxiliaryTrafficArea
)
super
.
getGmlObject
();
ata
.
setLod0MultiSurface
(
null
);
ata
.
setLod1MultiSurface
(
null
);
ata
.
setLod2MultiSurface
(
null
);
ata
.
setLod3MultiSurface
(
null
);
ata
.
getDeprecatedProperties
().
setLod4MultiSurface
(
null
);
break
;
}
}
@Override
public
CityObject
getTopLevelCityObject
()
{
return
this
;
}
@Override
public
String
toString
()
{
return
"TrafficArea [id="
+
getGmlId
()
+
"]"
;
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceObject.java
0 → 100644
View file @
660255ab
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.citygml4j.core.model.core.AbstractSpace
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurface
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
TrafficSpaceObject
extends
TransportationObject
{
private
final
List
<
TrafficAreaObject
>
trafficAreas
=
new
ArrayList
<>();
public
enum
TrafficSpaceType
{
TRAFFIC_SPACE
,
AUXILIARY_TRAFFIC_SPACE
}
public
TrafficSpaceObject
(
TrafficSpaceType
trafficSpaceType
)
{
if
(
trafficSpaceType
==
TrafficSpaceType
.
TRAFFIC_SPACE
)
{
super
.
setType
(
TransportationType
.
TRAFFIC_SPACE
);
}
else
{
super
.
setType
(
TransportationType
.
AUXILLIARY_TRAFFIC_SPACE
);
}
}
public
List
<
TrafficAreaObject
>
getTrafficAreas
()
{
return
trafficAreas
;
}
public
void
addTrafficArea
(
TrafficAreaObject
trafficAreaObject
)
{
trafficAreas
.
add
(
trafficAreaObject
);
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
AbstractSpace
ats
=
(
AbstractSpace
)
super
.
getGmlObject
();
setMultiSurfaceAccordingToLod
(
ats
,
ms
,
geom
.
getLod
());
}
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
reCreateGeometries
(
factory
,
config
);
}
}
private
void
setMultiSurfaceAccordingToLod
(
AbstractSpace
ats
,
MultiSurface
ms
,
Lod
lod
)
{
switch
(
lod
)
{
case
LOD0:
ats
.
setLod0MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
ats
.
setLod2MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
ats
.
setLod3MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
"cannot set geometry with LOD for AuxiliaryTrafficSpace: "
+
lod
);
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
if
(
tao
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
if
(
tao
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
accept
(
c
);
}
}
@Override
public
void
unsetGmlGeometries
()
{
AbstractSpace
ats
=
(
AbstractSpace
)
super
.
getGmlObject
();
ats
.
setLod0MultiSurface
(
null
);
ats
.
setLod2MultiSurface
(
null
);
ats
.
setLod3MultiSurface
(
null
);
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
unsetGmlGeometries
();
}
}
@Override
public
CityObject
getTopLevelCityObject
()
{
return
this
;
}
@Override
public
String
toString
()
{
return
"TransportationSpaceObject [id="
+
getGmlId
()
+
"]"
;
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
tao
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
for
(
TrafficAreaObject
tao
:
trafficAreas
)
{
handler
.
addInstance
(
tao
);
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
TrafficSpaceObject
originalTao
=
(
TrafficSpaceObject
)
original
;
for
(
TrafficAreaObject
tao
:
originalTao
.
trafficAreas
)
{
trafficAreas
.
add
(
handler
.
getCopyInstance
(
tao
));
}
super
.
setGmlObject
(
originalTao
.
getGmlObject
());
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
TrafficSpaceObject
(
null
);
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportSection.java
0 → 100644
View file @
660255ab
package
de.hft.stuttgart.citydoctor2.datastructure
;
public
class
TransportSection
extends
TransportationSpace
{
public
enum
SectionType
{
SECTION
,
INTERSECTION
}
public
TransportSection
(
SectionType
sectionType
)
{
super
(
TransportationType
.
SECTION
);
if
(
sectionType
==
SectionType
.
INTERSECTION
)
{
super
.
setType
(
TransportationType
.
INTERSECTION
);
}
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/TransportationObject.java
View file @
660255ab
...
...
@@ -43,190 +43,33 @@ import java.util.List;
*
* @author Matthias Betz
*/
public
class
TransportationObject
extends
CityObject
{
public
abstract
class
TransportationObject
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
-
2698907271726700390L
;
public
enum
TransportationType
{
ROAD
,
TRACK
,
RAILWAY
,
TRAFFIC_AREA
,
AUXILLIARY_TRAFFIC_AREA
,
TRANSPORTATION_COMPLEX
,
SQUARE
,
AUXILLIARY_TRAFFIC_SPACE
,
TRAFFIC_SPACE
ROAD
,
TRACK
,
RAILWAY
,
TRAFFIC_AREA
,
AUXILLIARY_TRAFFIC_AREA
,
TRANSPORTATION_COMPLEX
,
SQUARE
,
AUXILLIARY_TRAFFIC_SPACE
,
TRAFFIC_SPACE
,
WATERWAY
,
SECTION
,
INTERSECTION
}
private
AbstractCityObject
ato
;
private
final
List
<
TransportationObject
>
composesOf
=
new
ArrayList
<>(
1
);
private
final
TransportationType
type
;
protected
TransportationType
type
;
public
TransportationObject
(
TransportationType
type
)
{
this
.
type
=
type
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
TRANSPORTATION
;
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
switch
(
type
)
{
case
ROAD
,
TRACK
,
RAILWAY
,
SQUARE
,
TRANSPORTATION_COMPLEX:
AbstractTransportationSpace
tc
=
(
AbstractTransportationSpace
)
ato
;
setMultiSurfaceAccordingToLod
(
tc
,
ms
,
geom
.
getLod
());
break
;
case
TRAFFIC_AREA:
TrafficArea
ta
=
(
TrafficArea
)
ato
;
setMultiSurfaceAccordingToLod
(
ta
,
ms
,
geom
.
getLod
());
break
;
case
AUXILLIARY_TRAFFIC_AREA:
AuxiliaryTrafficArea
ata
=
(
AuxiliaryTrafficArea
)
ato
;
setMultiSurfaceAccordingToLod
(
ata
,
ms
,
geom
.
getLod
());
break
;
case
AUXILLIARY_TRAFFIC_SPACE
,
TRAFFIC_SPACE:
AbstractSpace
ats
=
(
AbstractSpace
)
ato
;
setMultiSurfaceAccordingToLod
(
ats
,
ms
,
geom
.
getLod
());
break
;
}
}
else
{
throw
new
IllegalStateException
(
"Geometry in TransportationObject cannot be of type "
+
geom
.
getType
()
+
". Only MultiSurface allowed"
);
}
}
for
(
TransportationObject
children
:
composesOf
)
{
children
.
reCreateGeometries
(
factory
,
config
);
}
}
private
void
setMultiSurfaceAccordingToLod
(
AbstractSpace
ats
,
MultiSurface
ms
,
Lod
lod
)
{
switch
(
lod
)
{
case
LOD0:
ats
.
setLod0MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2: