Skip to content

Commit 8ffad3f

Browse files
committed
Smos L3 reader intermediate
1 parent 24fd4f7 commit 8ffad3f

File tree

14 files changed

+283
-48
lines changed

14 files changed

+283
-48
lines changed

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);

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: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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 getIntersection(Geometry other) {
17+
throw new RuntimeException("not implemented");
18+
}
19+
20+
@Override
21+
public boolean isEmpty() {
22+
return jtsMultiLineString.isEmpty();
23+
}
24+
25+
@Override
26+
public boolean isValid() {
27+
return jtsMultiLineString.isValid();
28+
}
29+
30+
@Override
31+
public Point[] getCoordinates() {
32+
return new Point[0];
33+
}
34+
35+
@Override
36+
public String toString() {
37+
return jtsMultiLineString.toString();
38+
}
39+
40+
@Override
41+
public Object getInner() {
42+
return null;
43+
}
44+
}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,7 @@
2020

2121
package com.bc.fiduceo.geometry.jts;
2222

23-
import com.bc.fiduceo.geometry.AbstractGeometryFactory;
24-
import com.bc.fiduceo.geometry.Geometry;
25-
import com.bc.fiduceo.geometry.LineString;
26-
import com.bc.fiduceo.geometry.Point;
27-
import com.bc.fiduceo.geometry.Polygon;
28-
import com.bc.fiduceo.geometry.TimeAxis;
23+
import com.bc.fiduceo.geometry.*;
2924
import com.vividsolutions.jts.geom.Coordinate;
3025
import com.vividsolutions.jts.geom.GeometryFactory;
3126
import com.vividsolutions.jts.geom.MultiPolygon;
@@ -89,6 +84,8 @@ private static Geometry convertGeometry(com.vividsolutions.jts.geom.Geometry geo
8984
return new JTSLineString((com.vividsolutions.jts.geom.LineString) geometry);
9085
} else if (geometry instanceof com.vividsolutions.jts.geom.Point) {
9186
return new JTSPoint(geometry.getCoordinate());
87+
} else if (geometry instanceof com.vividsolutions.jts.geom.MultiLineString) {
88+
return new JTSMultiLineString((com.vividsolutions.jts.geom.MultiLineString) geometry);
9289
}
9390
throw new RuntimeException("Unsupported geometry type");
9491
}
@@ -158,6 +155,11 @@ public Polygon createPolygon(List<Point> points) {
158155
}
159156
}
160157

158+
@Override
159+
public com.bc.fiduceo.geometry.MultiPolygon createMultiPolygon(List<Polygon> polygonList) {
160+
throw new RuntimeException("not implemented");
161+
}
162+
161163
@Override
162164
public LineString createLineString(List<Point> points) {
163165
final Coordinate[] coordinates = extractCoordinates(points);
@@ -167,8 +169,8 @@ public LineString createLineString(List<Point> points) {
167169
}
168170

169171
@Override
170-
public com.bc.fiduceo.geometry.MultiPolygon createMultiPolygon(List<Polygon> polygonList) {
171-
return null;
172+
public MultiLineString createMultiLineString(List<LineString> points) {
173+
throw new RuntimeException("not implemented");
172174
}
173175

174176
@Override

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Geometry parse(String wkt) {
4848
} else if (geometry instanceof S2Point) {
4949
return BcS2Point.createFrom((S2Point) geometry);
5050
} else if (geometry instanceof List) {
51-
final Object geoObject = ((List<?>) geometry).get(0);
51+
final Object geoObject = ((List<?>) geometry).get(0);
5252
if (geoObject instanceof S2Polygon) {
5353
final ArrayList<Polygon> polygonList = new ArrayList<>();
5454
final List<S2Polygon> googlePolygonList = (List<S2Polygon>) geometry;
@@ -104,6 +104,11 @@ public Polygon createPolygon(List<Point> points) {
104104
return new BcS2Polygon(googlePolygon);
105105
}
106106

107+
@Override
108+
public MultiPolygon createMultiPolygon(List<Polygon> polygonList) {
109+
return new BcS2MultiPolygon(polygonList);
110+
}
111+
107112
@Override
108113
public LineString createLineString(List<Point> points) {
109114
final List<S2Point> loopPoints = extractS2Points(points);
@@ -113,8 +118,12 @@ public LineString createLineString(List<Point> points) {
113118
}
114119

115120
@Override
116-
public MultiPolygon createMultiPolygon(List<Polygon> polygonList) {
117-
return new BcS2MultiPolygon(polygonList);
121+
public MultiLineString createMultiLineString(List<LineString> lineStrings) {
122+
final List<BcS2LineString> casted = new ArrayList<>();
123+
for (final LineString lineString : lineStrings) {
124+
casted.add((BcS2LineString) lineString);
125+
}
126+
return BcS2MultiLineString.createFrom(casted);
118127
}
119128

120129
@Override

core/src/main/java/com/bc/fiduceo/reader/smos/SmosL1CDailyGriddedReader.java

Lines changed: 74 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22

33
import com.bc.fiduceo.core.Dimension;
44
import com.bc.fiduceo.core.Interval;
5-
import com.bc.fiduceo.geometry.GeometryFactory;
6-
import com.bc.fiduceo.geometry.Point;
7-
import com.bc.fiduceo.geometry.Polygon;
5+
import com.bc.fiduceo.core.NodeType;
6+
import com.bc.fiduceo.geometry.*;
87
import com.bc.fiduceo.location.PixelLocator;
98
import com.bc.fiduceo.reader.AcquisitionInfo;
109
import com.bc.fiduceo.reader.ReaderContext;
@@ -70,11 +69,20 @@ public AcquisitionInfo read() throws IOException {
7069
final Array longitudes = arrayCache.get("lon");
7170
final Array latitudes = arrayCache.get("lat");
7271

73-
final Polygon polygon = extractPolygonFromMinMax(longitudes, latitudes, readerContext.getGeometryFactory());
72+
final double[] geoMinMax = extractMinMax(longitudes, latitudes);
73+
74+
final GeometryFactory geometryFactory = readerContext.getGeometryFactory();
75+
final Polygon polygon = createPolygonFromMinMax(geoMinMax, geometryFactory);
7476
acquisitionInfo.setBoundingGeometry(polygon);
7577

7678
setSensingTimes(acquisitionInfo);
7779

80+
final MultiLineString multiLineString = createMultiLineStringFromMinMax(geoMinMax, geometryFactory);
81+
final TimeAxis timeAxis = new L3TimeAxis(acquisitionInfo.getSensingStart(), acquisitionInfo.getSensingStop(), multiLineString);
82+
acquisitionInfo.setTimeAxes(new TimeAxis[]{timeAxis});
83+
84+
acquisitionInfo.setNodeType(NodeType.UNDEFINED);
85+
7886
return acquisitionInfo;
7987
}
8088

@@ -189,6 +197,10 @@ private void setSensingTimes(AcquisitionInfo acquisitionInfo) {
189197
utcCalendar.set(Calendar.MONTH, ymd[1] - 1); // month is zero-based tb 2022-09-15
190198
utcCalendar.set(Calendar.DAY_OF_MONTH, ymd[2]);
191199

200+
utcCalendar.set(Calendar.HOUR, 0);
201+
utcCalendar.set(Calendar.MINUTE, 0);
202+
utcCalendar.set(Calendar.SECOND, 0);
203+
192204
acquisitionInfo.setSensingStart(utcCalendar.getTime());
193205

194206
utcCalendar.set(Calendar.HOUR, 23);
@@ -199,14 +211,11 @@ private void setSensingTimes(AcquisitionInfo acquisitionInfo) {
199211
}
200212

201213
// package access for testing only tb 2022-09-15
202-
static Polygon extractPolygonFromMinMax(Array longitudes, Array latitudes, GeometryFactory geometryFactory) {
203-
int size = (int) longitudes.getSize();
204-
final double lonMin = longitudes.getDouble(0);
205-
final double lonMax = longitudes.getDouble(size - 1);
206-
207-
size = (int) latitudes.getSize();
208-
final double latMin = latitudes.getDouble(0);
209-
final double latMax = latitudes.getDouble(size - 1);
214+
static Polygon createPolygonFromMinMax(double[] geoMinMax, GeometryFactory geometryFactory) {
215+
final double lonMin = geoMinMax[0];
216+
final double lonMax = geoMinMax[1];
217+
final double latMin = geoMinMax[2];
218+
final double latMax = geoMinMax[3];
210219

211220
final Point ll = geometryFactory.createPoint(lonMin, latMin);
212221
final Point ul = geometryFactory.createPoint(lonMin, latMax);
@@ -220,4 +229,57 @@ static Polygon extractPolygonFromMinMax(Array longitudes, Array latitudes, Geome
220229
polygonPoints.add(ll);
221230
return geometryFactory.createPolygon(polygonPoints);
222231
}
232+
233+
/**
234+
* extract minimal and maximal value of geolocation arrays passed in.
235+
* the resulting array is ordered:
236+
* [0] lonMin
237+
* [1] lonMax
238+
* [2] latMin
239+
* [3] latMax
240+
* package access for testing only tb 2022-09-26
241+
*
242+
* @param longitudes longitude data
243+
* @param latitudes latitude data
244+
* @return array with the extreme values
245+
*/
246+
static double[] extractMinMax(Array longitudes, Array latitudes) {
247+
final double[] minMax = new double[4];
248+
249+
int size = (int) longitudes.getSize();
250+
minMax[0] = longitudes.getDouble(0);
251+
minMax[1] = longitudes.getDouble(size - 1);
252+
253+
size = (int) latitudes.getSize();
254+
minMax[2] = latitudes.getDouble(0);
255+
minMax[3] = latitudes.getDouble(size - 1);
256+
257+
return minMax;
258+
}
259+
260+
// package access for testing only tb 2022-09-26
261+
static MultiLineString createMultiLineStringFromMinMax(double[] geoMinMax, GeometryFactory geometryFactory) {
262+
final double lonMin = geoMinMax[0];
263+
final double lonMax = geoMinMax[1];
264+
265+
final double latMin = geoMinMax[2];
266+
final double latMax = geoMinMax[3];
267+
268+
final List<Point> points = new ArrayList<>();
269+
points.add(geometryFactory.createPoint(lonMin, 0.0));
270+
points.add(geometryFactory.createPoint(lonMax, 0.0));
271+
final LineString we = geometryFactory.createLineString(points);
272+
273+
points.clear();
274+
points.add(geometryFactory.createPoint(0.0, latMax));
275+
points.add(geometryFactory.createPoint(0.0, latMin));
276+
277+
final LineString ns = geometryFactory.createLineString(points);
278+
279+
final List<LineString> lines = new ArrayList<>();
280+
lines.add(we);
281+
lines.add(ns);
282+
283+
return geometryFactory.createMultiLineString(lines);
284+
}
223285
}

core/src/main/resources/META-INF/services/com.bc.fiduceo.reader.ReaderPlugin

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ com.bc.fiduceo.reader.insitu.sirds_sst.SirdsGtmbaInsituReaderPlugin
3333
com.bc.fiduceo.reader.insitu.sirds_sst.SirdsMbtInsituReaderPlugin
3434
com.bc.fiduceo.reader.insitu.sirds_sst.SirdsMooringInsituReaderPlugin
3535
com.bc.fiduceo.reader.insitu.sirds_sst.SirdsShipInsituReaderPlugin
36-
com.bc.fiduceo.reader.insitu.sirds_sst.SirdsXbtInsituReaderPlugin
36+
com.bc.fiduceo.reader.insitu.sirds_sst.SirdsXbtInsituReaderPlugin
37+
com.bc.fiduceo.reader.smos.SmosL1CDailyGriddedReaderPlugin

core/src/test/java/com/bc/fiduceo/TestUtil.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ public static void writeSystemConfig(File configDir, File archiveRoot) throws IO
152152
" <rule sensors = \"mod06-te, myd06-aq, mod35-te, myd35-aq, airs-aq\">" +
153153
" SENSOR/VERSION/YEAR/DAY_OF_YEAR" +
154154
" </rule>" +
155+
" <rule sensors = \"miras-smos-CDF3TD, miras-smos-CDF3TA\">" +
156+
" SENSOR/VERSION/YEAR/DAY_OF_YEAR" +
157+
" </rule>" +
155158
" </archive>" +
156159
" <temp-directory>" +
157160
" " + TestUtil.getTestDir().getAbsolutePath() +

core/src/test/java/com/bc/fiduceo/geometry/jts/JTSGeometryFactoryTest.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535
import java.util.ArrayList;
3636
import java.util.List;
3737

38-
import static org.junit.Assert.assertEquals;
39-
import static org.junit.Assert.assertNotNull;
40-
import static org.junit.Assert.assertTrue;
38+
import static org.junit.Assert.*;
4139

4240
public class JTSGeometryFactoryTest {
4341

@@ -321,6 +319,15 @@ public void testParseLineString() {
321319
assertEquals("LINESTRING (3 1, 3 2, 3 3, 3 4)", geometry.toString());
322320
}
323321

322+
@Test
323+
public void testParseMultiLineString() {
324+
final Geometry geometry = factory.parse("MULTILINESTRING((4 1, 4 2), (4 3, 4 4))");
325+
assertNotNull(geometry);
326+
assertTrue(geometry instanceof JTSMultiLineString);
327+
328+
assertEquals("MULTILINESTRING ((4 1, 4 2), (4 3, 4 4))", geometry.toString());
329+
}
330+
324331
@Test
325332
public void testParsePoint() {
326333
final Geometry geometry = factory.parse("POINT(4 0)");
@@ -333,4 +340,21 @@ public void testParsePoint() {
333340
assertEquals(0.0, point.getLat(), 1e-8);
334341
}
335342

343+
@Test
344+
public void testParseUnsupported() {
345+
try {
346+
factory.parse("MULTIPOINT((4 0), (5 1))");
347+
fail("RuntimeException expected");
348+
} catch (RuntimeException expected) {
349+
}
350+
}
351+
352+
@Test
353+
public void testParseInvalid() {
354+
try {
355+
factory.parse("Razupaltuff");
356+
fail("RuntimeException expected");
357+
} catch (RuntimeException expected) {
358+
}
359+
}
336360
}

0 commit comments

Comments
 (0)