@Override public DatasetMetadata queryMetadata(String uri, String referential) throws IOException { DatasetMetadata md = new DatasetMetadata(); // Coordinate system Dataset dataset = findDataset(uri, referential); if (dataset == null) { throw new IOException(String.format("Could not find dataset %s", uri)); } log.trace("Querying spatial axes of {}", dataset); List<TimeSlice> tss = datasetDao.getTimeSlices(dataset.getId()); GridProjected grid = queryGrid(dataset, tss); TimeAxis timeAxis = queryTimeAxis(dataset, tss); md.setCsys(new QueryCoordinateSystem(grid, timeAxis)); // Variable names log.trace("Querying variable names of {}", dataset); List<String> bandNames = new ArrayList<>(); for (Band b : datasetDao.getBands(dataset.getId())) { bandNames.add(b.getName()); } // In the current RSA, all datasets have coordinate axes (1D variables) // x, y and time bandNames.add("time"); bandNames.add("y"); bandNames.add("x"); md.setVariables(bandNames); return md; }
ReadWriteLock getLock(Dataset dataset) { List<TimeSlice> tss = datasetDao.getTimeSlices(dataset.getId()); // Get locks for all timeslices TimeSliceDbReadWriteLock lock = new TimeSliceDbReadWriteLock(TaskType.Query.toString()); for (TimeSlice ts : tss) lock.getTimeSliceIds().add(ts.getId()); return lock; }
private GridProjected queryGrid(Dataset dataset, List<TimeSlice> tss) throws IOException { // Create a bounding box that encompasses all time slices. Box smbounds = timeSliceUtil.aggregateBounds(tss); if (smbounds == null) throw new IOException("Could not determine bounds: no time slices."); BoxReal bounds = new BoxReal(2); bounds.getMin().setX(smbounds.getXMin()); bounds.getMin().setY(smbounds.getYMin()); bounds.getMax().setX(smbounds.getXMax()); bounds.getMax().setY(smbounds.getYMax()); // Resolution. double cellSize = dataset.getResolution().toDouble(); VectorReal resolution = VectorReal.createEmpty(2); resolution.setX(cellSize); resolution.setY(cellSize); // All files for a given dataset share a common coordinate system. So, // we can just open one of the blank files and take a peek at it. CoordinateSystem srs = null; List<Band> bands = datasetDao.getBands(dataset.getId()); for (Band b : bands) { Path blankTilePath = bandUtil.getBlankTilePath(dataset, b); if (Files.notExists(blankTilePath)) continue; NetcdfDataset ncd = NetcdfDataset.openDataset(blankTilePath.toString()); try { ncd.enhance(); srs = ncd.getCoordinateSystems().get(0); break; } finally { ncd.close(); } } if (srs == null) { throw new IOException( String.format( "Could not determine " + "coordinate system for dataset %s. There may be no " + "tiles, or the bounds in the database may not match the " + "tiles stored on disk.", dataset)); } return new GridProjected(bounds, resolution, srs); }
protected Dataset findDataset(String uri, String referential) throws IOException { URI parsedUri; try { parsedUri = new URI(uri); } catch (URISyntaxException e) { throw new IOException("Could not open dataset", e); } String path = parsedUri.getSchemeSpecificPart(); Matcher matcher = DATASET_PATTERN.matcher(path); if (!matcher.matches()) { throw new FileNotFoundException(String.format("Invalid dataset name %s", path)); } String name = matcher.group(1); CellSize res = CellSize.fromHumanString(matcher.group(2)); return datasetDao.findDatasetByName(name, res); }