// Constructor for when you already have the StructureData and Station, and calculate times protected RecordStationObs(Station station, StructureData sdata, int recno) { super(recno); this.station = station; this.location = station; this.sdata = sdata; StructureMembers members = sdata.getStructureMembers(); obsTime = getTime(members.findMember(obsTimeVName), sdata); nomTime = (nomTimeVName == null) ? obsTime : getTime(members.findMember(nomTimeVName), sdata); }
private void init() throws IOException { members = new StructureMembers("stationObs"); // used to convert from adde format calendar = new GregorianCalendar(); calendar.setTimeZone(TimeZone.getTimeZone("GMT")); // time unit timeUnit = DateUnit.getUnixDateUnit(); try { AddePointDataReader reader = callAdde(addeURL); String[] params = reader.getParams(); String[] units = reader.getUnits(); int[] scales = reader.getScales(); scaleFactor = new double[params.length]; if (debugHead) System.out.println(" Param Unit Scale"); for (int paramNo = 0; paramNo < params.length; paramNo++) { // memberNames.add( params[i]); if (debugHead) System.out.println(" " + params[paramNo] + " " + units[paramNo] + " " + scales[paramNo]); if (scales[paramNo] != 0) scaleFactor[paramNo] = 1.0 / Math.pow(10.0, (double) scales[paramNo]); DataType dt = null; if ("CHAR".equals(units[paramNo])) dt = DataType.STRING; else if (scaleFactor[paramNo] == 0) dt = DataType.INT; else dt = DataType.DOUBLE; String unitString = null; if ((units[paramNo] != null) && (units[paramNo].length() > 0)) unitString = visad.jmet.MetUnits.makeSymbol(units[paramNo]); AddeTypedDataVariable tdv = new AddeTypedDataVariable(params[paramNo], unitString, dt); dataVariables.add(tdv); StructureMembers.Member m = members.addMember( tdv.getShortName(), tdv.getDescription(), tdv.getUnitsString(), tdv.getDataType(), tdv.getShape()); m.setDataParam(paramNo); members.addMember(m); } } catch (AddeException e) { e.printStackTrace(); throw new IOException(e.getMessage()); } }
// Constructor for when you already have the StructureData and want to wrap it in a // StationObsDatatype protected RecordPointObs(StructureData sdata, int recno) { super(RecordDatasetHelper.this.timeUnit); this.sdata = sdata; this.recno = recno; StructureMembers members = sdata.getStructureMembers(); obsTime = getTime(members.findMember(obsTimeVName), sdata); nomTime = (nomTimeVName == null) ? obsTime : getTime(members.findMember(nomTimeVName), sdata); // this assumes the lat/lon/alt is stored in the obs record double lat = sdata.convertScalarDouble(members.findMember(latVName)); double lon = sdata.convertScalarDouble(members.findMember(lonVName)); double alt = (zcoordVName == null) ? 0.0 : altScaleFactor * sdata.convertScalarDouble(members.findMember(zcoordVName)); location = new EarthLocationImpl(lat, lon, alt); }
// Constructor for when you already have the StructureData, and need to find Station and times protected RecordStationObs(StructureData sdata, int recno, boolean useId) { super(recno); this.recno = recno; this.sdata = sdata; this.timeUnit = RecordDatasetHelper.this.timeUnit; StructureMembers members = sdata.getStructureMembers(); obsTime = getTime(members.findMember(obsTimeVName), sdata); nomTime = (nomTimeVName == null) ? obsTime : getTime(members.findMember(nomTimeVName), sdata); if (useId) { // this assumes the station id/name is stored in the obs record String stationId; if (stationIdType == DataType.INT) { stationId = Integer.toString(sdata.getScalarInt(stnIdVName)); } else stationId = sdata.getScalarString(stnIdVName).trim(); station = stationHelper.getStation(stationId); if (null != errs) errs.format(" cant find station id = <%s> when reading record %d%n", stationId, recno); log.error(" cant find station id = <" + stationId + "> when reading record " + recno); } else { // use a station index List<Station> stations = stationHelper.getStations(); int stationIndex = sdata.getScalarInt(stnIndexVName); if (stationIndex < 0 || stationIndex >= stations.size()) { if (null != errs) errs.format( " cant find station at index =%d when reading record %d%n", stationIndex, recno); log.error( "cant find station at index = " + stationIndex + " when reading record " + recno); } else station = stations.get(stationIndex); } location = station; }
public boolean compareStructureData( StructureData sdata1, StructureData sdata2, double tol, boolean justOne) { boolean ok = true; StructureMembers sm1 = sdata1.getStructureMembers(); StructureMembers sm2 = sdata2.getStructureMembers(); if (sm1.getMembers().size() != sm2.getMembers().size()) { f.format(" size %d !== %d%n", sm1.getMembers().size(), sm2.getMembers().size()); ok = false; } for (StructureMembers.Member m1 : sm1.getMembers()) { if (m1.getName().equals("time")) continue; StructureMembers.Member m2 = sm2.findMember(m1.getName()); Array data1 = sdata1.getArray(m1); Array data2 = sdata2.getArray(m2); ok &= compareData(m1.getName(), data1, data2, tol, justOne); } return ok; }
public static void main(String args[]) throws Exception { long start = System.currentTimeMillis(); Map<String, ucar.unidata.geoloc.Station> staHash = new HashMap<String, ucar.unidata.geoloc.Station>(); String location = "R:/testdata/sounding/netcdf/Upperair_20070401_0000.nc"; NetcdfDataset ncfile = NetcdfDataset.openDataset(location); ncfile.sendIospMessage(NetcdfFile.IOSP_MESSAGE_ADD_RECORD_STRUCTURE); // look through record varibles, for those that have "manLevel" dimension // make a StructureData object for those StructureMembers sm = new StructureMembers("manLevel"); Dimension manDim = ncfile.findDimension("manLevel"); Structure record = (Structure) ncfile.findVariable("record"); List<Variable> allList = record.getVariables(); List<VariableSimpleIF> varList = new ArrayList<VariableSimpleIF>(); for (Variable v : allList) { if ((v.getRank() == 1) && v.getDimension(0).equals(manDim)) { // public VariableDS(NetcdfDataset ds, Group group, Structure parentStructure, String // shortName, DataType dataType, // String dims, String units, String desc) { varList.add( new VariableDS( ncfile, null, null, v.getShortName(), v.getDataType(), "", v.getUnitsString(), v.getDescription())); // (String name, String desc, String units, DataType dtype, int []shape) sm.addMember( v.getShortName(), v.getDescription(), v.getUnitsString(), v.getDataType(), new int[0]); // scalar } } ArrayStructureMA manAS = new ArrayStructureMA(sm, new int[] {manDim.getLength()}); // need the date units Variable time = ncfile.findVariable("synTime"); String timeUnits = ncfile.findAttValueIgnoreCase(time, "units", null); timeUnits = StringUtil.remove(timeUnits, '('); // crappy fsl'ism timeUnits = StringUtil.remove(timeUnits, ')'); DateUnit timeUnit = new DateUnit(timeUnits); // extract stations int nrecs = 0; StructureDataIterator iter = record.getStructureIterator(); while (iter.hasNext()) { StructureData sdata = iter.next(); String name = sdata.getScalarString("staName"); ucar.unidata.geoloc.Station s = staHash.get(name); if (s == null) { float lat = sdata.convertScalarFloat("staLat"); float lon = sdata.convertScalarFloat("staLon"); float elev = sdata.convertScalarFloat("staElev"); s = new StationImpl(name, "", lat, lon, elev); staHash.put(name, s); } nrecs++; } List<ucar.unidata.geoloc.Station> stnList = Arrays.asList(staHash.values().toArray(new ucar.unidata.geoloc.Station[staHash.size()])); Collections.sort(stnList); // create the writer WriterProfileObsDataset writer = new WriterProfileObsDataset(location + ".out", "rewrite " + location); writer.writeHeader(stnList, varList, nrecs, "prMan"); // extract records iter = record.getStructureIterator(); while (iter.hasNext()) { StructureData sdata = iter.next(); String name = sdata.getScalarString("staName"); double timeValue = sdata.convertScalarDouble("synTime"); Date date = timeUnit.makeDate(timeValue); // transfer to the ArrayStructure List<String> names = sm.getMemberNames(); for (String mname : names) { manAS.setMemberArray(mname, sdata.getArray(mname)); } // each level is weritten as a seperate structure int numMand = sdata.getScalarInt("numMand"); if (numMand >= manDim.getLength()) continue; for (int i = 0; i < numMand; i++) { StructureData useData = manAS.getStructureData(i); writer.writeRecord(name, date, useData); } } writer.finish(); long took = System.currentTimeMillis() - start; System.out.println("That took = " + took); }
public double getZcoordinate(StructureData sdata) { StructureMembers members = sdata.getStructureMembers(); return (zcoordVName == null) ? Double.NaN : sdata.convertScalarDouble(members.findMember(zcoordVName)); }
public double getLongitude(StructureData sdata) { StructureMembers members = sdata.getStructureMembers(); return sdata.convertScalarDouble(members.findMember(lonVName)); }
public LatLonPoint getLocation(StructureData sdata) { StructureMembers members = sdata.getStructureMembers(); double lat = sdata.convertScalarDouble(members.findMember(latVName)); double lon = sdata.convertScalarDouble(members.findMember(lonVName)); return new LatLonPointImpl(lat, lon); }