Skip to content

Commit 1f6e76b

Browse files
committed
add handling of fill value geo-locations
1 parent d1120d2 commit 1f6e76b

File tree

7 files changed

+78
-43
lines changed

7 files changed

+78
-43
lines changed

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/Era5PostProcessing.java

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ private static InterpolationContext createInterpolationContext_2D(Array lonArray
7171

7272
final float lon = lonArray.getFloat(lonIdx);
7373
final float lat = latArray.getFloat(latIdx);
74+
if (!(isValidLon(lon) && isValidLat(lat))) {
75+
// we cannot interpolate here tb 2021-05-04
76+
continue;
77+
}
7478

7579
// + detect four era5 corner-points for interpolation
7680
// + calculate longitude delta -> a
@@ -92,14 +96,7 @@ private static InterpolationContext createInterpolationContext_2D(Array lonArray
9296
yMax = era5_Y_min;
9397
}
9498

95-
final double era5LonMin = era5_X_min * 0.25 - 180.0;
96-
final double era5LatMin = 90.0 - era5_Y_min * 0.25;
97-
98-
// we have a quarter degree raster and need to normalize the distance tb 2020-11-20
99-
final double lonDelta = (lon - era5LonMin) * 4.0;
100-
final double latDelta = (era5LatMin - lat) * 4.0;
101-
102-
final BilinearInterpolator interpolator = new BilinearInterpolator(lonDelta, latDelta, era5_X_min, era5_Y_min);
99+
final BilinearInterpolator interpolator = createInterpolator(lon, lat, era5_X_min, era5_Y_min);
103100
context.set(x, y, interpolator);
104101
}
105102

@@ -110,6 +107,17 @@ private static InterpolationContext createInterpolationContext_2D(Array lonArray
110107
return context;
111108
}
112109

110+
static BilinearInterpolator createInterpolator(float lon, float lat, int era5_X_min, int era5_Y_min) {
111+
final double era5LonMin = era5_X_min * 0.25 - 180.0;
112+
final double era5LatMin = 90.0 - era5_Y_min * 0.25;
113+
114+
// we have a quarter degree raster and need to normalize the distance tb 2020-11-20
115+
final double lonDelta = (lon - era5LonMin) * 4.0;
116+
final double latDelta = (era5LatMin - lat) * 4.0;
117+
118+
return new BilinearInterpolator(lonDelta, latDelta, era5_X_min, era5_Y_min);
119+
}
120+
113121
private static InterpolationContext createInterpolationContext_1D(Array lonArray, Array latArray) {
114122
final InterpolationContext context = new InterpolationContext(1, 1);
115123

@@ -119,14 +127,7 @@ private static InterpolationContext createInterpolationContext_1D(Array lonArray
119127
final int era5_X_min = getEra5LonMin(lon);
120128
final int era5_Y_min = getEra5LatMin(lat);
121129

122-
final double era5LonMin = era5_X_min * 0.25 - 180.0;
123-
final double era5LatMin = 90.0 - era5_Y_min * 0.25;
124-
125-
// we have a quarter degree raster and need to normalize the distance tb 2020-11-20
126-
final double lonDelta = (lon - era5LonMin) * 4.0;
127-
final double latDelta = (era5LatMin - lat) * 4.0;
128-
129-
final BilinearInterpolator interpolator = new BilinearInterpolator(lonDelta, latDelta, era5_X_min, era5_Y_min);
130+
final BilinearInterpolator interpolator = createInterpolator(lon, lat, era5_X_min, era5_Y_min);
130131
context.set(0, 0, interpolator);
131132

132133
final Rectangle era5Rect = new Rectangle(era5_X_min, era5_Y_min, 2, 2);
@@ -135,6 +136,14 @@ private static InterpolationContext createInterpolationContext_1D(Array lonArray
135136
return context;
136137
}
137138

139+
static boolean isValidLon(float lon) {
140+
return lon >= -180.f && lon <= 180.f ;
141+
}
142+
143+
static boolean isValidLat(float lat) {
144+
return lat >= -90.f && lat <= 90.f ;
145+
}
146+
138147
@Override
139148
protected void prepare(NetcdfFile reader, NetcdfFileWriter writer) {
140149
final Dimension matchupCountDimension = reader.findDimension(FiduceoConstants.MATCHUP_COUNT);

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/InterpolationContext.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ class InterpolationContext {
1717

1818
BilinearInterpolator get(int x, int y) {
1919
checkBoundaries(x, y);
20-
21-
final BilinearInterpolator interpolator = interpolators[y][x];
22-
if (interpolator == null) {
23-
throw new IllegalArgumentException("Interpolator not set at " + x + ", " + y);
24-
}
25-
return interpolator;
20+
return interpolators[y][x];
2621
}
2722

2823
public void set(int x, int y, BilinearInterpolator interpolator) {

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/MatchupFields.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
import ucar.ma2.DataType;
77
import ucar.ma2.Index;
88
import ucar.ma2.InvalidRangeException;
9-
import ucar.nc2.*;
109
import ucar.nc2.Dimension;
10+
import ucar.nc2.*;
1111

1212
import java.awt.*;
1313
import java.io.IOException;
14-
import java.util.*;
1514
import java.util.List;
15+
import java.util.*;
1616

1717
import static com.bc.fiduceo.post.plugin.era5.VariableUtils.*;
1818

19-
class MatchupFields extends FieldsProcessor{
19+
class MatchupFields extends FieldsProcessor {
2020

2121
private static final int SECS_PER_HOUR = 3600;
2222

@@ -113,6 +113,8 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
113113
// iterate over time stamps
114114
for (int t = 0; t < numTimeSteps; t++) {
115115
timeIndex.set(m, t);
116+
targetIndex.set(m, t);
117+
116118
final int timeStamp = targetTimeArray.getInt(timeIndex);
117119
VariableCache.CacheEntry cacheEntry = variableCache.get(variableKey, timeStamp);
118120

@@ -121,6 +123,10 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
121123
subset = NetCDFUtils.scaleIfNecessary(cacheEntry.variable, subset);
122124
final Index subsetIndex = subset.getIndex();
123125
final BilinearInterpolator bilinearInterpolator = interpolationContext.get(0, 0);
126+
if (bilinearInterpolator == null) {
127+
targetArray.setFloat(targetIndex, TemplateVariable.getFillValue());
128+
continue;
129+
}
124130

125131
subsetIndex.set(0, 0);
126132
final float c00 = subset.getFloat(subsetIndex);
@@ -135,7 +141,6 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
135141
final float c11 = subset.getFloat(subsetIndex);
136142
final double interpolated = bilinearInterpolator.interpolate(c00, c10, c01, c11);
137143

138-
targetIndex.set(m, t);
139144
targetArray.setFloat(targetIndex, (float) interpolated);
140145
}
141146
}

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/SatelliteFields.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,6 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
225225
final int width = shape[1];
226226
final int height = shape[0];
227227

228-
//final Rectangle era5RasterPosition = Era5PostProcessing.getEra5RasterPosition(geoRegion);
229228
final InterpolationContext interpolationContext = Era5PostProcessing.getInterpolationContext(lonLayer, latLayer);
230229
final Rectangle layerRegion = interpolationContext.getEra5Region();
231230

@@ -250,7 +249,14 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
250249
if (rank == 2) {
251250
for (int y = 0; y < height; y++) {
252251
for (int x = 0; x < width; x++) {
252+
targetIndex.set(m, y, x);
253+
253254
final BilinearInterpolator interpolator = interpolationContext.get(x, y);
255+
if (interpolator == null) {
256+
targetArray.setFloat(targetIndex, TemplateVariable.getFillValue());
257+
continue;
258+
}
259+
254260
final int offsetX = interpolator.getXMin() - layerRegion.x;
255261
final int offsetY = interpolator.getYMin() - layerRegion.y;
256262

@@ -267,15 +273,22 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
267273
final float c11 = subset.getFloat(subsetIndex);
268274

269275
final double interpolate = interpolator.interpolate(c00, c01, c10, c11);
270-
targetIndex.set(m, y, x);
276+
271277
targetArray.setFloat(targetIndex, (float) interpolate);
272278
}
273279
}
274280
} else if (rank == 3) {
275281
for (int z = 0; z < numLayers; z++) {
276282
for (int y = 0; y < height; y++) {
277283
for (int x = 0; x < width; x++) {
284+
targetIndex.set(m, z, y, x);
285+
278286
final BilinearInterpolator interpolator = interpolationContext.get(x, y);
287+
if (interpolator == null) {
288+
targetArray.setFloat(targetIndex, TemplateVariable.getFillValue());
289+
continue;
290+
}
291+
279292
final int offsetX = interpolator.getXMin() - layerRegion.x;
280293
final int offsetY = interpolator.getYMin() - layerRegion.y;
281294

@@ -292,7 +305,7 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
292305
final float c11 = subset.getFloat(subsetIndex);
293306

294307
final double interpolate = interpolator.interpolate(c00, c01, c10, c11);
295-
targetIndex.set(m, z, y, x);
308+
296309
targetArray.setFloat(targetIndex, (float) interpolate);
297310
}
298311
}

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/TemplateVariable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class TemplateVariable {
2020
this.is3d = is3d;
2121
}
2222

23-
float getFillValue() {
23+
static float getFillValue() {
2424
return FILL_VALUE;
2525
}
2626

post-processing-tool/src/test/java/com/bc/fiduceo/post/plugin/era5/Era5PostProcessingTest.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66

77
import java.awt.*;
88

9-
import static org.junit.Assert.assertEquals;
10-
import static org.junit.Assert.assertNotNull;
9+
import static org.junit.Assert.*;
1110

1211
public class Era5PostProcessingTest {
1312

@@ -68,7 +67,7 @@ public void testGetInterpolationContext_singlePixel() {
6867
}
6968

7069
@Test
71-
public void testgetEra5Collection_fromConfig() {
70+
public void testGetEra5Collection_fromConfig() {
7271
final Configuration configuration = new Configuration();
7372
configuration.setNWPAuxDir("/yamas/strange/path");
7473
configuration.setEra5Collection("Hamasuki");
@@ -78,7 +77,7 @@ public void testgetEra5Collection_fromConfig() {
7877
}
7978

8079
@Test
81-
public void testgetEra5Collection_fromPath_unknown() {
80+
public void testGetEra5Collection_fromPath_unknown() {
8281
final Configuration configuration = new Configuration();
8382
configuration.setNWPAuxDir("/yamas/strange/path");
8483

@@ -87,7 +86,7 @@ public void testgetEra5Collection_fromPath_unknown() {
8786
}
8887

8988
@Test
90-
public void testgetEra5Collection_fromPath() {
89+
public void testGetEra5Collection_fromPath() {
9190
final Configuration configuration = new Configuration();
9291

9392
configuration.setNWPAuxDir("/data/era5");
@@ -133,4 +132,24 @@ public void testGetLatMin() {
133132
assertEquals(448, Era5PostProcessing.getEra5LatMin(-22.19f));
134133
assertEquals(719, Era5PostProcessing.getEra5LatMin(-89.95f));
135134
}
135+
136+
@Test
137+
public void testIsValidLon() {
138+
assertTrue(Era5PostProcessing.isValidLon(12.8f));
139+
assertTrue(Era5PostProcessing.isValidLon(-176.3f));
140+
141+
assertFalse(Era5PostProcessing.isValidLon(1087f));
142+
assertFalse(Era5PostProcessing.isValidLon(9.96921E36f));
143+
assertFalse(Era5PostProcessing.isValidLon(Float.NaN));
144+
}
145+
146+
@Test
147+
public void testIsValidLat() {
148+
assertTrue(Era5PostProcessing.isValidLat(33.9f));
149+
assertTrue(Era5PostProcessing.isValidLat(-76.3f));
150+
151+
assertFalse(Era5PostProcessing.isValidLat(-92.6f));
152+
assertFalse(Era5PostProcessing.isValidLat(9.96921E36f));
153+
assertFalse(Era5PostProcessing.isValidLat(Float.NaN));
154+
}
136155
}

post-processing-tool/src/test/java/com/bc/fiduceo/post/plugin/era5/InterpolationContextTest.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,15 @@
44

55
import java.awt.*;
66

7-
import static org.junit.Assert.assertEquals;
8-
import static org.junit.Assert.assertSame;
9-
import static org.junit.Assert.fail;
7+
import static org.junit.Assert.*;
108

119
public class InterpolationContextTest {
1210

1311
@Test
1412
public void testConstructEmpty() {
1513
final InterpolationContext context = new InterpolationContext(3, 5);
1614

17-
try {
18-
context.get(1, 2);
19-
fail("IllegalArgumentException expected");
20-
} catch (IllegalArgumentException expected) {
21-
}
15+
assertNull(context.get(1, 2));
2216
}
2317

2418
@Test

0 commit comments

Comments
 (0)