Skip to content

Commit b3c3626

Browse files
committed
added switch for geocoding source tie-point/pixel
1 parent 5c479d7 commit b3c3626

File tree

26 files changed

+281
-60
lines changed

26 files changed

+281
-60
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public class ReaderContext {
3131
private GeometryFactory geometryFactory;
3232
private TempFileUtils tempFileUtils;
3333
private Archive archive;
34+
private String configDir;
35+
36+
public ReaderContext() {
37+
configDir = "./config";
38+
}
3439

3540
public GeometryFactory getGeometryFactory() {
3641
return geometryFactory;
@@ -63,4 +68,12 @@ public Archive getArchive() {
6368
public void setArchive(Archive archive) {
6469
this.archive = archive;
6570
}
71+
72+
public void setConfigDir(String configDir) {
73+
this.configDir = configDir;
74+
}
75+
76+
public String getConfigDir() {
77+
return configDir;
78+
}
6679
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ public class ReaderFactory {
4040
private final HashMap<String, ReaderPlugin> readerPluginHashMap = new HashMap<>();
4141
private final ReaderContext readerContext;
4242

43-
public static ReaderFactory create(GeometryFactory geometryFactory, TempFileUtils tempFileUtils, Archive archive) {
43+
public static ReaderFactory create(GeometryFactory geometryFactory, TempFileUtils tempFileUtils, Archive archive, String configDir) {
4444
if (readerFactory == null) {
45-
readerFactory = new ReaderFactory(geometryFactory, tempFileUtils, archive);
45+
readerFactory = new ReaderFactory(geometryFactory, tempFileUtils, archive, configDir);
4646
}
4747
return readerFactory;
4848
}
@@ -85,11 +85,12 @@ private ReaderPlugin getReaderPluginSafe(String sensorPlatformKey) {
8585
return readerPlugin;
8686
}
8787

88-
private ReaderFactory(GeometryFactory geometryFactory, TempFileUtils tempFileUtils, Archive archive) {
88+
private ReaderFactory(GeometryFactory geometryFactory, TempFileUtils tempFileUtils, Archive archive, String configDir) {
8989
readerContext = new ReaderContext();
9090
readerContext.setGeometryFactory(geometryFactory);
9191
readerContext.setTempFileUtils(tempFileUtils);
9292
readerContext.setArchive(archive);
93+
readerContext.setConfigDir(configDir);
9394

9495
final ServiceRegistryManager serviceRegistryManager = ServiceRegistryManager.getInstance();
9596
final ServiceRegistry<ReaderPlugin> readerRegistry = serviceRegistryManager.getServiceRegistry(ReaderPlugin.class);

core/src/main/java/com/bc/fiduceo/reader/atsr/ATSR_L1B_Reader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public String getLatitudeVariableName() {
7979
}
8080

8181
@Override
82-
public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) {
82+
public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) throws IOException {
8383
// subscene is only relevant for segmented geometries which we do not have tb 2016-08-11
8484
return getPixelLocator();
8585
}

core/src/main/java/com/bc/fiduceo/reader/avhrr_frac/AVHRR_FRAC_Reader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public String getRegEx() {
6767
}
6868

6969
@Override
70-
public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) {
70+
public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) throws IOException {
7171
return getPixelLocator(); // SNAP does not support region-specific geolocations tb 2019-01-17
7272
}
7373

@@ -86,7 +86,7 @@ public int[] extractYearMonthDayFromFilename(String fileName) {
8686
final String yearString = doyToken.substring(1, 3);
8787
final int year = Integer.parseInt(yearString) + 2000; // name format skips 2k tb 2020-09-07
8888

89-
final String doyString = doyToken.substring(3, doyToken.length());
89+
final String doyString = doyToken.substring(3);
9090
final int doy = Integer.parseInt(doyString);
9191

9292
final Calendar calendar = ProductData.UTC.createCalendar();

core/src/main/java/com/bc/fiduceo/reader/slstr/SlstrReader.java

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@
88
import com.bc.fiduceo.reader.AcquisitionInfo;
99
import com.bc.fiduceo.reader.ReaderContext;
1010
import com.bc.fiduceo.reader.ReaderUtils;
11-
import com.bc.fiduceo.reader.slstr.utility.ManifestUtil;
1211
import com.bc.fiduceo.reader.slstr.utility.Transform;
1312
import com.bc.fiduceo.reader.slstr.utility.TransformFactory;
13+
import com.bc.fiduceo.reader.snap.SNAP_PixelLocator;
1414
import com.bc.fiduceo.reader.snap.SNAP_Reader;
1515
import com.bc.fiduceo.reader.snap.VariableProxy;
1616
import com.bc.fiduceo.reader.time.TimeLocator;
1717
import com.bc.fiduceo.reader.time.TimeLocator_MicrosSince2000;
1818
import com.bc.fiduceo.util.NetCDFUtils;
1919
import com.bc.fiduceo.util.TimeUtils;
20+
import org.esa.snap.core.dataio.geocoding.*;
21+
import org.esa.snap.core.dataio.geocoding.forward.PixelForward;
22+
import org.esa.snap.core.dataio.geocoding.inverse.PixelQuadTreeInverse;
23+
import org.esa.snap.core.dataio.geocoding.util.RasterUtils;
2024
import org.esa.snap.core.datamodel.*;
2125
import org.esa.snap.core.util.io.FileUtils;
2226
import org.esa.snap.engine_utilities.util.ZipUtils;
@@ -49,6 +53,8 @@ public class SlstrReader extends SNAP_Reader {
4953
private long[] subs_times;
5054
private TransformFactory transformFactory;
5155
private File productDir;
56+
private SlstrReaderConfig config;
57+
private PixelLocator pixelLocator;
5258

5359
SlstrReader(ReaderContext readerContext, ProductType productType) {
5460
super(readerContext);
@@ -66,6 +72,12 @@ public class SlstrReader extends SNAP_Reader {
6672
} else {
6773
throw new IllegalArgumentException("Unsupported product type");
6874
}
75+
76+
try {
77+
config = SlstrReaderConfig.loadFrom(new File(readerContext.getConfigDir()));
78+
} catch (IOException e) {
79+
throw new RuntimeException(e.getMessage());
80+
}
6981
}
7082

7183
// package access for testing only tb 2019-05-13
@@ -134,6 +146,7 @@ public void close() throws IOException {
134146
productDir = null;
135147
}
136148
transformFactory = null;
149+
pixelLocator = null;
137150
}
138151

139152
@Override
@@ -151,12 +164,41 @@ public String getRegEx() {
151164
}
152165

153166
@Override
154-
public PixelLocator getPixelLocator() {
155-
return new SlstrPixelLocator(product.getSceneGeoCoding(), transformFactory.get(NADIR_500m));
167+
public PixelLocator getPixelLocator() throws IOException {
168+
if (pixelLocator == null) {
169+
if (config.usePixelGeoCoding()) {
170+
final String longitudeVariableName = getLongitudeVariableName();
171+
final RasterDataNode lonBand = product.getRasterDataNode(longitudeVariableName);
172+
final double[] longitudes = RasterUtils.loadGeoData(lonBand);
173+
174+
final String latitudeVariableName = getLatitudeVariableName();
175+
final RasterDataNode latBand = product.getRasterDataNode(latitudeVariableName);
176+
final double[] latitudes = RasterUtils.loadGeoData(latBand);
177+
178+
final Dimension productSize = getProductSize();
179+
final GeoRaster geoRaster = new GeoRaster(longitudes, latitudes,
180+
longitudeVariableName, latitudeVariableName,
181+
productSize.getNx(), productSize.getNx(), productSize.getNx(), productSize.getNy(),
182+
1.0, 0.5, 0.5, 1.0, 1.0);
183+
184+
final ForwardCoding forward = ComponentFactory.getForward(PixelForward.KEY);
185+
final InverseCoding inverse = ComponentFactory.getInverse(PixelQuadTreeInverse.KEY);
186+
final ComponentGeoCoding componentGeoCoding = new ComponentGeoCoding(geoRaster, forward, inverse, GeoChecks.ANTIMERIDIAN);
187+
componentGeoCoding.initialize();
188+
189+
pixelLocator = new SNAP_PixelLocator(componentGeoCoding);
190+
} else {
191+
pixelLocator = new SlstrPixelLocator(product.getSceneGeoCoding(), transformFactory.get(NADIR_500m));
192+
}
193+
}
194+
return pixelLocator;
195+
}
196+
197+
private void etLatitudeVariableName() {
156198
}
157199

158200
@Override
159-
public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) {
201+
public PixelLocator getSubScenePixelLocator(Polygon sceneGeometry) throws IOException {
160202
return getPixelLocator();
161203
}
162204

@@ -307,12 +349,20 @@ public ArrayInt.D2 readAcquisitionTime(int x, int y, Interval interval) {
307349

308350
@Override
309351
public String getLongitudeVariableName() {
310-
return "longitude_tx";
352+
if (config.usePixelGeoCoding()) {
353+
return "longitude_in";
354+
} else {
355+
return "longitude_tx";
356+
}
311357
}
312358

313359
@Override
314360
public String getLatitudeVariableName() {
315-
return "latitude_tx";
361+
if (config.usePixelGeoCoding()) {
362+
return "latitude_in";
363+
} else {
364+
return "latitude_tx";
365+
}
316366
}
317367

318368
protected void readProductData(RasterDataNode dataNode, Array targetArray, int width, int height, int xOffset, int yOffset) throws IOException {

core/src/main/java/com/bc/fiduceo/reader/slstr/SlstrReaderConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,34 @@
11
package com.bc.fiduceo.reader.slstr;
22

3+
import com.bc.fiduceo.core.SystemConfig;
4+
import com.bc.fiduceo.log.FiduceoLogger;
35
import com.bc.fiduceo.util.JDomUtils;
46
import org.jdom.Document;
57
import org.jdom.Element;
68
import org.jdom.JDOMException;
79
import org.jdom.input.SAXBuilder;
810

11+
import java.io.File;
12+
import java.io.FileInputStream;
913
import java.io.IOException;
1014
import java.io.InputStream;
1115

1216
class SlstrReaderConfig {
1317

1418
private boolean usePixelGeoCoding;
1519

20+
public static SlstrReaderConfig loadFrom(File configDirectory) throws IOException {
21+
final File systemPropertiesFile = new File(configDirectory, "slstr-reader-config.xml");
22+
if (!systemPropertiesFile.isFile()) {
23+
FiduceoLogger.getLogger().info("No slstr reader configuration found, using default values.");
24+
return new SlstrReaderConfig();
25+
}
26+
27+
try (FileInputStream inputStream = new FileInputStream(systemPropertiesFile)) {
28+
return load(inputStream);
29+
}
30+
}
31+
1632
SlstrReaderConfig(Document document) {
1733
this();
1834

core/src/main/java/com/bc/fiduceo/reader/snap/SNAP_Reader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public Dimension getProductSize() {
9595
}
9696

9797
@Override
98-
public PixelLocator getPixelLocator() {
98+
public PixelLocator getPixelLocator() throws IOException {
9999
if (pixelLocator == null) {
100100
final GeoCoding geoCoding = product.getSceneGeoCoding();
101101

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public class ReaderCacheTest {
3636
@Before
3737
public void setUp() {
3838
final GeometryFactory geometryFactory = new GeometryFactory(GeometryFactory.Type.S2);
39-
final ReaderFactory readerFactory = ReaderFactory.create(geometryFactory, null, null); // we don't need temp file support here tb 2018-01-23
39+
// we don't need temp file support, archive or configDir here tb 2018-01-23
40+
final ReaderFactory readerFactory = ReaderFactory.create(geometryFactory, null, null, null);
4041
readerCache = new ReaderCache(2, readerFactory, null);
4142
}
4243

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public class ReaderCache_IO_Test {
3030
@Before
3131
public void setUp() {
3232
final GeometryFactory geometryFactory = new GeometryFactory(GeometryFactory.Type.S2);
33-
readerFactory = ReaderFactory.create(geometryFactory, null, null); // we don't need temp file support here tb 2018-01-23
33+
// we don't need temp file support, archive or configDir here tb 2018-01-23
34+
readerFactory = ReaderFactory.create(geometryFactory, null, null, null);
3435
readerCache = new ReaderCache(2, readerFactory, null);
3536
}
3637

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.io.File;
1111
import java.io.IOException;
1212

13+
import static org.junit.Assert.assertEquals;
1314
import static org.junit.Assert.assertSame;
1415
import static org.mockito.Mockito.mock;
1516
import static org.mockito.Mockito.times;
@@ -24,6 +25,11 @@ public void setUp() {
2425
readerContext = new ReaderContext();
2526
}
2627

28+
@Test
29+
public void testConstruction() {
30+
assertEquals("./config", readerContext.getConfigDir());
31+
}
32+
2733
@Test
2834
public void testSetGetGeometryFactory() {
2935
final GeometryFactory geometryFactory = new GeometryFactory(GeometryFactory.Type.JTS);
@@ -52,4 +58,10 @@ public void testSetGetArchive() {
5258
readerContext.setArchive(archive);
5359
assertSame(archive, readerContext.getArchive());
5460
}
61+
62+
@Test
63+
public void testSetGetConfigDir() {
64+
readerContext.setConfigDir("/the/secret/path");
65+
assertEquals("/the/secret/path", readerContext.getConfigDir());
66+
}
5567
}

0 commit comments

Comments
 (0)