Skip to content

Commit cf67f41

Browse files
authored
Merge pull request #8 from bcdev/TB_smos_gridded_daily
Tb smos gridded daily
2 parents 161f7b1 + 7f88134 commit cf67f41

File tree

55 files changed

+2514
-124
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+2514
-124
lines changed

core/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
<groupId>org.apache.commons</groupId>
5858
<artifactId>commons-dbcp2</artifactId>
5959
</dependency>
60+
61+
<dependency>
62+
<groupId>org.apache.commons</groupId>
63+
<artifactId>commons-compress</artifactId>
64+
</dependency>
65+
6066
<dependency>
6167
<groupId>mysql</groupId>
6268
<artifactId>mysql-connector-java</artifactId>
@@ -112,6 +118,7 @@
112118
<artifactId>jimfs</artifactId>
113119
<scope>test</scope>
114120
</dependency>
121+
115122
</dependencies>
116123

117124
<build>

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/GeometryFactory.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,19 @@ public Polygon createPolygon(List<Point> points) {
8080
return factoryImpl.createPolygon(points);
8181
}
8282

83+
@Override
84+
public MultiPolygon createMultiPolygon(List<Polygon> polygonList) {
85+
return factoryImpl.createMultiPolygon(polygonList);
86+
}
87+
8388
@Override
8489
public LineString createLineString(List<Point> points) {
8590
return factoryImpl.createLineString(points);
8691
}
8792

8893
@Override
89-
public MultiPolygon createMultiPolygon(List<Polygon> polygonList) {
90-
return factoryImpl.createMultiPolygon(polygonList);
94+
public MultiLineString createMultiLineString(List<LineString> lineStrings) {
95+
return factoryImpl.createMultiLineString(lineStrings);
9196
}
9297

9398
@Override

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public interface GeometryFactoryInterface {
3939

4040
LineString createLineString(List<Point> points);
4141

42+
MultiLineString createMultiLineString(List<LineString> points);
43+
4244
MultiPolygon createMultiPolygon(List<Polygon> polygonList);
4345

4446
TimeAxis createTimeAxis(LineString lineString, Date startTime, Date endTime);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.bc.fiduceo.geometry;
2+
3+
import com.bc.fiduceo.math.TimeInterval;
4+
5+
import java.util.Date;
6+
7+
public class L3TimeAxis implements TimeAxis {
8+
9+
private final Date startDate;
10+
private final Date stopDate;
11+
private final Geometry geometry;
12+
13+
public L3TimeAxis(Date startDate, Date stopDate, Geometry geometry) {
14+
this.startDate = startDate;
15+
this.stopDate = stopDate;
16+
this.geometry = geometry;
17+
}
18+
19+
@Override
20+
public TimeInterval getIntersectionTime(Polygon polygon) {
21+
return new TimeInterval(startDate, stopDate);
22+
}
23+
24+
@Override
25+
public TimeInterval getProjectionTime(LineString polygonSide) {
26+
return new TimeInterval(startDate, stopDate);
27+
}
28+
29+
@Override
30+
public Date getTime(Point coordinate) {
31+
final long avgTime = (stopDate.getTime() + startDate.getTime()) / 2;
32+
33+
return new Date(avgTime);
34+
}
35+
36+
@Override
37+
public Date getStartTime() {
38+
return startDate;
39+
}
40+
41+
@Override
42+
public Date getEndTime() {
43+
return stopDate;
44+
}
45+
46+
@Override
47+
public Geometry getGeometry() {
48+
return geometry;
49+
}
50+
51+
@Override
52+
public long getDurationInMillis() {
53+
return stopDate.getTime() - startDate.getTime();
54+
}
55+
}

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/JTSLineString.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public boolean isEmpty() {
4747

4848
@Override
4949
public boolean isValid() {
50-
throw new RuntimeException("not implemented");
50+
return jtsLineString.isValid();
5151
}
5252

5353
@Override
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.bc.fiduceo.geometry.jts;
2+
3+
import com.bc.fiduceo.geometry.Geometry;
4+
import com.bc.fiduceo.geometry.MultiLineString;
5+
import com.bc.fiduceo.geometry.Point;
6+
7+
public class JTSMultiLineString implements MultiLineString {
8+
9+
private final com.vividsolutions.jts.geom.MultiLineString jtsMultiLineString;
10+
11+
public JTSMultiLineString(com.vividsolutions.jts.geom.MultiLineString jtsMultiLineString) {
12+
this.jtsMultiLineString = jtsMultiLineString;
13+
}
14+
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+
25+
@Override
26+
public Geometry getIntersection(Geometry other) {
27+
throw new RuntimeException("not implemented");
28+
}
29+
30+
@Override
31+
public boolean isEmpty() {
32+
return jtsMultiLineString.isEmpty();
33+
}
34+
35+
@Override
36+
public boolean isValid() {
37+
return jtsMultiLineString.isValid();
38+
}
39+
40+
@Override
41+
public Point[] getCoordinates() {
42+
return new Point[0];
43+
}
44+
45+
@Override
46+
public String toString() {
47+
return jtsMultiLineString.toString();
48+
}
49+
50+
@Override
51+
public Object getInner() {
52+
return null;
53+
}
54+
}

0 commit comments

Comments
 (0)