ID: 11 digit identifier, digits 1-3=Country Code, digits 4-8 represent
the WMO stnId if the station is a WMO station. It is a WMO station if
digits 9-11="000".
*/
TableParser dataParser = new TableParser("11L,15i,19,24i,25,26,27");
Structure dataSeq = new Sequence(ncfile, null, null, RECORD);
ncfile.addVariable(null, dataSeq);
ncfile.addDimension(null, new Dimension(DIM_NAME, 12));
Variable v;
makeMember(dataSeq, STNID, DataType.LONG, null, "station stnId", null, null, null);
makeMember(dataSeq, YEAR, DataType.INT, null, "year of the station record", null, null, null);
v = makeMember(dataSeq, VALUE, DataType.FLOAT, DIM_NAME, "monthly mean temperature", "Celsius", null, null);
v.addAttribute(new Attribute(CF.MISSING_VALUE, -9999));
dataParser.getField(3).setScale(.01f);
makeMember(dataSeq, DMFLAG, DataType.CHAR, DIM_NAME, "data management flag", null, null, null);
makeMember(dataSeq, QCFLAG, DataType.CHAR, DIM_NAME, "quality control flag", null, null, null);
makeMember(dataSeq, DSFLAG, DataType.CHAR, DIM_NAME, "data source flag", null, null, null);
// synthetic time variable
v = makeMember(dataSeq, TIME, DataType.STRING, null, "starting time of the record", null, null, AxisType.Time);
v.addAttribute(new Attribute(CF.MISSING_VALUE, "missing"));
StructureMembers dataSm = dataSeq.makeStructureMembers();
dataSm.findMember(STNID).setDataObject(dataParser.getField(0));
dataSm.findMember(YEAR).setDataObject(dataParser.getField(1));
dataSm.findMember(VALUE).setDataObject(dataParser.getField(3));
dataSm.findMember(DMFLAG).setDataObject(dataParser.getField(4));
dataSm.findMember(QCFLAG).setDataObject(dataParser.getField(5));
dataSm.findMember(DSFLAG).setDataObject(dataParser.getField(6));
dataSeq.setSPobject(new Vinfo(this.raf, dataSm));
stnIdFromData = dataParser.getField(0);
// synthetic time variable
TableParser.Field org = dataParser.getField(1); // YEAR
TableParser.Field derived = dataParser.addDerivedField(org, new TableParser.Transform() {
public Object derive(Object org) {
int year = (Integer) org;
return year+"-01-01T00:00:00Z";
}
}, String.class);
dataSm.findMember(TIME).setDataObject(derived);
/*
ID 1-11 Integer
LATITUDE 13-20 Real
LONGITUDE 22-30 Real
STNELEV 32-37 Real
NAME 39-68 Character
GRELEV 70-73 Integer
POPCLS 74-74 Character
POPSIZ 76-79 Integer
TOPO 80-81 Character
STVEG 82-83 Character
STLOC 84-85 Character
OCNDIS 86-87 Integer
AIRSTN 88-88 Character
TOWNDIS 89-90 Integer
GRVEG 91-106 Character
POPCSS 107-107 Character
*/
TableParser stnParser = new TableParser("11L,20d,30d,37d,68,73i,74,79i,81,83,85,87i,88,90i,106,107");
Structure stnSeq = new Sequence(ncfile, null, null, STNS);
ncfile.addVariable(null, stnSeq);
v = makeMember(stnSeq, STNID, DataType.LONG, null, "station id", null, null, null);
v.addAttribute(new Attribute(CF.STANDARD_NAME, CF.STATION_ID));
makeMember(stnSeq, LAT, DataType.FLOAT, null, "latitude", "degrees_north", null, null);
makeMember(stnSeq, LON, DataType.FLOAT, null, "longitude", "degrees_east", null, null);
makeMember(stnSeq, STELEV, DataType.FLOAT, null, "elevation", "m", null, null);
v = makeMember(stnSeq, NAME, DataType.STRING, null, "station name", null, null, null);
v.addAttribute(new Attribute(CF.STANDARD_NAME, CF.STATION_DESC));
makeMember(stnSeq, GRELEV, DataType.INT, null, "elevation estimated from gridded digital terrain data", "m", null, null);
makeMember(stnSeq, POPCLS, DataType.CHAR, null, "population class", null, null, null);
v = makeMember(stnSeq, POPSIZ, DataType.INT, null, "population of the city or town the station is located in", "thousands of persons", null, null);
v.addAttribute(new Attribute(CF.MISSING_VALUE, -9));
makeMember(stnSeq, TOPO, DataType.STRING, null, "type of topography in the environment surrounding the station", null, null, null);
makeMember(stnSeq, STVEG, DataType.STRING, null, "type of vegetation in environment of station", null, null, null);
makeMember(stnSeq, STLOC, DataType.STRING, null, "station is near lake or ocean", null, null, null);
v = makeMember(stnSeq, OCNDIS, DataType.INT, null, "distance to nearest ocean/lake", "km", null, null);
v.addAttribute(new Attribute(CF.MISSING_VALUE, -9));
makeMember(stnSeq, AIRSTN, DataType.CHAR, null, "airport station indicator", null, null, null);
v = makeMember(stnSeq, TOWNDIS, DataType.INT, null, "distance from airport to center of associated city or town", "km", null, null);
v.addAttribute(new Attribute(CF.MISSING_VALUE, -9));
makeMember(stnSeq, GRVEG, DataType.STRING, null, "vegetation type at nearest 0.5 deg x 0.5 deg gridded data point of vegetation dataset", null, null, null);
makeMember(stnSeq, POPCSS, DataType.CHAR, null, "population class as determined by satellite night lights", null, null, null);
// nested sequence - just the data for this station
Structure nestedSeq = new Sequence(ncfile, null, stnSeq, STN_DATA);
stnSeq.addMemberVariable(nestedSeq);
v = makeMember(nestedSeq, YEAR, DataType.INT, null, "year", null, null, null);
v.addAttribute(new Attribute(CF.UNITS, "years since 0000-01-01T00:00"));
v = makeMember(nestedSeq, VALUE, DataType.FLOAT, DIM_NAME, "monthly mean temperature", "Celsius", null, null);
v.addAttribute(new Attribute(CF.MISSING_VALUE, -9999));
dataParser.getField(3).setScale(.01f);
makeMember(nestedSeq, DMFLAG, DataType.CHAR, DIM_NAME, "data management flag", null, null, null);
makeMember(nestedSeq, QCFLAG, DataType.CHAR, DIM_NAME, "quality control flag", null, null, null);
makeMember(nestedSeq, DSFLAG, DataType.CHAR, DIM_NAME, "data source flag", null, null, null);
// synthetic time variable in nested seq
v = makeMember(nestedSeq, TIME, DataType.STRING, null, "starting time of the record", null, null, AxisType.Time);
v.addAttribute(new Attribute(CF.MISSING_VALUE, "missing"));
StructureMembers nestedSm = nestedSeq.makeStructureMembers();
nestedSm.findMember(YEAR).setDataObject(dataParser.getField(1));
nestedSm.findMember(VALUE).setDataObject(dataParser.getField(3));
nestedSm.findMember(DMFLAG).setDataObject(dataParser.getField(4));
nestedSm.findMember(QCFLAG).setDataObject(dataParser.getField(5));
nestedSm.findMember(DSFLAG).setDataObject(dataParser.getField(6));
nestedSeq.setSPobject(new Vinfo(this.raf, nestedSm));
stnDataMembers = nestedSm;
// synthetic time variable in nested seq
TableParser.Field org2 = dataParser.getField(1); // YEAR
TableParser.Field derived2 = dataParser.addDerivedField(org2, new TableParser.Transform() {
public Object derive(Object org) {
int year = (Integer) org;
return year+"-01-01T00:00:00Z";
}
}, String.class);
nestedSm.findMember(TIME).setDataObject(derived2);
//// finish the stn sequence
// synthetic wmo variable in station
v = makeMember(stnSeq, WMO, DataType.INT, null, "WMO station id", null, null, null);
v.addAttribute(new Attribute(CF.MISSING_VALUE, -9999));
v.addAttribute(new Attribute(CF.STANDARD_NAME, CF.STATION_WMOID));
StructureMembers stnSm = stnSeq.makeStructureMembers();
int count = 0;
int n = stnParser.getNumberOfFields();
for (StructureMembers.Member m : stnSm.getMembers()) {
if (count < n)
m.setDataObject(stnParser.getField(count++));
}
stnSeq.setSPobject(new Vinfo(stnRaf, stnSm));
// synthetic wmo variable in station
/* ID: 11 digit identifier, digits 1-3=Country Code, digits 4-8 represent
the WMO id if the station is a WMO station. It is a WMO station if
digits 9-11="000". */
TableParser.Field org3 = stnParser.getField(0); // STNID
TableParser.Field derived3 = stnParser.addDerivedField(org3, new TableParser.Transform() {
public Object derive(Object org) {
long stnid = (Long) org;
return (stnid % 1000 == 0) ? new Integer((int)(stnid/1000) % 100000) : new Integer(-9999);
}
}, int.class);