package org.gcube.dataanalysis.geo.algorithms; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger; import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration; import org.gcube.dataanalysis.ecoengine.configuration.INFRASTRUCTURE; import org.gcube.dataanalysis.ecoengine.datatypes.DatabaseType; import org.gcube.dataanalysis.ecoengine.datatypes.OutputTable; import org.gcube.dataanalysis.ecoengine.datatypes.StatisticalType; import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.TableTemplates; import org.gcube.dataanalysis.ecoengine.interfaces.Transducerer; import org.gcube.dataanalysis.ecoengine.utils.IOHelper; import org.gcube.dataanalysis.ecoengine.utils.ResourceFactory; import org.gcube.dataanalysis.geo.matrixmodel.RasterTable; import org.gcube.dataanalysis.geo.matrixmodel.XYExtractor; public class XYExtraction implements Transducerer { static String layerName = "Layer"; static String t = "TimeIndex"; static String z = "Z"; static String yLL = "BBox_LowerLeftLat"; static String xLL = "BBox_LowerLeftLong"; static String yUR = "BBox_UpperRightLat"; static String xUR = "BBox_UpperRightLong"; static String xRes = "XResolution"; static String yRes = "YResolution"; static String tableName = "OutputTableName"; static String tableLabel = "OutputTableLabel"; AlgorithmConfiguration config; float status; public String layerNameValue; public int time; public double zValue; public double xResValue; public double yResValue; public String tableNameValue; public String tableLabelValue; public double BBxLL = -180; public double BBxUR = 180; public double BByLL = -90; public double BByUR = 90; public List inputs = new ArrayList(); public LinkedHashMap outputParameters = new LinkedHashMap(); @Override public void init() throws Exception { AnalysisLogger.getLogger().debug("Extraction Initialization"); } @Override public String getDescription() { return "An algorithm to extract values associated to an environmental feature repository (e.g. NETCDF, ASC, GeoTiff files etc. ). A grid of points at a certain resolution is specified by the user and values are associated to the points from the environmental repository. " + "It accepts as one geospatial repository ID (via their UUIDs in the infrastructure spatial data repository - recoverable through the Geoexplorer portlet) " + "and the specification about time and space. The algorithm produces one table containing the values associated to the selected bounding box."; } @Override public List getInputParameters() { IOHelper.addStringInput(inputs, layerName, "Layer Title or UUID: The title or the UUID (preferred) of a layer indexed in the e-Infrastructure on GeoNetwork - You can retrieve it from GeoExplorer. Supports several standards (NETCDF, WFS, WCS ASC, GeoTiff )", ""); IOHelper.addDoubleInput(inputs, yLL, "Lower Left Latitute of the Bounding Box", "-60"); IOHelper.addDoubleInput(inputs, xLL, "Lower Left Longitude of the Bounding Box", "-50"); IOHelper.addDoubleInput(inputs, yUR, "Upper Right Latitute of the Bounding Box", "60"); IOHelper.addDoubleInput(inputs, xUR, "Upper Right Longitude of the Bounding Box", "50"); IOHelper.addRandomStringInput(inputs, tableName, "The db name of the table to produce", "extr_"); IOHelper.addStringInput(inputs, tableLabel, "The name of the table to produce", "extr_"); IOHelper.addDoubleInput(inputs, z, "Value of Z. Default is 0, that means processing will be at surface level", "0"); IOHelper.addIntegerInput(inputs, t, "Time Index. The default is the first", "0"); IOHelper.addDoubleInput(inputs, xRes, "Projection resolution on the X axis", "0.5"); IOHelper.addDoubleInput(inputs, yRes, "Projection resolution on the Y axis", "0.5"); DatabaseType.addDefaultDBPars(inputs); return inputs; } protected void getParameters() { layerNameValue = IOHelper.getInputParameter(config, layerName); AnalysisLogger.getLogger().debug("Extraction: Layer " + layerNameValue); String z$ = IOHelper.getInputParameter(config, z); String time$ = IOHelper.getInputParameter(config, t); time = ((time$ != null) && (time$.trim().length() > 0)) ? Integer.parseInt(time$) : 0; if (time < 0) time = 0; AnalysisLogger.getLogger().debug("Extraction: Time " + time); zValue = 0; if ((z$ != null) && (z$.trim().length() > 0)) try { zValue = Double.parseDouble(z$); } catch (Exception ee) { } AnalysisLogger.getLogger().debug("Extraction: Z " + zValue); BByLL = Double.parseDouble(IOHelper.getInputParameter(config, yLL)); BBxLL = Double.parseDouble(IOHelper.getInputParameter(config, xLL)); BByUR = Double.parseDouble(IOHelper.getInputParameter(config, yUR)); BBxUR = Double.parseDouble(IOHelper.getInputParameter(config, xUR)); AnalysisLogger.getLogger().debug("Extraction: yLL " + BByLL); AnalysisLogger.getLogger().debug("Extraction: xLL " + BBxLL); AnalysisLogger.getLogger().debug("Extraction: yUR " + BByUR); AnalysisLogger.getLogger().debug("Extraction: xUR " + BBxUR); yResValue = Double.parseDouble(IOHelper.getInputParameter(config, yRes)); AnalysisLogger.getLogger().debug("Extraction: yRes " + yResValue); xResValue = Double.parseDouble(IOHelper.getInputParameter(config, xRes)); AnalysisLogger.getLogger().debug("Extraction: xRes " + xResValue); tableNameValue = IOHelper.getInputParameter(config, tableName); tableLabelValue = IOHelper.getInputParameter(config, tableLabel); AnalysisLogger.getLogger().debug("Extraction: tableName " + tableNameValue); AnalysisLogger.getLogger().debug("Extraction: tableLabel " + tableLabelValue); String scope = config.getGcubeScope(); AnalysisLogger.getLogger().debug("Extraction: Externally set scope " + scope); if (scope == null) { scope = ScopeProvider.instance.get(); AnalysisLogger.getLogger().debug("Extraction: Internally set scope " + scope); config.setGcubeScope(scope); } } @Override public void compute() throws Exception { try { status = 10; AnalysisLogger.setLogger(config.getConfigPath() + AlgorithmConfiguration.defaultLoggerFile); getParameters(); AnalysisLogger.getLogger().debug("Extractor: MatrixExtractor initialized"); long t0 = System.currentTimeMillis(); XYExtractor extractor = new XYExtractor(config); double[][] matrix = extractor.extractXYGrid(layerNameValue, time, BBxLL, BBxUR, BByLL, BByUR, zValue, xResValue, yResValue); System.out.println("ELAPSED TIME: " + (System.currentTimeMillis() - t0)); AnalysisLogger.getLogger().debug("Extractor: Matrix Extracted"); AnalysisLogger.getLogger().debug("Extractor: ****Rasterizing grid into table****"); status = 30; RasterTable raster = new RasterTable(BBxLL, BBxUR, BByLL, BByUR, zValue, xResValue, yResValue, matrix, config); raster.setTablename(tableNameValue); raster.deleteTable(); raster.dumpGeoTable(); AnalysisLogger.getLogger().debug("Extractor: Map was dumped in table: " + tableNameValue); status = 80; AnalysisLogger.getLogger().debug("Extractor: Elapsed: Whole operation completed in " + ((double) (System.currentTimeMillis() - t0) / 1000d) + "s"); } catch (Exception e) { e.printStackTrace(); AnalysisLogger.getLogger().debug("Extractor: ERROR!: " + e.getLocalizedMessage()); throw e; } finally { status = 100; } } @Override public void shutdown() { AnalysisLogger.getLogger().debug("Shutdown"); } @Override public StatisticalType getOutput() { List templateHspec = new ArrayList(); templateHspec.add(TableTemplates.GENERIC); OutputTable p = new OutputTable(templateHspec, tableLabelValue, tableNameValue, "Output table"); return p; } @Override public float getStatus() { return status; } @Override public INFRASTRUCTURE getInfrastructure() { return INFRASTRUCTURE.LOCAL; } @Override public void setConfiguration(AlgorithmConfiguration config) { this.config = config; } protected ResourceFactory resourceManager; public String getResourceLoad() { if (resourceManager == null) resourceManager = new ResourceFactory(); return resourceManager.getResourceLoad(1); } public String getResources() { return ResourceFactory.getResources(100f); } }