/** * Extract a list of data variables (and their canonical names if possible) from the dataset. * * @param threddsDataset open this dataset * @return ThreddsMetadata.Variables, or null if unable. * @throws IOException on read error */ public static ThreddsMetadata.Variables extractVariables(InvDatasetImpl threddsDataset) throws IOException { ThreddsDataFactory.Result result = null; try { result = new ThreddsDataFactory().openFeatureDataset(threddsDataset, null); if (result.fatalError) { System.out.println(" openDatatype errs=" + result.errLog); return null; } if (result.featureType == FeatureType.GRID) { // System.out.println(" extractVariables GRID=" + result.location); GridDataset gridDataset = (GridDataset) result.featureDataset; return extractVariables(threddsDataset, gridDataset); } else if ((result.featureType == FeatureType.STATION) || (result.featureType == FeatureType.POINT)) { PointObsDataset pobsDataset = (PointObsDataset) result.featureDataset; ThreddsMetadata.Variables vars = new ThreddsMetadata.Variables("CF-1.0"); for (VariableSimpleIF vs : pobsDataset.getDataVariables()) { ThreddsMetadata.Variable v = new ThreddsMetadata.Variable(); vars.addVariable(v); v.setName(vs.getName()); v.setDescription(vs.getDescription()); v.setUnits(vs.getUnitsString()); ucar.nc2.Attribute att = vs.findAttributeIgnoreCase("standard_name"); v.setVocabularyName((att != null) ? att.getStringValue() : "N/A"); } vars.sort(); return vars; } } finally { try { if ((result != null) && (result.featureDataset != null)) result.featureDataset.close(); } catch (IOException ioe) { logger.error("Closing dataset " + result.featureDataset, ioe); } } return null; }
/** * Extract the lat/lon/alt bounding boxes from the dataset. * * @param threddsDataset open this dataset * @return ThreddsMetadata.GeospatialCoverage, or null if unable. * @throws IOException on read error */ public static ThreddsMetadata.GeospatialCoverage extractGeospatial(InvDatasetImpl threddsDataset) throws IOException { ThreddsDataFactory.Result result = null; try { result = new ThreddsDataFactory().openFeatureDataset(threddsDataset, null); if (result.fatalError) { System.out.println(" openDatatype errs=" + result.errLog); return null; } if (result.featureType == FeatureType.GRID) { System.out.println(" GRID=" + result.location); GridDataset gridDataset = (GridDataset) result.featureDataset; return extractGeospatial(gridDataset); } else if (result.featureType == FeatureType.POINT) { PointObsDataset pobsDataset = (PointObsDataset) result.featureDataset; LatLonRect llbb = pobsDataset.getBoundingBox(); if (null != llbb) { ThreddsMetadata.GeospatialCoverage gc = new ThreddsMetadata.GeospatialCoverage(); gc.setBoundingBox(llbb); return gc; } } else if (result.featureType == FeatureType.STATION) { StationObsDataset sobsDataset = (StationObsDataset) result.featureDataset; LatLonRect llbb = sobsDataset.getBoundingBox(); if (null != llbb) { ThreddsMetadata.GeospatialCoverage gc = new ThreddsMetadata.GeospatialCoverage(); gc.setBoundingBox(llbb); return gc; } } } finally { try { if ((result != null) && (result.featureDataset != null)) result.featureDataset.close(); } catch (IOException ioe) { logger.error("Closing dataset " + result.featureDataset, ioe); } } return null; }
/** * Open a ucar.nc2.dt.PointObsDataset, write out in CF point format. * * @param fileIn open through TypedDatasetFactory.open(FeatureType.POINT, ..) * @param fileOut write to this netcdf-3 file * @param inMemory if true, read file into memory for efficiency * @return true on success * @throws IOException on read/write error */ public static boolean rewritePointObsDataset(String fileIn, String fileOut, boolean inMemory) throws IOException { System.out.println( "Rewrite2 .nc files from " + fileIn + " to " + fileOut + " inMemory= " + inMemory); long start = System.currentTimeMillis(); // do it in memory for speed NetcdfFile ncfile = inMemory ? NetcdfFile.openInMemory(fileIn) : NetcdfFile.open(fileIn); NetcdfDataset ncd = new NetcdfDataset(ncfile); StringBuilder errlog = new StringBuilder(); PointObsDataset pobsDataset = (PointObsDataset) TypedDatasetFactory.open(FeatureType.POINT, ncd, null, errlog); if (pobsDataset == null) return false; writePointObsDataset(pobsDataset, fileOut); pobsDataset.close(); long took = System.currentTimeMillis() - start; System.out.println(" that took " + (took - start) + " msecs"); return true; }
/** * write data from a ucar.nc2.dt.PointObsDataset into CF point format. * * @param pobsDataset rewrite data from here * @param fileOut write to tehis netcdf-3 file * @throws IOException on read/write error */ public static void writePointObsDataset(PointObsDataset pobsDataset, String fileOut) throws IOException { // see if we have an altitude String altUnits = null; DataIterator iterOne = pobsDataset.getDataIterator(-1); while (iterOne.hasNext()) { PointObsDatatype pobsData = (PointObsDatatype) iterOne.nextData(); ucar.unidata.geoloc.EarthLocation loc = pobsData.getLocation(); altUnits = Double.isNaN(loc.getAltitude()) ? null : "meters"; break; } List<VariableSimpleIF> vars = pobsDataset.getDataVariables(); List<PointObVar> nvars = new ArrayList<PointObVar>(vars.size()); // put vars in order for (VariableSimpleIF v : vars) { if (v.getDataType().isNumeric()) nvars.add(new PointObVar(v)); } int ndoubles = vars.size(); double[] dvals = new double[ndoubles]; for (VariableSimpleIF v : vars) { if (v.getDataType().isString()) nvars.add(new PointObVar(v)); } String[] svals = new String[vars.size() - ndoubles]; FileOutputStream fos = new FileOutputStream(fileOut); DataOutputStream out = new DataOutputStream(fos); CFPointObWriter writer = new CFPointObWriter(out, pobsDataset.getGlobalAttributes(), altUnits, nvars, -1); DataIterator iter = pobsDataset.getDataIterator(1000 * 1000); while (iter.hasNext()) { PointObsDatatype pobsData = (PointObsDatatype) iter.nextData(); StructureData sdata = pobsData.getData(); int dcount = 0; int scount = 0; for (PointObVar v : nvars) { if (v.getDataType().isNumeric()) { Array data = sdata.getArray(v.getName()); data.resetLocalIterator(); if (data.hasNext()) dvals[dcount++] = data.nextDouble(); } else if (v.getDataType().isString()) { ArrayChar data = (ArrayChar) sdata.getArray(v.getName()); svals[scount++] = data.getString(); } } ucar.unidata.geoloc.EarthLocation loc = pobsData.getLocation(); writer.addPoint( loc.getLatitude(), loc.getLongitude(), loc.getAltitude(), pobsData.getObservationTimeAsDate(), dvals, svals); } writer.finish(); }