@@ -25,91 +25,86 @@ class SatelliteFields {
2525 private Map <String , TemplateVariable > variables ;
2626
2727 static Array readSubset (int numLayers , Rectangle era5RasterPosition , Variable variable ) throws IOException , InvalidRangeException {
28- Array subset = null ;
28+ Array subset ;
29+
2930 final int maxRequestedX = era5RasterPosition .x + era5RasterPosition .width ;
3031 if (era5RasterPosition .x < 0 || maxRequestedX >= RASTER_WIDTH ) {
31- int xMin = 0 ;
32- int xMax ;
33- int leftWidth ;
34- int rightWidth ;
35- if (era5RasterPosition .x < 0 ) {
36- xMax = RASTER_WIDTH + era5RasterPosition .x ; // notabene: rasterposition is negative tb 2021-01-13
37- leftWidth = era5RasterPosition .width + era5RasterPosition .x ;
38- rightWidth = -era5RasterPosition .x ;
39- } else {
40- xMax = era5RasterPosition .x ;
41- rightWidth = RASTER_WIDTH - era5RasterPosition .x ;
42- leftWidth = era5RasterPosition .width - rightWidth ;
43- }
44- final Rectangle leftEraPos = new Rectangle (xMin , era5RasterPosition .y , leftWidth , era5RasterPosition .height );
45- final Array leftSubset = readVariableData (numLayers , leftEraPos , variable );
46-
47- final Rectangle rightEraPos = new Rectangle (xMax , era5RasterPosition .y , rightWidth , era5RasterPosition .height );
48- final Array rightSubset = readVariableData (numLayers , rightEraPos , variable );
49-
50- subset = mergeData (leftSubset , rightSubset , numLayers , era5RasterPosition , variable );
32+ subset = readVariableDataOverlapped (numLayers , era5RasterPosition , variable );
5133 } else {
5234 subset = readVariableData (numLayers , era5RasterPosition , variable );
5335 }
36+
5437 return NetCDFUtils .scaleIfNecessary (variable , subset );
5538 }
5639
40+ private static Array readVariableDataOverlapped (int numLayers , Rectangle era5RasterPosition , Variable variable ) throws IOException , InvalidRangeException {
41+ Array subset ;
42+ int xMin = 0 ;
43+ int xMax ;
44+ int leftWidth ;
45+ int rightWidth ;
46+ if (era5RasterPosition .x < 0 ) {
47+ xMax = RASTER_WIDTH + era5RasterPosition .x ; // notabene: rasterposition is negative tb 2021-01-13
48+ leftWidth = era5RasterPosition .width + era5RasterPosition .x ;
49+ rightWidth = -era5RasterPosition .x ;
50+ } else {
51+ xMax = era5RasterPosition .x ;
52+ rightWidth = RASTER_WIDTH - era5RasterPosition .x ;
53+ leftWidth = era5RasterPosition .width - rightWidth ;
54+ }
55+ final Rectangle leftEraPos = new Rectangle (xMin , era5RasterPosition .y , leftWidth , era5RasterPosition .height );
56+ final Array leftSubset = readVariableData (numLayers , leftEraPos , variable );
57+
58+ final Rectangle rightEraPos = new Rectangle (xMax , era5RasterPosition .y , rightWidth , era5RasterPosition .height );
59+ final Array rightSubset = readVariableData (numLayers , rightEraPos , variable );
60+
61+ subset = mergeData (leftSubset , rightSubset , numLayers , era5RasterPosition , variable );
62+ return subset ;
63+ }
64+
5765 static Array mergeData (Array leftSubset , Array rightSubset , int numLayers , Rectangle era5RasterPosition , Variable variable ) {
5866 final int rank = variable .getRank ();
5967 final Array mergedArray ;
6068 if (rank == 4 ) {
6169 mergedArray = Array .factory (variable .getDataType (), new int []{numLayers , era5RasterPosition .height , era5RasterPosition .width });
6270 } else {
6371 mergedArray = Array .factory (variable .getDataType (), new int []{era5RasterPosition .height , era5RasterPosition .width });
64- final Index targetIndex = mergedArray .getIndex ();
6572 if (era5RasterPosition .x < 0 ) {
66- Index srcIndex = leftSubset .getIndex ();
67- int srcX = 0 ;
68- for (int x = 0 ; x < -era5RasterPosition .x ; x ++) {
69- for (int y = 0 ; y < era5RasterPosition .height ; y ++) {
70- targetIndex .set (y , x );
71- srcIndex .set (y , srcX );
72- mergedArray .setObject (targetIndex , leftSubset .getObject (srcIndex ));
73- }
74- ++srcX ;
75- }
76- srcIndex = rightSubset .getIndex ();
77- srcX = 0 ;
78- for (int x = -era5RasterPosition .x ; x < era5RasterPosition .width ; x ++) {
79- for (int y = 0 ; y < era5RasterPosition .height ; y ++) {
80- targetIndex .set (y , x );
81- srcIndex .set (y , srcX );
82- mergedArray .setObject (targetIndex , rightSubset .getObject (srcIndex ));
83- }
84- ++srcX ;
85- }
73+ final int xMax = era5RasterPosition .width + era5RasterPosition .x ;
74+ mergeArrays (leftSubset , rightSubset , era5RasterPosition , mergedArray , xMax );
8675 } else {
87- Index srcIndex = rightSubset .getIndex ();
88- int srcX = 0 ;
89- for (int x = 0 ; x < RASTER_WIDTH - era5RasterPosition .x ; x ++) {
90- for (int y = 0 ; y < era5RasterPosition .height ; y ++) {
91- targetIndex .set (y , x );
92- srcIndex .set (y , srcX );
93- mergedArray .setObject (targetIndex , rightSubset .getObject (srcIndex ));
94- }
95- ++srcX ;
96- }
97- srcIndex = leftSubset .getIndex ();
98- srcX = 0 ;
99- for (int x = RASTER_WIDTH - era5RasterPosition .x ; x < era5RasterPosition .width ; x ++) {
100- for (int y = 0 ; y < era5RasterPosition .height ; y ++) {
101- targetIndex .set (y , x );
102- srcIndex .set (y , srcX );
103- mergedArray .setObject (targetIndex , leftSubset .getObject (srcIndex ));
104- }
105- ++srcX ;
106- }
76+ final int xMax = RASTER_WIDTH - era5RasterPosition .x ;
77+ mergeArrays (rightSubset , leftSubset , era5RasterPosition , mergedArray , xMax );
10778 }
10879 }
10980
11081 return mergedArray ;
11182 }
11283
84+ private static void mergeArrays (Array leftSubset , Array rightSubset , Rectangle era5RasterPosition , Array mergedArray , int xMax ) {
85+ final Index targetIndex = mergedArray .getIndex ();
86+ Index srcIndex = leftSubset .getIndex ();
87+ int srcX = 0 ;
88+ for (int x = 0 ; x < xMax ; x ++) {
89+ for (int y = 0 ; y < era5RasterPosition .height ; y ++) {
90+ targetIndex .set (y , x );
91+ srcIndex .set (y , srcX );
92+ mergedArray .setObject (targetIndex , leftSubset .getObject (srcIndex ));
93+ }
94+ ++srcX ;
95+ }
96+ srcIndex = rightSubset .getIndex ();
97+ srcX = 0 ;
98+ for (int x = xMax ; x < era5RasterPosition .width ; x ++) {
99+ for (int y = 0 ; y < era5RasterPosition .height ; y ++) {
100+ targetIndex .set (y , x );
101+ srcIndex .set (y , srcX );
102+ mergedArray .setObject (targetIndex , rightSubset .getObject (srcIndex ));
103+ }
104+ ++srcX ;
105+ }
106+ }
107+
113108 private static Array readVariableData (int numLayers , Rectangle era5RasterPosition , Variable variable ) throws IOException , InvalidRangeException {
114109 final int rank = variable .getRank ();
115110 Array subset ;
@@ -125,7 +120,9 @@ private static Array readVariableData(int numLayers, Rectangle era5RasterPositio
125120 throw new IOException ("variable rank invalid: " + variable .getShortName ());
126121 }
127122
128- subset = subset .reduce ();
123+ // remove the time dimension of length 1 tb 2021-01-14
124+ subset = subset .reduce (0 );
125+
129126 return subset ;
130127 }
131128
0 commit comments