Skip to content

Commit b0730d6

Browse files
committed
finish integrating L3TimeAxis
1 parent 8ffad3f commit b0730d6

File tree

15 files changed

+265
-58
lines changed

15 files changed

+265
-58
lines changed

core/src/main/java/com/bc/fiduceo/db/H2Driver.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@
2323
import com.bc.fiduceo.core.NodeType;
2424
import com.bc.fiduceo.core.SatelliteObservation;
2525
import com.bc.fiduceo.core.Sensor;
26-
import com.bc.fiduceo.geometry.GeometryFactory;
27-
import com.bc.fiduceo.geometry.LineString;
28-
import com.bc.fiduceo.geometry.TimeAxis;
26+
import com.bc.fiduceo.geometry.*;
2927
import com.bc.fiduceo.util.TimeUtils;
3028

3129
import java.sql.*;
@@ -192,7 +190,7 @@ public List<SatelliteObservation> get(QueryParameter parameter) throws SQLExcept
192190
}
193191
resultSet.previous(); // need to rewind one result because the while loop runs one result too far tb 2016-09-23
194192

195-
observation.setTimeAxes(timeAxesList.toArray(new TimeAxis[timeAxesList.size()]));
193+
observation.setTimeAxes(timeAxesList.toArray(new TimeAxis[0]));
196194

197195
resultList.add(observation);
198196
}
@@ -205,13 +203,19 @@ private TimeAxis getTimeAxis(ResultSet resultSet) throws SQLException {
205203
if (axis == null) {
206204
return null;
207205
}
208-
final String axisWkt = axis.toString();
209-
final LineString axisGeometry = (LineString) geometryFactory.fromStorageFormat(axisWkt.getBytes());
210206

211207
final Timestamp startTime = resultSet.getTimestamp("StartTime");
212208
final Date axisStartTime = TimeUtils.toDate(startTime);
213209
final Timestamp endTime = resultSet.getTimestamp("StopTime");
214210
final Date axisEndTime = TimeUtils.toDate(endTime);
215-
return geometryFactory.createTimeAxis(axisGeometry, axisStartTime, axisEndTime);
211+
212+
final String axisWkt = axis.toString();
213+
final Geometry geometry = geometryFactory.fromStorageFormat(axisWkt.getBytes());
214+
if (geometry instanceof MultiLineString) {
215+
return new L3TimeAxis(axisStartTime, axisEndTime, geometry);
216+
} else {
217+
final LineString axisGeometry = (LineString) geometry;
218+
return geometryFactory.createTimeAxis(axisGeometry, axisStartTime, axisEndTime);
219+
}
216220
}
217221
}

core/src/main/java/com/bc/fiduceo/db/MongoDbDriver.java

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ Geometry convertToGeometry(Document geoDocument) {
289289
return convertGeometryCollection(geoDocument);
290290
} else if ("LineString".equals(type)) {
291291
return convertLineString(geoDocument);
292+
} else if ("MultiLineString".equals(type)) {
293+
return convertMultiLineString(geoDocument);
292294
}
293295
throw new RuntimeException("Geometry type support not implemented yet: " + type);
294296
}
@@ -303,13 +305,13 @@ private Geometry convertGeometryCollection(Document geoDocument) {
303305
}
304306

305307
private Geometry convertMultiPolygon(Document geoDocument) {
306-
List<Polygon> polygonList = new ArrayList<>();
307-
ArrayList polycoordinates = (ArrayList) geoDocument.get("coordinates");
308-
for (Object polycoordinate : polycoordinates) {
308+
final List<Polygon> polygonList = new ArrayList<>();
309+
final ArrayList polyCoordinates = (ArrayList) geoDocument.get("coordinates");
310+
for (Object polycoordinate : polyCoordinates) {
309311
final ArrayList coordinates = (ArrayList) polycoordinate;
310312
for (Object coordinate : coordinates) {
311313
final ArrayList<Double> point = (ArrayList<Double>) coordinate;
312-
List<Point> pointList = new ArrayList<>();
314+
final List<Point> pointList = new ArrayList<>();
313315
for (Object object : point) {
314316
ArrayList<Double> m = (ArrayList<Double>) object;
315317
pointList.add(geometryFactory.createPoint(m.get(0), m.get(1)));
@@ -344,6 +346,21 @@ private Geometry convertLineString(Document geoDocument) {
344346
return geometryFactory.createLineString(lineStringPoints);
345347
}
346348

349+
private Geometry convertMultiLineString(Document geoDocument) {
350+
final List<LineString> lineStrings = new ArrayList<>();
351+
352+
final List<List<List<Double>>> coordinates = (List<List<List<Double>>>) geoDocument.get("coordinates");
353+
for (final List<List<Double>> positionList : coordinates) {
354+
final ArrayList<Point> lineStringPoints = new ArrayList<>();
355+
for (final List<Double> position : positionList) {
356+
final Point point = geometryFactory.createPoint(position.get(0), position.get(1));
357+
lineStringPoints.add(point);
358+
}
359+
lineStrings.add(geometryFactory.createLineString(lineStringPoints));
360+
}
361+
return geometryFactory.createMultiLineString(lineStrings);
362+
}
363+
347364
// @todo 2 tb/** make static and add tests 2016-04-21
348365
TimeAxis[] convertToTimeAxes(Document jsonTimeAxes) {
349366
final List<Document> timeAxesDocuments = (List<Document>) jsonTimeAxes.get("timeAxes");
@@ -352,8 +369,16 @@ TimeAxis[] convertToTimeAxes(Document jsonTimeAxes) {
352369
final Document timeAxisDocument = timeAxesDocuments.get(i);
353370
final Date startTime = timeAxisDocument.getDate("startTime");
354371
final Date endTime = timeAxisDocument.getDate("endTime");
355-
final LineString geometry = (LineString) convertToGeometry((Document) timeAxisDocument.get("geometry"));
356-
timeAxes[i] = geometryFactory.createTimeAxis(geometry, startTime, endTime);
372+
// check geometry type and either create standard time axis or the L3 thing
373+
final Document geoDocument = (Document) timeAxisDocument.get("geometry");
374+
final String type = (String) geoDocument.get("type");
375+
if (type.equals("MultiLineString")) {
376+
final MultiLineString geometry = (MultiLineString) convertToGeometry(geoDocument);
377+
timeAxes[i] = new L3TimeAxis(startTime, endTime, geometry);
378+
} else {
379+
final LineString geometry = (LineString) convertToGeometry(geoDocument);
380+
timeAxes[i] = geometryFactory.createTimeAxis(geometry, startTime, endTime);
381+
}
357382
}
358383
return timeAxes;
359384
}
@@ -412,7 +437,9 @@ static Document createQueryDocument(QueryParameter parameter) {
412437
// static access for testing only tb 2016-02-09
413438
@SuppressWarnings("unchecked")
414439
static com.mongodb.client.model.geojson.Geometry convertToGeoJSON(Geometry geometry) {
415-
if (geometry instanceof GeometryCollection) {
440+
if (geometry instanceof MultiLineString) {
441+
return convertMultiLineStringToGeoJSON((MultiLineString) geometry);
442+
} else if (geometry instanceof GeometryCollection) {
416443
return convertGeometryCollectionToGeoJSON((GeometryCollection) geometry);
417444
}
418445

@@ -461,6 +488,24 @@ private static com.mongodb.client.model.geojson.Geometry convertGeometryCollecti
461488
return new com.mongodb.client.model.geojson.GeometryCollection(geometryList);
462489
}
463490

491+
private static com.mongodb.client.model.geojson.Geometry convertMultiLineStringToGeoJSON(MultiLineString multiLineString) {
492+
final Geometry[] geometries = multiLineString.getGeometries();
493+
if (geometries.length == 1) {
494+
return convertToGeoJSON(geometries[0]);
495+
}
496+
497+
final List<List<Position>> multiList = new ArrayList<>();
498+
for (final Geometry geometry : geometries) {
499+
final List<Position> lineStringPoints = new ArrayList<>();
500+
final Point[] coordinates = geometry.getCoordinates();
501+
for (final Point point : coordinates) {
502+
lineStringPoints.add(new Position(point.getLon(), point.getLat()));
503+
}
504+
multiList.add(lineStringPoints);
505+
}
506+
return new com.mongodb.client.model.geojson.MultiLineString(multiList);
507+
}
508+
464509
private static ArrayList<Position> extractPointsFromGeometry(Point[] coordinates) {
465510
final ArrayList<Position> polygonPoints = new ArrayList<>();
466511

core/src/main/java/com/bc/fiduceo/db/PostGISDriver.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
import com.bc.fiduceo.core.NodeType;
2424
import com.bc.fiduceo.core.SatelliteObservation;
2525
import com.bc.fiduceo.core.Sensor;
26-
import com.bc.fiduceo.geometry.Geometry;
27-
import com.bc.fiduceo.geometry.GeometryFactory;
28-
import com.bc.fiduceo.geometry.LineString;
29-
import com.bc.fiduceo.geometry.TimeAxis;
26+
import com.bc.fiduceo.geometry.*;
3027
import com.bc.fiduceo.util.TimeUtils;
3128
import org.apache.commons.dbcp2.BasicDataSource;
3229
import org.esa.snap.core.util.StringUtils;
@@ -282,13 +279,19 @@ private TimeAxis getTimeAxis(ResultSet resultSet) throws SQLException {
282279
if (axis == null) {
283280
return null;
284281
}
285-
final String axisWkt = axis.getValue();
286-
final LineString axisGeometry = (LineString) geometryFactory.fromStorageFormat(axisWkt.getBytes());
287282

288283
final Timestamp startTime = resultSet.getTimestamp("StartTime");
289284
final java.util.Date axisStartTime = TimeUtils.toDate(startTime);
290285
final Timestamp endTime = resultSet.getTimestamp("StopTime");
291286
final java.util.Date axisEndTime = TimeUtils.toDate(endTime);
292-
return geometryFactory.createTimeAxis(axisGeometry, axisStartTime, axisEndTime);
287+
288+
final String axisWkt = axis.getValue();
289+
final Geometry geometry = geometryFactory.fromStorageFormat(axisWkt.getBytes());
290+
if (geometry instanceof MultiLineString) {
291+
return new L3TimeAxis(axisStartTime, axisEndTime, geometry);
292+
} else {
293+
final LineString axisGeometry = (LineString) geometry;
294+
return geometryFactory.createTimeAxis(axisGeometry, axisStartTime, axisEndTime);
295+
}
293296
}
294297
}

core/src/main/java/com/bc/fiduceo/geometry/MultiLineString.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@
2121
package com.bc.fiduceo.geometry;
2222

2323

24-
public interface MultiLineString extends LineString {
24+
public interface MultiLineString extends GeometryCollection {
2525
}

core/src/main/java/com/bc/fiduceo/geometry/jts/JTSMultiLineString.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ public JTSMultiLineString(com.vividsolutions.jts.geom.MultiLineString jtsMultiLi
1212
this.jtsMultiLineString = jtsMultiLineString;
1313
}
1414

15+
@Override
16+
public Geometry[] getGeometries() {
17+
throw new RuntimeException("not implemented");
18+
}
19+
20+
@Override
21+
public void setGeometries(Geometry[] geometries) {
22+
throw new RuntimeException("not implemented");
23+
}
24+
1525
@Override
1626
public Geometry getIntersection(Geometry other) {
1727
throw new RuntimeException("not implemented");

core/src/main/java/com/bc/fiduceo/geometry/s2/BcS2MultiLineString.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ static BcS2MultiLineString createFrom(List<BcS2LineString> lineStringList) {
4545
return new BcS2MultiLineString(googlePolyLineList);
4646
}
4747

48+
@Override
49+
public Geometry[] getGeometries() {
50+
final Geometry[] result = new Geometry[s2PolylineList.size()];
51+
int i = 0;
52+
for (S2Polyline polyline : s2PolylineList) {
53+
result[i] = new BcS2LineString(polyline);
54+
++i;
55+
}
56+
return result;
57+
}
58+
59+
@Override
60+
public void setGeometries(Geometry[] geometries) {
61+
s2PolylineList.clear();
62+
for (final Geometry geometry : geometries) {
63+
s2PolylineList.add((S2Polyline) geometry.getInner());
64+
}
65+
}
66+
4867
@Override
4968
public Geometry getIntersection(Geometry other) {
5069
List<Geometry> results;
@@ -104,14 +123,14 @@ public boolean isValid() {
104123

105124
@Override
106125
public Point[] getCoordinates() {
107-
List<Point> pointList = new ArrayList<>();
126+
final List<Point> pointList = new ArrayList<>();
108127
for (S2Polyline s2Polyline : s2PolylineList) {
109128
int i = s2Polyline.numVertices();
110129
for (int j = 0; j < i; j++) {
111130
pointList.add(BcS2Point.createFrom(s2Polyline.vertex(j)));
112131
}
113132
}
114-
return pointList.toArray(new Point[pointList.size()]);
133+
return pointList.toArray(new Point[0]);
115134
}
116135

117136
@Override
@@ -162,7 +181,7 @@ static Geometry assembleResultGeometry(List<Geometry> results) {
162181
return BcS2Point.createEmpty();
163182
} else if (results.size() > 1) {
164183
final GeometryCollection geometryCollection = new BcGeometryCollection();
165-
geometryCollection.setGeometries(results.toArray(new Geometry[results.size()]));
184+
geometryCollection.setGeometries(results.toArray(new Geometry[0]));
166185
return geometryCollection;
167186
} else {
168187
return results.get(0);

core/src/main/java/com/bc/fiduceo/geometry/s2/BcS2MultiPolygon.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public Geometry getIntersection(Geometry other) {
4343
if (other instanceof BcS2Point) {
4444
return intersectPoint((BcS2Point) other);
4545
} else if (other instanceof BcS2MultiLineString) {
46-
return intersectLineString((LineString) other);
46+
return intersectMultiLineString((MultiLineString) other);
4747
} else if (other instanceof BcS2LineString) {
4848
return intersectLineString((LineString) other);
4949
} else if (other instanceof BcS2Polygon) {
@@ -132,15 +132,48 @@ private Geometry intersectPoint(BcS2Point other) {
132132
private Geometry intersectLineString(LineString other) {
133133
final List<BcS2LineString> lineStrings = new ArrayList<>();
134134
for (final Polygon polygon : polygonList) {
135-
final BcS2MultiLineString intersection = (BcS2MultiLineString) polygon.getIntersection(other);
135+
final Geometry intersection = polygon.getIntersection(other);
136+
if (intersection.isValid()) {
137+
if (intersection instanceof LineString) {
138+
final S2Polyline inner = (S2Polyline) intersection.getInner();
139+
lineStrings.add(new BcS2LineString(inner));
140+
} else {
141+
final List<S2Polyline> inner = (List<S2Polyline>) intersection.getInner();
142+
for (final S2Polyline polyline : inner) {
143+
lineStrings.add(new BcS2LineString(polyline));
144+
}
145+
}
146+
}
147+
}
148+
if (lineStrings.size() == 1) {
149+
return lineStrings.get(0);
150+
} else {
151+
return BcS2MultiLineString.createFrom(lineStrings);
152+
}
153+
}
154+
155+
@SuppressWarnings("unchecked")
156+
private Geometry intersectMultiLineString(MultiLineString other) {
157+
final List<BcS2LineString> lineStrings = new ArrayList<>();
158+
for (final Polygon polygon : polygonList) {
159+
final Geometry intersection = polygon.getIntersection(other);
136160
if (intersection.isValid()) {
137-
final List<S2Polyline> inner = (List<S2Polyline>) intersection.getInner();
138-
for (final S2Polyline polyline : inner) {
139-
lineStrings.add(new BcS2LineString(polyline));
161+
if (intersection instanceof LineString) {
162+
final S2Polyline inner = (S2Polyline) intersection.getInner();
163+
lineStrings.add(new BcS2LineString(inner));
164+
} else {
165+
final List<S2Polyline> inner = (List<S2Polyline>) intersection.getInner();
166+
for (final S2Polyline polyline : inner) {
167+
lineStrings.add(new BcS2LineString(polyline));
168+
}
140169
}
141170
}
142171
}
143-
return BcS2MultiLineString.createFrom(lineStrings);
172+
if (lineStrings.size() == 1) {
173+
return lineStrings.get(0);
174+
} else {
175+
return BcS2MultiLineString.createFrom(lineStrings);
176+
}
144177
}
145178

146179
private Geometry intersectPolygon(BcS2Polygon other) {

core/src/main/java/com/bc/fiduceo/geometry/s2/BcS2Polygon.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,7 @@
2424
import com.bc.fiduceo.geometry.Geometry;
2525
import com.bc.fiduceo.geometry.Point;
2626
import com.bc.fiduceo.geometry.Polygon;
27-
import com.google.common.geometry.S2LatLng;
28-
import com.google.common.geometry.S2Loop;
29-
import com.google.common.geometry.S2Point;
30-
import com.google.common.geometry.S2Polygon;
31-
import com.google.common.geometry.S2Polyline;
27+
import com.google.common.geometry.*;
3228

3329
import java.util.ArrayList;
3430
import java.util.List;
@@ -41,7 +37,6 @@ class BcS2Polygon implements Polygon {
4137
this.googlePolygon = (S2Polygon) geometry;
4238
}
4339

44-
@SuppressWarnings("unchecked")
4540
@Override
4641
public Geometry getIntersection(Geometry other) {
4742
if (other instanceof BcS2Polygon) {
@@ -124,7 +119,7 @@ public Point[] getCoordinates() {
124119
final List<Point> pointList = extractPoints(googlePolygon);
125120
// @todo 2 tb/** the S2 loops do not contain the closing point. Check if we need to add this point here.
126121
// check what happens when the polygon contains more than one loop tb 2016-01-27
127-
return pointList.toArray(new Point[pointList.size()]);
122+
return pointList.toArray(new Point[0]);
128123
}
129124

130125
@Override
@@ -181,18 +176,28 @@ private Geometry intersectPoint(Geometry other) {
181176

182177
@SuppressWarnings("unchecked")
183178
private Geometry intersectMultiLineString(Geometry other) {
184-
List<S2Polyline> s2PolylineList = (List<S2Polyline>) other.getInner();
185-
List<S2Polyline> intersectionResult = new ArrayList<>();
179+
final List<S2Polyline> s2PolylineList = (List<S2Polyline>) other.getInner();
180+
final List<S2Polyline> intersectionResult = new ArrayList<>();
186181
for (final S2Polyline s2Polyline : s2PolylineList) {
187-
intersectionResult.addAll(googlePolygon.intersectWithPolyLine(s2Polyline));
182+
final List<S2Polyline> polylines = googlePolygon.intersectWithPolyLine(s2Polyline);
183+
184+
intersectionResult.addAll(polylines);
185+
}
186+
if (intersectionResult.size() == 1) {
187+
return new BcS2LineString(intersectionResult.get(0));
188+
} else {
189+
return new BcS2MultiLineString(intersectionResult);
188190
}
189-
return new BcS2MultiLineString(intersectionResult);
190191
}
191192

192193
private Geometry intersectLineString(Geometry other) {
193194
final S2Polyline s2Polyline = (S2Polyline) other.getInner();
194195
final List<S2Polyline> intersection = googlePolygon.intersectWithPolyLine(s2Polyline);
195-
return new BcS2MultiLineString(intersection);
196+
if (intersection.size() == 1) {
197+
return new BcS2LineString(intersection.get(0));
198+
} else {
199+
return new BcS2MultiLineString(intersection);
200+
}
196201
}
197202

198203
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)