taxis.setDimensions("time");
taxis.addAttribute(new Attribute("long_name", "time since base date"));
taxis.addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Time.toString()));
double[] tdata = new double[1];
tdata[0] = cal.getTimeInMillis();
Array dataA = Array.factory(DataType.DOUBLE.getPrimitiveClassType(), new int[]{1}, tdata);
taxis.setCachedData(dataA, false);
DateFormatter formatter = new DateFormatter();
taxis.addAttribute(new Attribute("units", "msecs since " + formatter.toDateTimeStringISO(new Date(0))));
ncfile.addVariable(null, taxis);
// Get dimensions
Integer ni = new Integer(geoSatelliteSecondHeader.widthOfImage);
att = new Attribute("NX", ni);
this.ncfile.addAttribute(null, att);
ni = new Integer(geoSatelliteSecondHeader.heightOfImage);
att = new Attribute("NY", ni);
this.ncfile.addAttribute(null, att);
vname = getGeoSatelliteProductName(geoSatelliteSecondHeader.channel);
if (vname == null)
throw new UnsupportedDatasetException("Unsupported GeoSatellite Procuct Dataset");
// set projection attribute
// ? which projection
ProjectionImpl projection = null;
double dxKm = 0.0, dyKm = 0.0;
short nv = geoSatelliteSecondHeader.flagOfProjection;
att = new Attribute("ProjIndex", nv);
this.ncfile.addAttribute(null, att);
int proj = nv;
if (proj == 2) {
att = new Attribute("ProjName", "MERCATOR");
double lat0 = geoSatelliteSecondHeader.centerLatitudeOfProjection;
double lon0 = geoSatelliteSecondHeader.centerLongitudeOfProjection;
double par = geoSatelliteSecondHeader.standardLatitude1;
dxKm = geoSatelliteSecondHeader.horizontalResolution;
dyKm = geoSatelliteSecondHeader.verticalResolution;
projection = new Mercator(lon0, par);
} else if (proj == 1) {
att = new Attribute("ProjName", "LAMBERT_CONFORNAL");
double lat0 = geoSatelliteSecondHeader.centerLatitudeOfProjection;
double lon0 = geoSatelliteSecondHeader.centerLongitudeOfProjection;
double par1 = geoSatelliteSecondHeader.standardLatitude1;
double par2 = geoSatelliteSecondHeader.standardLatitude2;
dxKm = geoSatelliteSecondHeader.horizontalResolution / 100;
dyKm = geoSatelliteSecondHeader.verticalResolution / 100;
projection = new LambertConformal(lat0, lon0, par1, par2);
} else if (proj == 3) {
att = new Attribute("ProjName", "POLARSTEREOGRAPHIC");
double latt = geoSatelliteSecondHeader.centerLatitudeOfProjection;
double lont = geoSatelliteSecondHeader.centerLongitudeOfProjection;
double scale = (1. + Math.sin(DEG_TO_RAD * latt)) / 2.;
dxKm = geoSatelliteSecondHeader.horizontalResolution;
dyKm = geoSatelliteSecondHeader.verticalResolution;
projection = new Stereographic(90.0, lont, scale);
} else if (proj == 4) {
att = new Attribute("ProjName", "LatLonProjection");
projection = new LatLonProjection();
}
this.ncfile.addAttribute(null, att);
// coordinate transform variable
if (proj != 4) {
}
//double dxKm = 0.0, dyKm = 0.0, latin, lonProjectionOrigin ;
// deal with projection
this.ncfile.addAttribute(null, new Attribute("channel", geoSatelliteSecondHeader.channel));
this.ncfile.addAttribute(null, new Attribute("geospatial_lat_min", new Float(geoSatelliteSecondHeader.latitudeOfSouth)));
this.ncfile.addAttribute(null, new Attribute("geospatial_lat_max", new Float(geoSatelliteSecondHeader.latitudeOfNorth)));
this.ncfile.addAttribute(null, new Attribute("geospatial_lon_min", new Float(geoSatelliteSecondHeader.longitudeOfWest)));
this.ncfile.addAttribute(null, new Attribute("geospatial_lon_max", new Float(geoSatelliteSecondHeader.longitudeOfEast)));
this.ncfile.addAttribute(null, new Attribute("geospatial_vertical_min", new Float(0.0)));
this.ncfile.addAttribute(null, new Attribute("geospatial_vertical_max", new Float(0.0)));
this.ncfile.addAttribute(null, new Attribute("sample_ratio", geoSatelliteSecondHeader.sampleRatio));
att = new Attribute("horizontal_resolution", geoSatelliteSecondHeader.horizontalResolution);
this.ncfile.addAttribute(null, att);
att = new Attribute("vertical_resolution", geoSatelliteSecondHeader.verticalResolution);
this.ncfile.addAttribute(null, att);
// only one data variable per awx file
// set vname and units according to grid feature
Variable var = new Variable(ncfile, ncfile.getRootGroup(), null, vname);
var.addAttribute(new Attribute("long_name", vname));
// get dimensions
int velems;
boolean isRecord = false;
int nx = geoSatelliteSecondHeader.widthOfImage;
int ny = geoSatelliteSecondHeader.heightOfImage;
Dimension dimX;
Dimension dimY;
if (proj != 4) {
dimX = new Dimension("x", nx, true, false, false);
dimY = new Dimension("y", ny, true, false, false);
} else {
dimX = new Dimension("lon", nx, true, false, false);
dimY = new Dimension("lat", ny, true, false, false);
}
ncfile.addDimension(null, dimY);
ncfile.addDimension(null, dimX);
int byteAmountofData = 1;
velems = dimX.getLength() * dimY.getLength() * byteAmountofData;
ArrayList dims = new ArrayList();
dims.add(dimT);
dims.add(dimY);
dims.add(dimX);
var.setDimensions(dims);
// data type
Class dataType = null;
switch (byteAmountofData) {
case 1:
var.setDataType(DataType.BYTE);
dataType = DataType.BYTE.getPrimitiveClassType();
break;
case 2:
var.setDataType(DataType.SHORT);
dataType = DataType.SHORT.getPrimitiveClassType();
break;
case 4:
var.setDataType(DataType.INT);
dataType = DataType.INT.getPrimitiveClassType();
break;
default:
System.out.println("Unsupported Grid Procuct Dataset!");
throw new UnsupportedDatasetException("Unsupported Grid Procuct Dataset");
}
var.addAttribute(new Attribute("coordinates", "Lon Lat"));
var.addAttribute(new Attribute("_unsigned", "true"));
var.addAttribute(new Attribute("units", "percent"));
// if(var.getDataType() == DataType.BYTE) {
// var.addAttribute(new Attribute("_missing_value", new Byte((byte)-1)));
// var.addAttribute( new Attribute("scale_factor", new Byte((byte)(1))));
// var.addAttribute( new Attribute("add_offset", new Byte((byte)(0))));
// } else {
var.addAttribute(new Attribute("_missing_value", new Short((short) -1)));
var.addAttribute(new Attribute("scale_factor", new Short((short) (1))));
var.addAttribute(new Attribute("add_offset", new Short((short) (0))));
// }
// size and beginning data position in file
int vsize = velems;
long begin = this.firstHeader.recordsOfHeader * this.firstHeader.recoderLength;
if (debug)
log.warn(" name= " + vname + " vsize=" + vsize + " velems=" + velems + " begin= " + begin + " isRecord=" + isRecord + "\n");
var.setSPobject(new Vinfo(vsize, begin, isRecord, nx, ny, dataType, this.firstHeader.byteOrder));
String coordinates;
if (proj != 4) {
coordinates = "x y time";
} else {
coordinates = "Lon Lat time";
}
var.addAttribute(new Attribute(_Coordinate.Axes, coordinates));
ncfile.addVariable(ncfile.getRootGroup(), var);
// if (debug) System.out.println("start at proj coord "+start);
LatLonPointImpl startPnt = new LatLonPointImpl(geoSatelliteSecondHeader.latitudeOfNorth, geoSatelliteSecondHeader.longitudeOfWest);
LatLonPointImpl endPnt = new LatLonPointImpl(geoSatelliteSecondHeader.latitudeOfSouth, geoSatelliteSecondHeader.longitudeOfEast);
if (debug) System.out.println("start at geo coord :" + startPnt);
if (proj != 4) {
// we have to project in order to find the origin
ProjectionPointImpl start = (ProjectionPointImpl) projection.latLonToProj(
new LatLonPointImpl(geoSatelliteSecondHeader.latitudeOfSouth,
geoSatelliteSecondHeader.longitudeOfWest));
double startx = start.getX();
double starty = start.getY();
Variable xaxis = new Variable(ncfile, null, null, "x");
xaxis.setDataType(DataType.DOUBLE);
xaxis.setDimensions("x");
xaxis.addAttribute(new Attribute("long_name", "projection x coordinate"));
xaxis.addAttribute(new Attribute("units", "km"));
xaxis.addAttribute(new Attribute(_Coordinate.AxisType, "GeoX"));
double[] data = new double[nx];
if (proj == 2) {
double lon_1 = geoSatelliteSecondHeader.longitudeOfEast;
double lon_2 = geoSatelliteSecondHeader.longitudeOfWest;
if (lon_1 < 0) lon_1 += 360.0;
if (lon_2 < 0) lon_2 += 360.0;
double dx = (lon_1 - lon_2) / (nx - 1);
for (int i = 0; i < data.length; i++) {
double ln = lon_2 + i * dx;
ProjectionPointImpl pt = (ProjectionPointImpl) projection.latLonToProj(
new LatLonPointImpl(geoSatelliteSecondHeader.latitudeOfSouth, ln));
data[i] = pt.getX(); // startx + i*dx;
}
} else {
for (int i = 0; i < data.length; i++)
data[i] = startx + i * dxKm;
}
dataA = Array.factory(DataType.DOUBLE.getPrimitiveClassType(), new int[]{nx}, data);
xaxis.setCachedData(dataA, false);
ncfile.addVariable(null, xaxis);
Variable yaxis = new Variable(ncfile, null, null, "y");
yaxis.setDataType(DataType.DOUBLE);
yaxis.setDimensions("y");
yaxis.addAttribute(new Attribute("long_name", "projection y coordinate"));
yaxis.addAttribute(new Attribute("units", "km"));
yaxis.addAttribute(new Attribute(_Coordinate.AxisType, "GeoY"));
data = new double[ny];
double endy = starty + dyKm * (data.length - 1); // apparently lat1,lon1 is always the lower ledt, but data is upper left
double lat2 = geoSatelliteSecondHeader.latitudeOfNorth;
double lat1 = geoSatelliteSecondHeader.latitudeOfSouth;
if (proj == 2) {
double dy = (lat2 - lat1) / (ny - 1);
for (int i = 0; i < data.length; i++) {
double la = lat2 - i * dy;
ProjectionPointImpl pt = (ProjectionPointImpl) projection.latLonToProj(
new LatLonPointImpl(la, geoSatelliteSecondHeader.longitudeOfWest));
data[i] = pt.getY(); //endyy - i*dy;
}
} else {
for (int i = 0; i < data.length; i++)
data[i] = endy - i * dyKm;
}
dataA = Array.factory(DataType.DOUBLE.getPrimitiveClassType(), new int[]{ny}, data);
yaxis.setCachedData(dataA, false);
ncfile.addVariable(null, yaxis);
// coordinate transform variable
Variable ct = new Variable(ncfile, null, null, projection.getClassName());
ct.setDataType(DataType.CHAR);
ct.setDimensions("");
List params = projection.getProjectionParameters();
for (int i = 0; i < params.size(); i++) {
Parameter p = (Parameter) params.get(i);
ct.addAttribute(new Attribute(p));
}
ct.addAttribute(new Attribute(_Coordinate.TransformType, "Projection"));
ct.addAttribute(new Attribute(_Coordinate.Axes, "x, y"));
// fake data
dataA = Array.factory(DataType.CHAR.getPrimitiveClassType(), new int[]{});
dataA.setChar(dataA.getIndex(), ' ');
ct.setCachedData(dataA, false);
ncfile.addVariable(null, ct);
ncfile.addAttribute(null, new Attribute("Conventions", _Coordinate.Convention));
} else {
Variable yaxis = new Variable(ncfile, null, null, "lat");
yaxis.setDataType(DataType.DOUBLE);
yaxis.setDimensions("lat");
yaxis.addAttribute(new Attribute("long_name", "latitude"));
yaxis.addAttribute(new Attribute("units", "degree"));
yaxis.addAttribute(new Attribute(_Coordinate.AxisType, "Lat"));
double[] data = new double[ny];
double dy = (endPnt.getLatitude() - startPnt.getLatitude()) / (ny - 1);
for (int i = 0; i < data.length; i++) {
data[i] = startPnt.getLatitude() + i * dy; // starty + i*dy;
}
dataA = Array.factory(DataType.DOUBLE.getPrimitiveClassType(), new int[]{ny}, data);
yaxis.setCachedData(dataA, false);
ncfile.addVariable(null, yaxis);
// create coordinate variables
Variable xaxis = new Variable(ncfile, null, null, "lon");
xaxis.setDataType(DataType.DOUBLE);
xaxis.setDimensions("lon");
xaxis.addAttribute(new Attribute("long_name", "longitude"));
xaxis.addAttribute(new Attribute("units", "degree"));
xaxis.addAttribute(new Attribute(_Coordinate.AxisType, "Lon"));
data = new double[nx];
double dx = (endPnt.getLongitude() - startPnt.getLongitude()) / (nx - 1);
for (int i = 0; i < data.length; i++) {
data[i] = startPnt.getLongitude() + i * dx; // startx + i*dx;
}
dataA = Array.factory(DataType.DOUBLE.getPrimitiveClassType(), new int[]{nx}, data);
xaxis.setCachedData(dataA, false);
ncfile.addVariable(null, xaxis);
}
break;
}
case AwxFileFirstHeader.AWX_PRODUCT_TYPE_POLARSAT_IMAGE:
throw new UnsupportedDatasetException();
case AwxFileFirstHeader.AWX_PRODUCT_TYPE_GRID: {
AwxFileGridProductSecondHeader gridprocuctSecondHeader = (AwxFileGridProductSecondHeader) this.secondHeader;
att = new Attribute("satellite_name", gridprocuctSecondHeader.satelliteName);
this.ncfile.addAttribute(null, att);
att = new Attribute("grid_feature", gridprocuctSecondHeader.gridFeature);
this.ncfile.addAttribute(null, att);
att = new Attribute("byte_amount_of_data", gridprocuctSecondHeader.byteAmountofData);
this.ncfile.addAttribute(null, att);
att = new Attribute("data_scale", gridprocuctSecondHeader.dataScale);
this.ncfile.addAttribute(null, att);
// this.ncfile.addAttribute(null, new Attribute("cdm_data_type", thredds.catalog.DataType.GRID.toString()));
DateFormat dformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dformat.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance();
cal.set(gridprocuctSecondHeader.startYear,
gridprocuctSecondHeader.startMonth - 1,
gridprocuctSecondHeader.startDay,
gridprocuctSecondHeader.startHour,
gridprocuctSecondHeader.startMinute, 0);
cal.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
String dstring = dformat.format(cal.getTime());
this.ncfile.addAttribute(null, new Attribute("time_coverage_start", dstring));
int nz = 1;
Dimension dimT = new Dimension("time", nz, true, false, false);
ncfile.addDimension(null, dimT);
// set time variable with time_coverage_start
String timeCoordName = "time";
Variable taxis = new Variable(ncfile, null, null, timeCoordName);
taxis.setDataType(DataType.DOUBLE);
taxis.setDimensions("time");
taxis.addAttribute(new Attribute("long_name", "time since base date"));
taxis.addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Time.toString()));
double[] tdata = new double[1];
tdata[0] = cal.getTimeInMillis();
Array dataA = Array.factory(DataType.DOUBLE.getPrimitiveClassType(), new int[]{1}, tdata);
taxis.setCachedData(dataA, false);
DateFormatter formatter = new DateFormatter();
taxis.addAttribute(new Attribute("units", "msecs since " + formatter.toDateTimeStringISO(new Date(0))));
ncfile.addVariable(null, taxis);