Skip to content

Commit 0404169

Browse files
committed
intermediate
1 parent 3a2957b commit 0404169

File tree

12 files changed

+394
-26
lines changed

12 files changed

+394
-26
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>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
12+
public L3TimeAxis(Date startDate, Date stopDate) {
13+
this.startDate = startDate;
14+
this.stopDate = stopDate;
15+
}
16+
17+
@Override
18+
public TimeInterval getIntersectionTime(Polygon polygon) {
19+
return new TimeInterval(startDate, stopDate);
20+
}
21+
22+
@Override
23+
public TimeInterval getProjectionTime(LineString polygonSide) {
24+
return new TimeInterval(startDate, stopDate);
25+
}
26+
27+
@Override
28+
public Date getTime(Point coordinate) {
29+
return null;
30+
}
31+
32+
@Override
33+
public Date getStartTime() {
34+
return startDate;
35+
}
36+
37+
@Override
38+
public Date getEndTime() {
39+
return stopDate;
40+
}
41+
42+
@Override
43+
public Geometry getGeometry() {
44+
return null;
45+
}
46+
47+
@Override
48+
public long getDurationInMillis() {
49+
return stopDate.getTime() - startDate.getTime();
50+
}
51+
}

core/src/main/java/com/bc/fiduceo/reader/ReaderUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public static int getChannelIndex(String variableName) {
111111

112112
public static boolean isCompressed(File file) {
113113
final String extension = FileUtils.getExtension(file);
114-
return extension.equalsIgnoreCase(".gz") || extension.equalsIgnoreCase(".zip");
114+
return extension.equalsIgnoreCase(".gz") || extension.equalsIgnoreCase(".tgz")|| extension.equalsIgnoreCase(".zip");
115115
}
116116

117117
/**

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

Lines changed: 129 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,116 @@
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;
57
import com.bc.fiduceo.geometry.Polygon;
68
import com.bc.fiduceo.location.PixelLocator;
79
import com.bc.fiduceo.reader.AcquisitionInfo;
8-
import com.bc.fiduceo.reader.Reader;
910
import com.bc.fiduceo.reader.ReaderContext;
10-
import com.bc.fiduceo.reader.snap.SNAP_PixelLocator;
11+
import com.bc.fiduceo.reader.ReaderUtils;
12+
import com.bc.fiduceo.reader.netcdf.NetCDFReader;
1113
import com.bc.fiduceo.reader.time.TimeLocator;
12-
import org.esa.snap.core.datamodel.CrsGeoCoding;
13-
import org.geotools.referencing.CRS;
14-
import org.opengis.referencing.FactoryException;
15-
import org.opengis.referencing.crs.CoordinateReferenceSystem;
16-
import org.opengis.referencing.operation.TransformException;
14+
import com.bc.fiduceo.util.TimeUtils;
15+
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
16+
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
17+
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
18+
import org.esa.snap.core.util.io.FileUtils;
1719
import ucar.ma2.Array;
1820
import ucar.ma2.ArrayInt;
1921
import ucar.ma2.InvalidRangeException;
2022
import ucar.nc2.Variable;
2123

22-
import java.io.File;
23-
import java.io.IOException;
24-
import java.util.Iterator;
24+
import java.io.*;
25+
import java.util.ArrayList;
26+
import java.util.Calendar;
2527
import java.util.List;
26-
import java.util.Set;
2728

28-
public class SmosL1CDailyGriddedReader implements Reader {
29-
public SmosL1CDailyGriddedReader(ReaderContext readerContext) {
29+
class SmosL1CDailyGriddedReader extends NetCDFReader {
3030

31+
private final ReaderContext readerContext;
32+
33+
private File productDir;
34+
35+
SmosL1CDailyGriddedReader(ReaderContext readerContext) {
36+
this.readerContext = readerContext;
3137
}
3238

3339
@Override
3440
public void open(File file) throws IOException {
35-
throw new IllegalStateException("not implemented");
41+
if (ReaderUtils.isCompressed(file)) {
42+
final String fileName = FileUtils.getFilenameWithoutExtension(file);
43+
final long millis = System.currentTimeMillis();
44+
productDir = readerContext.createDirInTempDir(fileName + millis);
45+
46+
try {
47+
final File inputFile = extractFromTar(file);
48+
super.open(inputFile);
49+
} catch (Exception e) {
50+
throw new IOException(e.getMessage());
51+
}
52+
} else {
53+
throw new IOException("Unsupported format, this reader accepts only compressed input (tgz)");
54+
}
3655
}
3756

3857
@Override
3958
public void close() throws IOException {
40-
throw new IllegalStateException("not implemented");
59+
super.close();
60+
if (productDir != null) {
61+
readerContext.deleteTempFile(productDir);
62+
productDir = null;
63+
}
4164
}
4265

4366
@Override
4467
public AcquisitionInfo read() throws IOException {
45-
throw new IllegalStateException("not implemented");
68+
final AcquisitionInfo acquisitionInfo = new AcquisitionInfo();
69+
final Array longitudes = arrayCache.get("lon");
70+
final Array latitudes = arrayCache.get("lat");
71+
72+
final Polygon polygon = extractPolygonFromMinMax(longitudes, latitudes, readerContext.getGeometryFactory());
73+
acquisitionInfo.setBoundingGeometry(polygon);
74+
75+
final String location = netcdfFile.getLocation();
76+
final String filename = FileUtils.getFilenameFromPath(location);
77+
final int[] ymd = extractYearMonthDayFromFilename(filename);
78+
final Calendar utcCalendar = TimeUtils.getUTCCalendar();
79+
utcCalendar.set(Calendar.YEAR, ymd[0]);
80+
utcCalendar.set(Calendar.MONTH, ymd[1] - 1); // month is zero-based tb 2022-09-15
81+
utcCalendar.set(Calendar.DAY_OF_MONTH, ymd[2]);
82+
83+
acquisitionInfo.setSensingStart(utcCalendar.getTime());
84+
85+
utcCalendar.set(Calendar.HOUR, 23);
86+
utcCalendar.set(Calendar.MINUTE, 59);
87+
utcCalendar.set(Calendar.SECOND, 59);
88+
89+
acquisitionInfo.setSensingStop(utcCalendar.getTime());
90+
91+
return acquisitionInfo;
92+
}
93+
94+
// package access for testing only tb 2022-09-15
95+
static Polygon extractPolygonFromMinMax(Array longitudes, Array latitudes, GeometryFactory geometryFactory) {
96+
int size = (int) longitudes.getSize();
97+
final double lonMin = longitudes.getDouble(0);
98+
final double lonMax = longitudes.getDouble(size - 1);
99+
100+
size = (int) latitudes.getSize();
101+
final double latMin = latitudes.getDouble(0);
102+
final double latMax = latitudes.getDouble(size - 1);
103+
104+
final Point ll = geometryFactory.createPoint(lonMin, latMin);
105+
final Point ul = geometryFactory.createPoint(lonMin, latMax);
106+
final Point ur = geometryFactory.createPoint(lonMax, latMax);
107+
final Point lr = geometryFactory.createPoint(lonMax, latMin);
108+
final ArrayList<Point> polygonPoints = new ArrayList<>();
109+
polygonPoints.add(ll);
110+
polygonPoints.add(ul);
111+
polygonPoints.add(ur);
112+
polygonPoints.add(lr);
113+
polygonPoints.add(ll);
114+
return geometryFactory.createPolygon(polygonPoints);
46115
}
47116

48117
@Override
@@ -67,7 +136,12 @@ public TimeLocator getTimeLocator() throws IOException {
67136

68137
@Override
69138
public int[] extractYearMonthDayFromFilename(String fileName) {
70-
throw new IllegalStateException("not implemented");
139+
final String datePart = fileName.substring(19, 27);
140+
final int[] ymd = new int[3];
141+
ymd[0] = Integer.parseInt(datePart.substring(0, 4));
142+
ymd[1] = Integer.parseInt(datePart.substring(4, 6));
143+
ymd[2] = Integer.parseInt(datePart.substring(6, 8));
144+
return ymd;
71145
}
72146

73147
@Override
@@ -97,11 +171,47 @@ public Dimension getProductSize() throws IOException {
97171

98172
@Override
99173
public String getLongitudeVariableName() {
100-
throw new IllegalStateException("not implemented");
174+
return "lon";
101175
}
102176

103177
@Override
104178
public String getLatitudeVariableName() {
105-
throw new IllegalStateException("not implemented");
179+
return "lat";
180+
}
181+
182+
183+
private File extractFromTar(File file) throws IOException {
184+
TarArchiveInputStream tarIn = null;
185+
final int oneMb = 1024 * 1024;
186+
187+
try {
188+
final BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
189+
final GzipCompressorInputStream gzipIn = new GzipCompressorInputStream(inputStream);
190+
tarIn = new TarArchiveInputStream(gzipIn);
191+
192+
TarArchiveEntry entry;
193+
while ((entry = (TarArchiveEntry) tarIn.getNextEntry()) != null) {
194+
if (entry.isFile()) {
195+
if (entry.getName().endsWith(".DBL.nc")) {
196+
// uncompress and open
197+
int count;
198+
byte[] data = new byte[oneMb];
199+
final File targetFile = new File(productDir, entry.getName());
200+
FileOutputStream fos = new FileOutputStream(targetFile, false);
201+
try (BufferedOutputStream dest = new BufferedOutputStream(fos, oneMb)) {
202+
while ((count = tarIn.read(data, 0, oneMb)) != -1) {
203+
dest.write(data, 0, count);
204+
}
205+
}
206+
return targetFile;
207+
}
208+
}
209+
}
210+
throw new IOException("No suitable netcdf file found in tar");
211+
} finally {
212+
if (tarIn != null) {
213+
tarIn.close();
214+
}
215+
}
106216
}
107217
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public class SmosL1CDailyGriddedReaderPlugin implements ReaderPlugin {
99

10-
private static String[] SENSOR_KEYS = new String[]{"miras-smos-daily-gridded"};
10+
private static final String[] SENSOR_KEYS = new String[]{"miras-smos-CDF3TD", "miras-smos-CDF3TA"};
1111

1212
@Override
1313
public Reader createReader(ReaderContext readerContext) {
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.TestUtil;
4+
import com.bc.fiduceo.math.TimeInterval;
5+
import com.bc.fiduceo.util.TimeUtils;
6+
import org.junit.Before;
7+
import org.junit.Test;
8+
9+
import java.util.Date;
10+
11+
import static org.junit.Assert.assertEquals;
12+
13+
public class L3TimeAxisTest {
14+
15+
private L3TimeAxis timeAxis;
16+
17+
@Before
18+
public void setUp(){
19+
final Date startDate = TimeUtils.parse("20190107T000000", "yyyyMMdd'T'HHmmss");
20+
final Date stopDate = TimeUtils.parse("20190107T235959", "yyyyMMdd'T'HHmmss");
21+
timeAxis = new L3TimeAxis(startDate, stopDate);
22+
}
23+
24+
@Test
25+
public void testGetIntersectionTime() {
26+
final TimeInterval intersectionTime = timeAxis.getIntersectionTime(null);// we don't care about the polygon tb 2022-09-15
27+
TestUtil.assertCorrectUTCDate(2019, 1, 7, 0, 0, 0, intersectionTime.getStartTime());
28+
TestUtil.assertCorrectUTCDate(2019, 1, 7, 23, 59, 59, intersectionTime.getStopTime());
29+
}
30+
31+
@Test
32+
public void testGetProjectionTime() {
33+
final TimeInterval projectionTime = timeAxis.getProjectionTime(null);// we don't care about the geometry tb 2022-09-15
34+
TestUtil.assertCorrectUTCDate(2019, 1, 7, 0, 0, 0, projectionTime.getStartTime());
35+
TestUtil.assertCorrectUTCDate(2019, 1, 7, 23, 59, 59, projectionTime.getStopTime());
36+
}
37+
38+
@Test
39+
public void testGetStartTime() {
40+
final Date startTime = timeAxis.getStartTime();
41+
TestUtil.assertCorrectUTCDate(2019, 1, 7, 0, 0, 0, startTime);
42+
}
43+
44+
@Test
45+
public void testGetEndTime() {
46+
final Date endTime = timeAxis.getEndTime();
47+
TestUtil.assertCorrectUTCDate(2019, 1, 7, 23, 59, 59, endTime);
48+
}
49+
50+
@Test
51+
public void testGetDurationInMillis() {
52+
assertEquals(86399000, timeAxis.getDurationInMillis());
53+
54+
}
55+
}

core/src/test/java/com/bc/fiduceo/geometry/PaddingFactoryTest.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,7 @@ private void transform(Point[] input, Rotator rotator) {
109109

110110
private Polygon createEnvelope(Point[] input, String locationName) {
111111
final LineString lineString = GF.createLineString(Arrays.asList(input));
112-
final Polygon envelope = PaddingFactory.createLinePadding(lineString, ENVELOPE_WIDTH_KM, GF);
113-
System.out.println("envelope at " + locationName + " = " + envelope);
114-
return envelope;
112+
return PaddingFactory.createLinePadding(lineString, ENVELOPE_WIDTH_KM, GF);
115113
}
116114

117115
private Point[] getPoints(Polygon envelope) {

core/src/test/java/com/bc/fiduceo/reader/ReaderUtilsTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public void testGetChannelIndex() {
114114
public void testIsCompressed() {
115115
assertTrue(ReaderUtils.isCompressed(new File("/home/tom/GW1AM2_201707160510_232D_L1SGRTBR_2220220.h5.gz")));
116116
assertTrue(ReaderUtils.isCompressed(new File("/some/where/else/S3A_SL_1_RBT____20181026T231611_20181026T231911_20181028T023445_0180_037_187_0900_LN2_O_NT_003.zip")));
117+
assertTrue(ReaderUtils.isCompressed(new File("/some/whatever/SM_RE07_MIR_CDF3TA_20160610T000000_20160610T235959_330_001_7.tgz")));
117118

118119
assertFalse(ReaderUtils.isCompressed(new File("/home/tom/GW1AM2_201707160510_232D_L1SGRTBR_2220220.h5")));
119120
}

core/src/test/java/com/bc/fiduceo/reader/smos/SmosL1CDailyGriddedReaderPluginTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ public void setUp() throws Exception {
1919
@Test
2020
public void testGetSupportedSensorKeys() {
2121
final String[] keys = plugin.getSupportedSensorKeys();
22-
assertEquals(1, keys.length);
23-
assertEquals("miras-smos-daily-gridded", keys[0]);
22+
assertEquals(2, keys.length);
23+
assertEquals("miras-smos-CDF3TD", keys[0]);
24+
assertEquals("miras-smos-CDF3TA", keys[1]);
2425
}
2526

2627
@Test

0 commit comments

Comments
 (0)