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
ed1f8e54
Commit
ed1f8e54
authored
Oct 25, 2024
by
Riegel
Browse files
Rework parsing of CompositeSurface
parent
34c26b20
Changes
5
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java
View file @
ed1f8e54
...
...
@@ -24,7 +24,7 @@ public class CompositePolygon extends ConcretePolygon{
private
Geometry
parent
;
private
BoundarySurface
partOfSurface
;
private
Installation
partOfInstallation
;
private
List
<
Polygon
>
compositeMembers
=
new
ArrayList
<>();
private
List
<
Concrete
Polygon
>
compositeMembers
=
new
ArrayList
<>();
private
LinearRing
exterior
=
null
;
@Override
...
...
@@ -74,11 +74,11 @@ public class CompositePolygon extends ConcretePolygon{
}
}
public
void
addCompositeMember
(
Polygon
p
){
public
void
addCompositeMember
(
Concrete
Polygon
p
){
compositeMembers
.
add
(
p
);
}
public
List
<
Polygon
>
getCompositeMembers
(){
public
List
<
Concrete
Polygon
>
getCompositeMembers
(){
return
compositeMembers
;
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java
View file @
ed1f8e54
...
...
@@ -827,17 +827,20 @@ public class Citygml3FeatureMapper extends ObjectWalker {
continue
;
}
// TODO: Insert handling of compPoly dummy objects
if
(
concPoly
instanceof
CompositePolygon
comp
)
{}
//
LinkedPolygon
lPoly
=
new
LinkedPolygon
(
concPoly
,
geom
);
if
(
geom
.
getParent
()
instanceof
BoundarySurface
bs
)
{
lPoly
.
setPartOfSurface
(
bs
);
if
(
bs
.
getParent
()
instanceof
Installation
bi
)
{
lPoly
.
setPartOfInstallation
(
bi
);
if
(
concPoly
instanceof
CompositePolygon
comp
)
{
resolveCompositePolygon
(
comp
).
forEach
(
geom:
:
addPolygon
);
}
else
{
//
LinkedPolygon
lPoly
=
new
LinkedPolygon
(
concPoly
,
geom
);
if
(
geom
.
getParent
()
instanceof
BoundarySurface
bs
)
{
lPoly
.
setPartOfSurface
(
bs
);
if
(
bs
.
getParent
()
instanceof
Installation
bi
)
{
lPoly
.
setPartOfInstallation
(
bi
);
}
}
geom
.
addPolygon
(
lPoly
);
}
geom
.
addPolygon
(
lPoly
);
}
// clear storage for polygons and vertices
...
...
@@ -847,6 +850,18 @@ public class Citygml3FeatureMapper extends ObjectWalker {
polygonMap
=
new
HashMap
<>();
}
private
List
<
ConcretePolygon
>
resolveCompositePolygon
(
CompositePolygon
comp
)
{
List
<
ConcretePolygon
>
polygons
=
new
ArrayList
<>();
for
(
ConcretePolygon
conc:
comp
.
getCompositeMembers
()){
if
(
conc
instanceof
CompositePolygon
recComp
){
polygons
.
addAll
(
resolveCompositePolygon
(
recComp
));
}
else
{
polygons
.
add
(
conc
);
}
}
return
polygons
;
}
private
void
readAbstractBuilding
(
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
gmlAb
,
AbstractBuilding
cdBuilding
)
{
mapAbstractOccupiedSpace
(
gmlAb
,
cdBuilding
);
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java
View file @
ed1f8e54
...
...
@@ -24,21 +24,18 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.Map
;
import
de.hft.stuttgart.citydoctor2.datastructure.*
;
import
de.hft.stuttgart.citydoctor2.datastructure.LinearRing
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.locationtech.proj4j.BasicCoordinateTransform
;
import
org.locationtech.proj4j.ProjCoordinate
;
import
org.xmlobjects.gml.model.geometry.
primitives.AbstractRing
;
import
org.xmlobjects.gml.model.geometry.primitives.
AbstractRingProperty
;
import
org.xmlobjects.gml.model.geometry.
complexes.CompositeSurface
;
import
org.xmlobjects.gml.model.geometry.primitives.
*
;
import
org.xmlobjects.gml.model.geometry.primitives.Polygon
;
import
org.xmlobjects.gml.model.geometry.primitives.Ring
;
import
org.xmlobjects.gml.visitor.GeometryWalker
;
import
de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.LinearRing
;
import
de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType
;
import
de.hft.stuttgart.citydoctor2.datastructure.Vertex
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.Localization
;
...
...
@@ -94,6 +91,34 @@ public class Citygml3GeometryMapper extends GeometryWalker {
cdPoly
.
addInteriorRing
(
currentRing
);
}
}
@Override
public
void
visit
(
CompositeSurface
cs
){
if
(
cs
.
getSurfaceMembers
()
!=
null
&&
cs
.
getSurfaceMembers
().
isEmpty
())
{
logger
.
warn
(
"CompositeSurface %s is empty"
,
cs
.
getId
());
return
;
}
List
<
SurfaceProperty
>
surfaceMember
=
cs
.
getSurfaceMembers
();
Citygml3GeometryMapper
recursiveMapper
=
new
Citygml3GeometryMapper
(
config
,
vertexMap
);
CompositePolygon
comp
=
new
CompositePolygon
();
if
(
cs
.
getId
()
==
null
){
comp
.
setGmlId
(
GmlId
.
generateId
());
}
else
{
comp
.
setGmlId
(
new
GmlId
(
cs
.
getId
()));
}
for
(
SurfaceProperty
prop
:
surfaceMember
)
{
if
(
prop
.
getObject
()
!=
null
)
{
AbstractSurface
as
=
prop
.
getObject
();
as
.
accept
(
recursiveMapper
);
}
}
List
<
ConcretePolygon
>
compPolys
=
recursiveMapper
.
getPolygons
();
compPolys
.
forEach
(
comp:
:
addCompositeMember
);
polygons
.
add
(
comp
);
polygons
.
addAll
(
compPolys
);
}
@Override
public
void
visit
(
org
.
xmlobjects
.
gml
.
model
.
geometry
.
primitives
.
LinearRing
gmlRing
)
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/SurfaceMapper.java
View file @
ed1f8e54
...
...
@@ -97,11 +97,6 @@ public class SurfaceMapper extends ObjectWalker {
parseAndAddMultiSurface
(
afs
.
getLod2MultiSurface
(),
Lod
.
LOD2
,
o
);
parseAndAddMultiSurface
(
afs
.
getLod3MultiSurface
(),
Lod
.
LOD3
,
o
);
parseAndAddMultiSurface
(
afs
.
getDeprecatedProperties
().
getLod4MultiSurface
(),
Lod
.
LOD4
,
o
);
parseAndAddCompositeSurface
(
afs
.
getLod0MultiSurface
(),
Lod
.
LOD0
,
o
);
parseAndAddCompositeSurface
(
afs
.
getLod1MultiSurface
(),
Lod
.
LOD1
,
o
);
parseAndAddCompositeSurface
(
afs
.
getLod2MultiSurface
(),
Lod
.
LOD2
,
o
);
parseAndAddCompositeSurface
(
afs
.
getLod3MultiSurface
(),
Lod
.
LOD3
,
o
);
parseAndAddCompositeSurface
(
afs
.
getDeprecatedProperties
().
getLod4MultiSurface
(),
Lod
.
LOD4
,
o
);
o
.
unsetGmlGeometries
();
}
...
...
@@ -112,12 +107,7 @@ public class SurfaceMapper extends ObjectWalker {
parseAndAddMultiSurface
(
gmlSurface
.
getLod2MultiSurface
(),
Lod
.
LOD2
,
cdSurface
);
parseAndAddMultiSurface
(
gmlSurface
.
getLod3MultiSurface
(),
Lod
.
LOD3
,
cdSurface
);
parseAndAddMultiSurface
(
gmlSurface
.
getDeprecatedProperties
().
getLod4MultiSurface
(),
Lod
.
LOD4
,
cdSurface
);
parseAndAddCompositeSurface
(
gmlSurface
.
getLod0MultiSurface
(),
Lod
.
LOD0
,
cdSurface
);
parseAndAddCompositeSurface
(
gmlSurface
.
getLod1MultiSurface
(),
Lod
.
LOD1
,
cdSurface
);
parseAndAddCompositeSurface
(
gmlSurface
.
getLod2MultiSurface
(),
Lod
.
LOD2
,
cdSurface
);
parseAndAddCompositeSurface
(
gmlSurface
.
getLod3MultiSurface
(),
Lod
.
LOD3
,
cdSurface
);
parseAndAddCompositeSurface
(
gmlSurface
.
getDeprecatedProperties
().
getLod4MultiSurface
(),
Lod
.
LOD4
,
cdSurface
);
}
}
private
void
parseAndAddMultiSurface
(
MultiSurfaceProperty
msp
,
Lod
lod
,
CityObject
cdSurface
)
{
if
(
msp
==
null
||
msp
.
getObject
()
==
null
)
{
...
...
@@ -134,34 +124,6 @@ public class SurfaceMapper extends ObjectWalker {
return
geom
;
}
private
void
parseAndAddCompositeSurface
(
MultiSurfaceProperty
ms
,
Lod
lod
,
CityObject
cdSurface
){
if
(
ms
==
null
||
ms
.
getObject
()
==
null
)
{
return
;
}
List
<
SurfaceProperty
>
surfaceMember
=
ms
.
getObject
().
getSurfaceMember
();
for
(
SurfaceProperty
surface
:
surfaceMember
)
{
if
(
surface
.
getObject
()
instanceof
CompositeSurface
cs
)
{
Geometry
geom
=
parseCompositeSurface
(
cs
,
lod
);
cdSurface
.
addGeometry
(
geom
);
}
}
}
private
Geometry
parseCompositeSurface
(
CompositeSurface
cs
,
Lod
lod
)
{
Geometry
geom
=
new
Geometry
(
GeometryType
.
COMPOSITE_SURFACE
,
lod
);
Citygml3GeometryMapper
geometryMapper
=
new
Citygml3GeometryMapper
(
config
,
vertexMap
);
readSurfaceMember
(
geom
,
geometryMapper
,
cs
.
getSurfaceMembers
());
if
(
cs
.
getId
()
!=
null
){
CompositePolygon
compPoly
=
new
CompositePolygon
();
polygonMap
.
put
(
cs
.
getId
(),
compPoly
);
geom
.
getPolygons
().
forEach
(
compPoly:
:
addCompositeMember
);
compPoly
.
setParent
(
geom
);
}
return
geom
;
}
private
void
readSurfaceMember
(
Geometry
geom
,
Citygml3GeometryMapper
geometryMapper
,
List
<
SurfaceProperty
>
surfaceMember
)
{
...
...
@@ -178,9 +140,14 @@ public class SurfaceMapper extends ObjectWalker {
List
<
ConcretePolygon
>
polygons
=
geometryMapper
.
getPolygons
();
for
(
ConcretePolygon
concretePoly
:
polygons
)
{
geom
.
addPolygon
(
concretePoly
);
if
(
concretePoly
.
hasExistingGmlId
())
{
polygonMap
.
put
(
concretePoly
.
getGmlId
().
getGmlString
(),
concretePoly
);
if
(
concretePoly
instanceof
CompositePolygon
comp
)
{
references
.
add
(
new
ResolvableReference
(
comp
.
getGmlId
().
toString
(),
geom
));
polygonMap
.
put
(
comp
.
getGmlId
().
toString
(),
comp
);
}
else
{
geom
.
addPolygon
(
concretePoly
);
if
(
concretePoly
.
hasExistingGmlId
())
{
polygonMap
.
put
(
concretePoly
.
getGmlId
().
getGmlString
(),
concretePoly
);
}
}
}
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/CityGmlUtils.java
View file @
ed1f8e54
...
...
@@ -141,7 +141,7 @@ public final class CityGmlUtils {
public
static
MultiSurface
createMultiSurface
(
Geometry
geom
,
GeometryFactory
factory
,
ParserConfiguration
config
)
{
if
(
geom
.
getType
()
!=
GeometryType
.
MULTI_SURFACE
)
{
if
(
geom
.
getType
()
!=
GeometryType
.
MULTI_SURFACE
&&
geom
.
getType
()
!=
GeometryType
.
COMPOSITE_SURFACE
)
{
throw
new
IllegalArgumentException
(
"This can only handle MultiSurfaces"
);
}
List
<
SurfaceProperty
>
surfaces
=
new
ArrayList
<>();
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment