Skip to content

Commit 04e68d9

Browse files
committed
added deep copy for geometries
1 parent 9b7b6ca commit 04e68d9

14 files changed

+125
-7
lines changed

citydb-model/src/main/java/org/citydb/model/geometry/CompositeSolid.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ public static CompositeSolid empty() {
4848
return new CompositeSolid(Collections.emptyList());
4949
}
5050

51+
@Override
52+
public CompositeSolid copy() {
53+
return new CompositeSolid(getSolids().stream()
54+
.map(Solid::copy)
55+
.toArray(Solid[]::new))
56+
.copyPropertiesFrom(this);
57+
}
58+
5159
@Override
5260
public GeometryType getGeometryType() {
5361
return GeometryType.COMPOSITE_SOLID;

citydb-model/src/main/java/org/citydb/model/geometry/CompositeSurface.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ public static CompositeSurface empty() {
4848
return new CompositeSurface(Collections.emptyList());
4949
}
5050

51+
@Override
52+
public CompositeSurface copy() {
53+
return new CompositeSurface(getPolygons().stream()
54+
.map(Polygon::copy)
55+
.toArray(Polygon[]::new))
56+
.copyPropertiesFrom(this);
57+
}
58+
5159
@Override
5260
public GeometryType getGeometryType() {
5361
return GeometryType.COMPOSITE_SURFACE;

citydb-model/src/main/java/org/citydb/model/geometry/Coordinate.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,15 @@ public int getDimension() {
106106
return dimension;
107107
}
108108

109-
Coordinate force2D() {
109+
public Coordinate force2D() {
110110
z = 0;
111111
dimension = 2;
112112
return this;
113113
}
114+
115+
public Coordinate copy() {
116+
return dimension == 2 ?
117+
new Coordinate(x, y) :
118+
new Coordinate(x, y, z);
119+
}
114120
}

citydb-model/src/main/java/org/citydb/model/geometry/Geometry.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public abstract class Geometry<T extends Geometry<?>> extends Child implements S
3535
private String srsIdentifier;
3636
private GeometryDescriptor descriptor;
3737

38+
public abstract T copy();
39+
3840
public abstract GeometryType getGeometryType();
3941

4042
abstract T self();
@@ -170,4 +172,13 @@ private void update(Coordinate coordinate) {
170172
.setSRID(srid)
171173
.setSrsIdentifier(srsIdentifier);
172174
}
175+
176+
T copyPropertiesFrom(Geometry<T> other) {
177+
objectId = other.objectId;
178+
srid = other.srid;
179+
srsIdentifier = other.srsIdentifier;
180+
descriptor = other.descriptor;
181+
182+
return self();
183+
}
173184
}

citydb-model/src/main/java/org/citydb/model/geometry/LineString.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ public LineString force2D() {
7171
return this;
7272
}
7373

74+
@Override
75+
public LineString copy() {
76+
return new LineString(points.stream()
77+
.map(Coordinate::copy)
78+
.toArray(Coordinate[]::new))
79+
.copyPropertiesFrom(this);
80+
}
81+
7482
@Override
7583
public GeometryType getGeometryType() {
7684
return GeometryType.LINE_STRING;

citydb-model/src/main/java/org/citydb/model/geometry/LinearRing.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,15 @@ public int getVertexDimension() {
7474
return points.stream().anyMatch(coordinate -> coordinate.getDimension() == 2) ? 2 : 3;
7575
}
7676

77-
LinearRing force2D() {
77+
public LinearRing force2D() {
7878
points.forEach(Coordinate::force2D);
7979
return this;
8080
}
81+
82+
public LinearRing copy() {
83+
return new LinearRing(points.stream()
84+
.map(Coordinate::copy)
85+
.toArray(Coordinate[]::new))
86+
.setObjectId(objectId);
87+
}
8188
}

citydb-model/src/main/java/org/citydb/model/geometry/MultiLineString.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ public MultiLineString force2D() {
6868
return this;
6969
}
7070

71+
@Override
72+
public MultiLineString copy() {
73+
return new MultiLineString(lineStrings.stream()
74+
.map(LineString::copy)
75+
.toArray(LineString[]::new))
76+
.copyPropertiesFrom(this);
77+
}
78+
7179
@Override
7280
public GeometryType getGeometryType() {
7381
return GeometryType.MULTI_LINE_STRING;

citydb-model/src/main/java/org/citydb/model/geometry/MultiPoint.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ public MultiPoint force2D() {
6868
return this;
6969
}
7070

71+
@Override
72+
public MultiPoint copy() {
73+
return new MultiPoint(points.stream()
74+
.map(Point::copy)
75+
.toArray(Point[]::new))
76+
.copyPropertiesFrom(this);
77+
}
78+
7179
@Override
7280
public GeometryType getGeometryType() {
7381
return GeometryType.MULTI_POINT;

citydb-model/src/main/java/org/citydb/model/geometry/MultiSolid.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ public static MultiSolid empty() {
4848
return new MultiSolid(Collections.emptyList());
4949
}
5050

51+
@Override
52+
public MultiSolid copy() {
53+
return new MultiSolid(getSolids().stream()
54+
.map(Solid::copy)
55+
.toArray(Solid[]::new))
56+
.copyPropertiesFrom(this);
57+
}
58+
5159
@Override
5260
public GeometryType getGeometryType() {
5361
return GeometryType.MULTI_SOLID;

citydb-model/src/main/java/org/citydb/model/geometry/MultiSurface.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ public static MultiSurface empty() {
4848
return new MultiSurface(Collections.emptyList());
4949
}
5050

51+
@Override
52+
public MultiSurface copy() {
53+
return new MultiSurface(getPolygons().stream()
54+
.map(Polygon::copy)
55+
.toArray(Polygon[]::new))
56+
.copyPropertiesFrom(this);
57+
}
58+
5159
@Override
5260
public GeometryType getGeometryType() {
5361
return GeometryType.MULTI_SURFACE;

citydb-model/src/main/java/org/citydb/model/geometry/Point.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ public Point force2D() {
5151
return this;
5252
}
5353

54+
@Override
55+
public Point copy() {
56+
return new Point(coordinate.copy())
57+
.copyPropertiesFrom(this);
58+
}
59+
5460
@Override
5561
public GeometryType getGeometryType() {
5662
return GeometryType.POINT;

citydb-model/src/main/java/org/citydb/model/geometry/Polygon.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ private Polygon(LinearRing exteriorRing, List<LinearRing> interiorRings, boolean
4141
this.reversed = reversed;
4242
}
4343

44+
private Polygon(LinearRing exteriorRing, LinearRing[] interiorRings, boolean reversed) {
45+
Objects.requireNonNull(exteriorRing, "The exterior ring must not be null.");
46+
this.exteriorRing = asChild(exteriorRing);
47+
this.interiorRings = interiorRings != null ? asChild(Arrays.asList(interiorRings)) : null;
48+
this.reversed = reversed;
49+
}
50+
4451
public static Polygon of(LinearRing exteriorRing, List<LinearRing> interiorRings, boolean reversed) {
4552
return new Polygon(exteriorRing, interiorRings, reversed);
4653
}
@@ -50,23 +57,23 @@ public static Polygon of(LinearRing exteriorRing, List<LinearRing> interiorRings
5057
}
5158

5259
public static Polygon of(LinearRing exteriorRing, LinearRing[] interiorRings, boolean reversed) {
53-
return new Polygon(exteriorRing, interiorRings != null ? Arrays.asList(interiorRings) : null, reversed);
60+
return new Polygon(exteriorRing, interiorRings, reversed);
5461
}
5562

5663
public static Polygon of(LinearRing exteriorRing, LinearRing[] interiorRings) {
57-
return new Polygon(exteriorRing, interiorRings != null ? Arrays.asList(interiorRings) : null, false);
64+
return new Polygon(exteriorRing, interiorRings, false);
5865
}
5966

6067
public static Polygon of(LinearRing exteriorRing, boolean reversed) {
61-
return new Polygon(exteriorRing, null, reversed);
68+
return new Polygon(exteriorRing, (List<LinearRing>) null, reversed);
6269
}
6370

6471
public static Polygon of(LinearRing exteriorRing) {
65-
return new Polygon(exteriorRing, null, false);
72+
return new Polygon(exteriorRing, (List<LinearRing>) null, false);
6673
}
6774

6875
public static Polygon empty() {
69-
return new Polygon(LinearRing.empty(), null, false);
76+
return new Polygon(LinearRing.empty(), (List<LinearRing>) null, false);
7077
}
7178

7279
public LinearRing getExteriorRing() {
@@ -121,6 +128,17 @@ public Polygon force2D() {
121128
return this;
122129
}
123130

131+
@Override
132+
public Polygon copy() {
133+
return new Polygon(exteriorRing.copy(),
134+
interiorRings != null ? interiorRings.stream()
135+
.map(LinearRing::copy)
136+
.toArray(LinearRing[]::new) :
137+
null,
138+
reversed)
139+
.copyPropertiesFrom(this);
140+
}
141+
124142
@Override
125143
public GeometryType getGeometryType() {
126144
return GeometryType.POLYGON;

citydb-model/src/main/java/org/citydb/model/geometry/Solid.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ public int getVertexDimension() {
5454
return 3;
5555
}
5656

57+
@Override
58+
public Solid copy() {
59+
return new Solid(shell.copy())
60+
.copyPropertiesFrom(this);
61+
}
62+
5763
@Override
5864
public GeometryType getGeometryType() {
5965
return GeometryType.SOLID;

citydb-model/src/main/java/org/citydb/model/geometry/TriangulatedSurface.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ public static TriangulatedSurface empty() {
4848
return new TriangulatedSurface(Collections.emptyList());
4949
}
5050

51+
@Override
52+
public TriangulatedSurface copy() {
53+
return new TriangulatedSurface(getPolygons().stream()
54+
.map(Polygon::copy)
55+
.toArray(Polygon[]::new))
56+
.copyPropertiesFrom(this);
57+
}
58+
5159
@Override
5260
public GeometryType getGeometryType() {
5361
return GeometryType.TRIANGULATED_SURFACE;

0 commit comments

Comments
 (0)