private void count(Group g) { ndims += g.getDimensions().size(); nvars += g.getVariables().size(); ngatts += g.getAttributes().size(); ngroups += g.getGroups().size(); for (Variable v : g.getVariables()) { natts += v.getAttributes().size(); if (v instanceof Structure) { nstructFields += ((Structure) v).getVariables().size(); } } for (Group ng : g.getGroups()) count(ng); }
private void handleMetadataGroup(Group group, MetadataElement metadataElement) throws ProductIOException { List<Variable> variables = group.getVariables(); for (Variable variable : variables) { final String name = variable.getShortName(); final int dataType = getProductDataType(variable); Array array; try { array = variable.read(); } catch (IOException e) { throw new ProductIOException(e.getMessage()); } final ProductData data = ProductData.createInstance(dataType, array.getStorage()); final MetadataAttribute attribute = new MetadataAttribute("data", data, true); final MetadataElement sdsElement = new MetadataElement(name); sdsElement.addAttribute(attribute); metadataElement.addElement(sdsElement); final List<Attribute> list = variable.getAttributes(); for (Attribute hdfAttribute : list) { final String attribName = hdfAttribute.getShortName(); if ("units".equals(attribName)) { attribute.setUnit(hdfAttribute.getStringValue()); } else if ("long_name".equals(attribName)) { attribute.setDescription(hdfAttribute.getStringValue()); } else { addAttributeToElement(sdsElement, hdfAttribute); } } } }
public void addBandMetadata(Product product) throws ProductIOException { Group group = ncFile.findGroup("Geophysical_Data"); if (productReader.getProductType() == SeadasProductReader.ProductType.Level2_Aquarius) { group = ncFile.findGroup("Aquarius_Data"); } if (productReader.getProductType() == SeadasProductReader.ProductType.Level1B_HICO) { group = ncFile.findGroup("products"); } if (group != null) { final MetadataElement bandAttributes = new MetadataElement("Band_Attributes"); List<Variable> variables = group.getVariables(); for (Variable variable : variables) { final String name = variable.getShortName(); final MetadataElement sdsElement = new MetadataElement(name + ".attributes"); final int dataType = getProductDataType(variable); final MetadataAttribute prodtypeattr = new MetadataAttribute("data_type", dataType); sdsElement.addAttribute(prodtypeattr); bandAttributes.addElement(sdsElement); final List<Attribute> list = variable.getAttributes(); for (Attribute varAttribute : list) { addAttributeToElement(sdsElement, varAttribute); } } final MetadataElement metadataRoot = product.getMetadataRoot(); metadataRoot.addElement(bandAttributes); } }
private boolean compareGroups(Group org, Group copy) { if (showCompare) f.format("compare Group %s to %s %n", org.getName(), copy.getName()); boolean ok = true; if (!org.getName().equals(copy.getName())) { f.format(" ** names are different %s != %s %n", org.getName(), copy.getName()); ok = false; } // dimensions ok &= checkAll(org.getDimensions(), copy.getDimensions(), null); // attributes ok &= checkAll(org.getAttributes(), copy.getAttributes(), null); // variables // cant use object equality, just match on short name for (Variable orgV : org.getVariables()) { Variable copyVar = copy.findVariable(orgV.getShortName()); if (copyVar == null) { f.format(" ** cant find variable %s in 2nd file%n", orgV.getFullName()); ok = false; } else { ok &= compareVariables(orgV, copyVar, compareData, true); } } for (Variable copyV : copy.getVariables()) { Variable orgV = org.findVariable(copyV.getShortName()); if (orgV == null) { f.format(" ** cant find variable %s in 1st file%n", copyV.getFullName()); ok = false; } } // nested groups List groups = new ArrayList(); ok &= checkAll(org.getGroups(), copy.getGroups(), groups); for (int i = 0; i < groups.size(); i += 2) { Group orgGroup = (Group) groups.get(i); Group ncmlGroup = (Group) groups.get(i + 1); ok &= compareGroups(orgGroup, ncmlGroup); } return ok; }
private void fixAttributes(Group g) { for (Variable v : g.getVariables()) { for (Attribute a : v.getAttributes()) { if (a.getShortName().equalsIgnoreCase("UNIT") || a.getShortName().equalsIgnoreCase("UNITS")) a.setShortName(CDM.UNITS); if (a.getShortName().equalsIgnoreCase("SCALE_FACTOR")) a.setShortName(CDM.SCALE_FACTOR); if (a.getShortName().equalsIgnoreCase("OFFSET")) a.setShortName(CDM.ADD_OFFSET); } } for (Group ng : g.getGroups()) { fixAttributes(ng); } }
void makeChildren() { children = new ArrayList<>(); List dims = group.getDimensions(); for (int i = 0; i < dims.size(); i++) children.add(new DimensionNode(this, (Dimension) dims.get(i))); List vars = group.getVariables(); for (int i = 0; i < vars.size(); i++) children.add(new VariableNode(this, (VariableIF) vars.get(i))); List groups = group.getGroups(); for (int i = 0; i < groups.size(); i++) children.add(new GroupNode(this, (Group) groups.get(i))); if (debugTree) System.out.println("children=" + group.getFullName() + " "); }
/** * Recursively parses attribute and variable paths, filling <code>attributeList</code> and <code> * variableList</code>. * * @param groups List of groups to recursively parse. */ private void parseAttributesAndVariables(List<Group> groups) { for (Group group : groups) { String groupName = group.getName(); List<Attribute> attributes = group.getAttributes(); for (Attribute attribute : attributes) { String attributeName = attribute.getName(); if (!groupName.endsWith("/")) attributeName = "/" + attributeName; attributeList.add(groupName + attributeName); } List<Variable> variables = group.getVariables(); for (Variable variable : variables) { String variableName = variable.getName(); if (!groupName.endsWith("/")) variableName = "/" + variableName; variableList.add(variableName); } groups = group.getGroups(); parseAttributesAndVariables(groups); } }
private FeatureType amendGrid( Element gridElem, NetcdfFile ncfile, Group parent, String location) { List<Dimension> unknownDims = new ArrayList<>(); // always has x and y dimension String xdimSizeS = gridElem.getChild("XDim").getText().trim(); String ydimSizeS = gridElem.getChild("YDim").getText().trim(); int xdimSize = Integer.parseInt(xdimSizeS); int ydimSize = Integer.parseInt(ydimSizeS); parent.addDimensionIfNotExists(new Dimension("XDim", xdimSize)); parent.addDimensionIfNotExists(new Dimension("YDim", ydimSize)); /* see HdfEosModisConvention UpperLeftPointMtrs=(-20015109.354000,1111950.519667) LowerRightMtrs=(-18903158.834333,-0.000000) Projection=GCTP_SNSOID ProjParams=(6371007.181000,0,0,0,0,0,0,0,0,0,0,0,0) SphereCode=-1 */ Element proj = gridElem.getChild("Projection"); if (proj != null) { Variable crs = new Variable(ncfile, parent, null, HDFEOS_CRS); crs.setDataType(DataType.SHORT); crs.setDimensions(""); // scalar crs.setCachedData(Array.makeArray(DataType.SHORT, 1, 0, 0)); // fake data parent.addVariable(crs); addAttributeIfExists(gridElem, HDFEOS_CRS_Projection, crs, false); addAttributeIfExists(gridElem, HDFEOS_CRS_UpperLeft, crs, true); addAttributeIfExists(gridElem, HDFEOS_CRS_LowerRight, crs, true); addAttributeIfExists(gridElem, HDFEOS_CRS_ProjParams, crs, true); addAttributeIfExists(gridElem, HDFEOS_CRS_SphereCode, crs, false); } // global Dimensions Element d = gridElem.getChild("Dimension"); List<Element> dims = d.getChildren(); for (Element elem : dims) { String name = elem.getChild("DimensionName").getText().trim(); name = NetcdfFile.makeValidCdmObjectName(name); if (name.equalsIgnoreCase("scalar")) continue; String sizeS = elem.getChild("Size").getText().trim(); int length = Integer.parseInt(sizeS); Dimension old = parent.findDimension(name); if ((old == null) || (old.getLength() != length)) { if (length > 0) { Dimension dim = new Dimension(name, length); if (parent.addDimensionIfNotExists(dim) && showWork) System.out.printf(" Add dimension %s %n", dim); } else { log.warn("Dimension {} has size {} {} ", sizeS, name, location); Dimension udim = new Dimension(name, 1); udim.setGroup(parent); unknownDims.add(udim); if (showWork) System.out.printf(" Add dimension %s %n", udim); } } } // Geolocation Variables Group geoFieldsG = parent.findGroup(GEOLOC_FIELDS); if (geoFieldsG == null) geoFieldsG = parent.findGroup(GEOLOC_FIELDS2); if (geoFieldsG != null) { Element floc = gridElem.getChild("GeoField"); List<Element> varsLoc = floc.getChildren(); for (Element elem : varsLoc) { String varname = elem.getChild("GeoFieldName").getText().trim(); Variable v = geoFieldsG.findVariable(varname); // if (v == null) // v = geoFieldsG.findVariable( H4header.createValidObjectName(varname)); assert v != null : varname; Element dimList = elem.getChild("DimList"); List<Element> values = dimList.getChildren("value"); setSharedDimensions(v, values, unknownDims, location); } } // Data Variables Group dataG = parent.findGroup(DATA_FIELDS); if (dataG == null) dataG = parent.findGroup( DATA_FIELDS2); // eg C:\data\formats\hdf4\eos\mopitt\MOP03M-200501-L3V81.0.1.hdf if (dataG != null) { Element f = gridElem.getChild("DataField"); List<Element> vars = f.getChildren(); for (Element elem : vars) { String varname = elem.getChild("DataFieldName").getText().trim(); varname = NetcdfFile.makeValidCdmObjectName(varname); Variable v = dataG.findVariable(varname); // if (v == null) // v = dataG.findVariable( H4header.createValidObjectName(varname)); assert v != null : varname; Element dimList = elem.getChild("DimList"); List<Element> values = dimList.getChildren("value"); setSharedDimensions(v, values, unknownDims, location); } // get projection String projS = null; Element projElem = gridElem.getChild("Projection"); if (projElem != null) projS = projElem.getText().trim(); boolean isLatLon = "GCTP_GEO".equals(projS); // look for XDim, YDim coordinate variables if (isLatLon) { for (Variable v : dataG.getVariables()) { if (v.isCoordinateVariable()) { if (v.getShortName().equals("YDim")) { v.addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Lat.toString())); v.addAttribute(new Attribute(CDM.UNITS, CDM.LAT_UNITS)); } if (v.getShortName().equals("XDim")) v.addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Lon.toString())); } } } } return FeatureType.GRID; }
@Override public Product createProduct() throws ProductIOException { int[] dims; int sceneHeight = 0; int sceneWidth = 0; Group geodata = ncFile.findGroup("geophysical_data"); if (productReader.getProductType() == SeadasProductReader.ProductType.OISST) { dims = ncFile.getVariables().get(4).getShape(); sceneHeight = dims[2]; sceneWidth = dims[3]; mustFlipY = true; } else if (productReader.getProductType() == SeadasProductReader.ProductType.ANCCLIM) { List<Variable> vars = ncFile.getVariables(); for (Variable v : vars) { if (v.getRank() == 2) { dims = v.getShape(); sceneHeight = dims[0]; sceneWidth = dims[1]; } } } else { if (geodata != null) { dims = geodata.getVariables().get(0).getShape(); sceneHeight = dims[0]; sceneWidth = dims[1]; } else { ucar.nc2.Dimension latdim = ncFile.findDimension("lat"); ucar.nc2.Dimension londim = ncFile.findDimension("lon"); if (latdim != null) { sceneHeight = latdim.getLength(); sceneWidth = londim.getLength(); } else { dims = ncFile.getVariables().get(0).getShape(); sceneHeight = dims[0]; sceneWidth = dims[1]; } } } String productName = productReader.getInputFile().getName(); try { productName = getStringAttribute("Product_Name"); } catch (Exception ignored) { } SeadasProductReader.ProductType productType = productReader.getProductType(); Product product = new Product(productName, productType.toString(), sceneWidth, sceneHeight); product.setDescription(productName); product.setFileLocation(productReader.getInputFile()); product.setProductReader(productReader); addGlobalMetadata(product); addSmiMetadata(product); // variableMap = addBands(product, ncFile.getVariables()); variableMap = addSmiBands(product, ncFile.getVariables()); try { addGeocoding(product); } catch (Exception ignored) { } addFlagsAndMasks(product); if (productReader.getProductType() == SeadasProductReader.ProductType.Bathy) { mustFlipY = true; Dimension tileSize = new Dimension(640, 320); product.setPreferredTileSize(tileSize); } return product; }
public void augmentDataset(NetcdfDataset ds, CancelTask cancelTask) throws IOException { ds.addAttribute(null, new Attribute("FeatureType", FeatureType.IMAGE.toString())); // LOOK Group vhrr = ds.findGroup("VHRR"); Group loc = vhrr.findGroup("Geo-Location"); Variable lat = loc.findVariable("Latitude"); lat.addAttribute(new Attribute(CDM.UNITS, "degrees_north")); lat.addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Lat.toString())); Variable lon = loc.findVariable("Longitude"); lon.addAttribute(new Attribute(CDM.UNITS, "degrees_east")); lon.addAttribute(new Attribute(_Coordinate.AxisType, AxisType.Lon.toString())); int[] shape = lat.getShape(); assert shape.length == 2; Dimension scan = new Dimension("scan", shape[0]); Dimension xscan = new Dimension("xscan", shape[1]); vhrr.addDimension(scan); vhrr.addDimension(xscan); lat.setDimensions("scan xscan"); lon.setDimensions("scan xscan"); Group data = vhrr.findGroup("Image Data"); for (Variable v : data.getVariables()) { int[] vs = v.getShape(); if ((vs.length == 2) && (vs[0] == shape[0]) && (vs[1] == shape[1])) { v.setDimensions("scan xscan"); v.addAttribute(new Attribute(_Coordinate.Axes, "lat lon time")); } } /* Group PRODUCT_METADATA { Group PRODUCT_DETAILS { PRODUCT_DETAILS:UNIQUE_ID = "3AVHR_22NOV2007_0902"; PRODUCT_DETAILS:PRODUCT_TYPE = "STANDARD(FULL DISK) "; PRODUCT_DETAILS:PROCESSING_SOFTWARE = "InPGS_XXXXXXXXXXXXXX"; PRODUCT_DETAILS:SPACECRAFT_ID = "INSAT-3A "; PRODUCT_DETAILS:SENSOR_ID = "VHR"; PRODUCT_DETAILS:ACQUISITION_TYPE = "FULL FRAME "; PRODUCT_DETAILS:ACQUISITION_DATE = "22NOV2007"; PRODUCT_DETAILS:ACQUISITION_TIME_IN_GMT = "0902"; PRODUCT_DETAILS:PRODUCT_NAME = " FULL DISK"; PRODUCT_DETAILS:PROCESSING_LEVEL = "L1B"; PRODUCT_DETAILS:BAND_COMBINATION = "Visible(VIS),Thermal Infrared(TIR),Water Vapour(WV)"; PRODUCT_DETAILS:PRODUCT_CODE = "ST00001HD"; } */ Group info = ds.findGroup("PRODUCT_METADATA/PRODUCT_DETAILS"); String dateS = info.findAttribute("ACQUISITION_DATE").getStringValue(); String timeS = info.findAttribute("ACQUISITION_TIME_IN_GMT").getStringValue(); SimpleDateFormat format = new SimpleDateFormat("ddMMMyyyyHHmm"); format.setTimeZone(java.util.TimeZone.getTimeZone("GMT")); try { Date d = format.parse(dateS + timeS); VariableDS time = new VariableDS( ds, vhrr, null, "time", DataType.LONG, "", "seconds since 1970-01-01 00:00", "time generated from PRODUCT_METADATA/PRODUCT_DETAILS"); time.addAttribute( new Attribute( _Coordinate.AxisType, AxisType.Time.toString())); // // LOOK : cant handle scalar coordinates yet ?? time.addAttribute(new Attribute("IsoDate", new DateFormatter().toDateTimeStringISO(d))); CoordinateAxis1D timeAxis = new CoordinateAxis1D(ds, time); ds.addVariable(vhrr, timeAxis); ArrayLong.D0 timeData = new ArrayLong.D0(); timeData.set(d.getTime() / 1000); time.setCachedData(timeData, true); } catch (ParseException e) { e.printStackTrace(); throw new IOException(e.getMessage()); } ds.finish(); }