/** * Open a ucar.nc2.ft.PointFeatureCollection, 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 rewritePointFeatureDataset(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); Formatter errlog = new Formatter(); FeatureDataset fd = FeatureDatasetFactoryManager.wrap(FeatureType.ANY_POINT, ncd, null, errlog); if (fd == null) return false; if (fd instanceof FeatureDatasetPoint) { writePointFeatureCollection((FeatureDatasetPoint) fd, fileOut); fd.close(); long took = System.currentTimeMillis() - start; System.out.println(" that took " + (took - start) + " msecs"); return true; } return false; }
/** * Write a ucar.nc2.ft.PointFeatureCollection in CF point format. * * @param pfDataset find the first PointFeatureCollection, and write all data from it * @param fileOut write to this netcdf-3 file * @return number of records written * @throws IOException on read/write error, or if no PointFeatureCollection in pfDataset */ public static int writePointFeatureCollection(FeatureDatasetPoint pfDataset, String fileOut) throws IOException { // extract the PointFeatureCollection PointFeatureCollection pointFeatureCollection = null; List<FeatureCollection> featureCollectionList = pfDataset.getPointFeatureCollectionList(); for (FeatureCollection featureCollection : featureCollectionList) { if (featureCollection instanceof PointFeatureCollection) pointFeatureCollection = (PointFeatureCollection) featureCollection; } if (null == pointFeatureCollection) throw new IOException("There is no PointFeatureCollection in " + pfDataset.getLocation()); long start = System.currentTimeMillis(); FileOutputStream fos = new FileOutputStream(fileOut); DataOutputStream out = new DataOutputStream(new BufferedOutputStream(fos, 10000)); WriterCFPointDataset writer = null; /* LOOK BAD List<VariableSimpleIF> dataVars = new ArrayList<VariableSimpleIF>(); ucar.nc2.NetcdfFile ncfile = pfDataset.getNetcdfFile(); if ((ncfile == null) || !(ncfile instanceof NetcdfDataset)) { dataVars.addAll(pfDataset.getDataVariables()); } else { NetcdfDataset ncd = (NetcdfDataset) ncfile; for (VariableSimpleIF vs : pfDataset.getDataVariables()) { if (ncd.findCoordinateAxis(vs.getName()) == null) dataVars.add(vs); } } */ int count = 0; pointFeatureCollection.resetIteration(); while (pointFeatureCollection.hasNext()) { PointFeature pointFeature = (PointFeature) pointFeatureCollection.next(); StructureData data = pointFeature.getData(); if (count == 0) { EarthLocation loc = pointFeature.getLocation(); // LOOK we dont know this until we see the obs String altUnits = Double.isNaN(loc.getAltitude()) ? null : "meters"; // LOOK units may be wrong writer = new WriterCFPointDataset(out, pfDataset.getGlobalAttributes(), altUnits); writer.writeHeader(pfDataset.getDataVariables(), -1); } writer.writeRecord(pointFeature, data); count++; } writer.finish(); out.flush(); out.close(); long took = System.currentTimeMillis() - start; System.out.printf( "Write %d records from %s to %s took %d msecs %n", count, pfDataset.getLocation(), fileOut, took); return count; }
/** * 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; }