diff --git a/src/main/java/org/gcube/dataanalysis/geo/connectors/asc/ASC.java b/src/main/java/org/gcube/dataanalysis/geo/connectors/asc/ASC.java index ced9050..e4d338a 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/connectors/asc/ASC.java +++ b/src/main/java/org/gcube/dataanalysis/geo/connectors/asc/ASC.java @@ -17,4 +17,17 @@ public class ASC implements GISDataConnector{ return features; } + @Override + public double getMinZ(String layerURL, String layerName) { + + return 0; + } + + @Override + public double getMaxZ(String layerURL, String layerName) { + + return 0; + } + + } diff --git a/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDF.java b/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDF.java index 573b08f..c1b00d6 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDF.java +++ b/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDF.java @@ -6,19 +6,37 @@ import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger; import org.gcube.dataanalysis.ecoengine.utils.Tuple; import org.gcube.dataanalysis.geo.interfaces.GISDataConnector; -public class NetCDF implements GISDataConnector{ +public class NetCDF implements GISDataConnector { + + NetCDFDataExplorer netcdffile; + + public NetCDF(String layerURL, String layerName) { + + if (netcdffile == null) + netcdffile = new NetCDFDataExplorer(layerURL, layerName); + + } @Override - public List getFeaturesInTimeInstantAndArea(String layerURL, String layerName, int time, List> coordinates3d, double BBxL, double BBxR, double BByL, double BByR) throws Exception { + public List getFeaturesInTimeInstantAndArea(String layerURL, String layerName, int time, List> coordinates3d, double BBxL, double BBxR, double BByL, double BByR) throws Exception { AnalysisLogger.getLogger().debug("Managing netCDF file"); if (layerURL == null) return null; - - return NetCDFDataExplorer.retrieveDataFromNetCDF(layerURL, layerName, time, coordinates3d, BBxL, BBxR, BByL, BByR); - + + return netcdffile.retrieveDataFromNetCDF(layerURL, layerName, time, coordinates3d, BBxL, BBxR, BByL, BByR); + + } + + @Override + public double getMinZ(String layerURL, String layerName) { + return netcdffile.minZ; + } + + @Override + public double getMaxZ(String layerURL, String layerName) { + + return netcdffile.maxZ; } - - } diff --git a/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDFDataExplorer.java b/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDFDataExplorer.java index 6aa0090..0487e72 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDFDataExplorer.java +++ b/src/main/java/org/gcube/dataanalysis/geo/connectors/netcdf/NetCDFDataExplorer.java @@ -7,7 +7,7 @@ import java.util.List; import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger; import org.gcube.dataanalysis.ecoengine.utils.Tuple; -import org.gcube.dataanalysis.geo.utils.VectorTransformations; +import org.gcube.dataanalysis.geo.utils.VectorOperations; import ucar.ma2.Array; import ucar.ma2.ArrayByte; @@ -39,7 +39,11 @@ public class NetCDFDataExplorer { // http://thredds.research-infrastructures.eu:8080/thredds/catalog/public/netcdf/catalog.xml public static String timePrefix = "time:"; - public static List retrieveDataFromNetCDF(String openDapLink, String layer, int time, List> triplets, double xL, double xR, double yL, double yR) { + public NetCDFDataExplorer(String openDapLink, String layer){ + calcZRange(openDapLink, layer); + } + + public List retrieveDataFromNetCDF(String openDapLink, String layer, int time, List> triplets, double xL, double xR, double yL, double yR) { try { List values = new ArrayList(); if (isGridDataset(openDapLink)) { @@ -60,10 +64,36 @@ public class NetCDFDataExplorer { } } + public double minZ=0; + public double maxZ=0; + + private void calcZRange(String openDapLink, String layer) { + try{ + if (isGridDataset(openDapLink)){ + gds = ucar.nc2.dt.grid.GridDataset.open(openDapLink); + List gridTypes = gds.getGrids(); + for (GridDatatype gdt : gridTypes) { + AnalysisLogger.getLogger().debug("Inside File - layer name: " + gdt.getFullName()); + if (layer.equalsIgnoreCase(gdt.getFullName())) { + CoordinateAxis zAxis = gdt.getCoordinateSystem().getVerticalAxis(); + minZ=zAxis.getMinValue(); + maxZ=zAxis.getMaxValue(); + break; + } + } + } + }catch(Exception e){ + AnalysisLogger.getLogger().debug("NetCDF Explorer Error:"+e.getLocalizedMessage()); + } + } + // A GridDatatype is like a specialized Variable that explicitly handles X,Y,Z,T dimensions - public static List manageGridDataset(String layer, String filename, int time, List> triplets, double xL, double xR, double yL, double yR) throws Exception { + GridDataset gds; + public List manageGridDataset(String layer, String filename, int time, List> triplets, double xL, double xR, double yL, double yR) throws Exception { List values = new ArrayList(); - GridDataset gds = ucar.nc2.dt.grid.GridDataset.open(filename); + if (gds==null) + gds = ucar.nc2.dt.grid.GridDataset.open(filename); + List gridTypes = gds.getGrids(); for (GridDatatype gdt : gridTypes) { AnalysisLogger.getLogger().debug("Inside File - layer name: " + gdt.getFullName()); @@ -131,7 +161,7 @@ public class NetCDFDataExplorer { else if (data instanceof ArrayLong.D3) data3Long = (ArrayLong.D3) data; else if (data instanceof ArrayByte.D3) - data3Double = (ArrayDouble.D3)VectorTransformations.arrayByte3DArrayDouble((ArrayByte)data); + data3Double = (ArrayDouble.D3)VectorOperations.arrayByte3DArrayDouble((ArrayByte)data); else throw new Exception("Layer data format not supported"); } @@ -145,7 +175,7 @@ public class NetCDFDataExplorer { else if (data instanceof ArrayLong.D2) data2Long = (ArrayLong.D2) data; else if (data instanceof ArrayByte.D2) - data2Double = (ArrayDouble.D2)VectorTransformations.arrayByte2DArrayDouble((ArrayByte)data); + data2Double = (ArrayDouble.D2)VectorOperations.arrayByte2DArrayDouble((ArrayByte)data); else throw new Exception("Layer data format not supported"); } diff --git a/src/main/java/org/gcube/dataanalysis/geo/connectors/table/Table.java b/src/main/java/org/gcube/dataanalysis/geo/connectors/table/Table.java index a6f7ce5..9b42bb1 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/connectors/table/Table.java +++ b/src/main/java/org/gcube/dataanalysis/geo/connectors/table/Table.java @@ -7,40 +7,73 @@ import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger; import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration; import org.gcube.dataanalysis.ecoengine.utils.Tuple; import org.gcube.dataanalysis.geo.interfaces.GISDataConnector; -import org.gcube.dataanalysis.geo.utils.VectorTransformations; +import org.gcube.dataanalysis.geo.utils.VectorOperations; + +public class Table implements GISDataConnector { -public class Table implements GISDataConnector{ - AlgorithmConfiguration config; TableMatrixRepresentation tmr; - - public Table(AlgorithmConfiguration config){ + + public Table(AlgorithmConfiguration config) throws Exception { this.config = config; + tmr = new TableMatrixRepresentation(); + tmr.build5DTuples(config, true); } - + @Override public List getFeaturesInTimeInstantAndArea(String layerURL, String layerName, int time, List> coordinates3d, double BBxL, double BBxR, double BByL, double BByR) throws Exception { - + List values = new ArrayList(); values.add(Math.random()); - if (tmr==null){ - tmr = new TableMatrixRepresentation(); - tmr.build5DTuples(config,time,true); - } - - List> tuples = tmr.currentcoordinates5d.get((double)time); - - double tolerance = Math.sqrt(2d)*0.5/2d; - if (tuples.size()==0){ - AnalysisLogger.getLogger().debug("Error in getting elements for time " +time); - throw new Exception("Error in getting elements for time " +time); + List> tuples = tmr.currentcoordinates5d.get((double) time); + // AnalysisLogger.getLogger().debug("TUPLES "+tuples); + double resolution = 0; + if (coordinates3d.size() > 1) + resolution = Math.abs(coordinates3d.get(0).getElements().get(0) - coordinates3d.get(1).getElements().get(0)); + + double tolerance = Math.sqrt(2d) * resolution / 2d; + + if (tuples.size() == 0) { + AnalysisLogger.getLogger().debug("Error in getting elements for time " + time); + throw new Exception("Error in getting elements for time " + time); } - - List v = VectorTransformations.assignPointsValuesToGrid(coordinates3d, time, tuples, tolerance); - + + // check z: if there is at least one point inside the z boundary then it is ok + boolean outsideZ = true; + + for (Tuple coordinates : coordinates3d) { + double Zcoord = 0; + if (coordinates.getElements().size() > 2) + Zcoord = coordinates.getElements().get(2); + + if ((Zcoord <= tmr.maxZ) && (Zcoord >= tmr.minZ)) { + outsideZ = false; + break; + } + } + + if (outsideZ) { + AnalysisLogger.getLogger().debug("Error in getting elements for Z "); + throw new Exception("Outside the z boundaries [" + tmr.minZ + ";" + tmr.maxZ + "]"); + } + + List v = VectorOperations.assignPointsValuesToGrid(coordinates3d, time, tuples, tolerance); + + // AnalysisLogger.getLogger().debug("VALUES "+v); + return v; - + + } + + @Override + public double getMinZ(String layerURL, String layerName) { + return tmr.minZ; + } + + @Override + public double getMaxZ(String layerURL, String layerName) { + return tmr.maxZ; } } diff --git a/src/main/java/org/gcube/dataanalysis/geo/connectors/table/TableMatrixRepresentation.java b/src/main/java/org/gcube/dataanalysis/geo/connectors/table/TableMatrixRepresentation.java index 176a8c0..7baada2 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/connectors/table/TableMatrixRepresentation.java +++ b/src/main/java/org/gcube/dataanalysis/geo/connectors/table/TableMatrixRepresentation.java @@ -9,8 +9,7 @@ import org.gcube.contentmanagement.lexicalmatcher.utils.DatabaseFactory; import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration; import org.gcube.dataanalysis.ecoengine.utils.DatabaseUtils; import org.gcube.dataanalysis.ecoengine.utils.Tuple; -import org.gcube.dataanalysis.geo.matrixmodel.MatrixExtractor; -import org.gcube.dataanalysis.geo.utils.VectorTransformations; +import org.gcube.dataanalysis.geo.utils.VectorOperations; import org.hibernate.SessionFactory; public class TableMatrixRepresentation { @@ -21,12 +20,14 @@ public class TableMatrixRepresentation { public static String timeDimensionColumnParameter = "timeColumn"; public static String valueDimensionColumnParameter = "valueColumn"; public static String tableNameParameter = "geoReferencedTableName"; - + public static String filterParameter = "filter"; + public HashMap currentTimes = null; public HashMap>> currentcoordinates5d=null; + public double maxZ = 0; + public double minZ = 0; - //TODO Manage the case of only time according to a property in the table - public List> build5DTuples(AlgorithmConfiguration configuration, int timeIndex, boolean cacheElements) throws Exception { + public void build5DTuples(AlgorithmConfiguration configuration, boolean cacheElements) throws Exception { currentTimes = new HashMap(); @@ -69,31 +70,43 @@ public class TableMatrixRepresentation { if ((currentcoordinates5d == null) || !cacheElements){ currentcoordinates5d = new HashMap>>(); - String query = "select " + dbtuple + " from " + tableName + " order by time"; + + //find maxZ + if (zField!=null && zField.trim().length()>0){ + String maxzq = "select max("+zField+"),min("+zField+") from "+tableName; + Object [] maxzr = (Object [] )DatabaseFactory.executeSQLQuery(maxzq, dbconnection).get(0); + maxZ = Double.parseDouble(""+maxzr[0]); + minZ = Double.parseDouble(""+maxzr[1]); + } + + String query = "select " + dbtuple + " from " + tableName; + String filter=configuration.getParam(filterParameter); + + if (filter!=null && filter.trim().length()>0) + query+=" where "+filter; + + query += " order by time"; + AnalysisLogger.getLogger().debug("TableMatrixRepresentation-> Query to execute: " + query); rows = DatabaseFactory.executeSQLQuery(query, dbconnection); AnalysisLogger.getLogger().debug("TableMatrixRepresentation-> Returned " + rows.size() + " rows"); for (Object row : rows) { Object[] orow = (Object[]) row; Tuple t = build5DTuple(orow); - Double time = t.getElements().get(3); + double time = t.getElements().get(3); List> coordinates5d = currentcoordinates5d.get(time); if (coordinates5d==null){ coordinates5d=new ArrayList>(); currentcoordinates5d.put(time, coordinates5d); } + //else + //AnalysisLogger.getLogger().debug("TableMatrixRepresentation-> yet found time "+time+"->"+orow[3]); coordinates5d.add(t); } AnalysisLogger.getLogger().debug("TableMatrixRepresentation-> Association complete"); + AnalysisLogger.getLogger().debug("TableMatrixRepresentation-> coordinates set complete: "+currentcoordinates5d.size()); } - List> coordinates5dtoreturn = currentcoordinates5d.get((double)timeIndex); - if (coordinates5dtoreturn.size()==0){ - AnalysisLogger.getLogger().debug("Error in getting elements for time " +timeIndex); - throw new Exception("Error in getting elements for time " +timeIndex); - } - - return coordinates5dtoreturn; } catch (Exception e) { e.printStackTrace(); AnalysisLogger.getLogger().debug("Error in getting elements from DB: " + e.getLocalizedMessage()); @@ -136,20 +149,25 @@ public class TableMatrixRepresentation { // vessels config.setParam(tableNameParameter, "generic_id037d302d_2ba0_4e43_b6e4_1a797bb91728"); - config.setParam(xDimensionColumnParameter, "x"); - config.setParam(yDimensionColumnParameter, "y"); +// config.setParam(xDimensionColumnParameter, "x"); +// config.setParam(yDimensionColumnParameter, "y"); // config.setParam(zDimensionColumnParameter,""); config.setParam(timeDimensionColumnParameter, "datetime"); config.setParam(valueDimensionColumnParameter, "speed"); + config.setParam(filterParameter, "speed<2"); + + AnalysisLogger.setLogger(config.getConfigPath() + AlgorithmConfiguration.defaultLoggerFile); TableMatrixRepresentation tmr = new TableMatrixRepresentation(); - List> tuples = tmr.build5DTuples(config, 0,false); + tmr.build5DTuples(config,false); + List> tuples = tmr.currentcoordinates5d.get(0d); + AnalysisLogger.getLogger().debug("TUPLES:" + tuples); - List> grid = MatrixExtractor.generateCoordinateTripletsInBoundingBox(-47.14, -46.00, 44.52, 45.55, 0, 0.5, 0.5); - List values = VectorTransformations.assignPointsValuesToGrid(grid, 0, tuples, 0.5); + List> grid = VectorOperations.generateCoordinateTripletsInBoundingBox(-47.14, -46.00, 44.52, 45.55, 0, 0.5, 0.5); + List values = VectorOperations.assignPointsValuesToGrid(grid, 0, tuples, 0.5); AnalysisLogger.getLogger().debug("VALUES:" + values); diff --git a/src/main/java/org/gcube/dataanalysis/geo/connectors/wfs/WFS.java b/src/main/java/org/gcube/dataanalysis/geo/connectors/wfs/WFS.java index 08639af..e987b8b 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/connectors/wfs/WFS.java +++ b/src/main/java/org/gcube/dataanalysis/geo/connectors/wfs/WFS.java @@ -64,4 +64,14 @@ public class WFS implements GISDataConnector { return features; } + @Override + public double getMinZ(String layerURL, String layerName) { + return 0; + } + + @Override + public double getMaxZ(String layerURL, String layerName) { + return 0; + } + } diff --git a/src/main/java/org/gcube/dataanalysis/geo/interfaces/GISDataConnector.java b/src/main/java/org/gcube/dataanalysis/geo/interfaces/GISDataConnector.java index c1860e5..33eb5fe 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/interfaces/GISDataConnector.java +++ b/src/main/java/org/gcube/dataanalysis/geo/interfaces/GISDataConnector.java @@ -6,7 +6,9 @@ import org.gcube.dataanalysis.ecoengine.utils.Tuple; public interface GISDataConnector { - List getFeaturesInTimeInstantAndArea(String layerURL, String layerName, int time, List> coordinates3d, double BBxL,double BBxR, double BByL, double BByR) throws Exception; + public List getFeaturesInTimeInstantAndArea(String layerURL, String layerName, int time, List> coordinates3d, double BBxL,double BBxR, double BByL, double BByR) throws Exception; + public double getMinZ(String layerURL, String layerName); + public double getMaxZ(String layerURL, String layerName); } diff --git a/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/MatrixExtractor.java b/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/MatrixExtractor.java index 451a368..4056cc8 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/MatrixExtractor.java +++ b/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/MatrixExtractor.java @@ -1,7 +1,6 @@ package org.gcube.dataanalysis.geo.matrixmodel; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger; @@ -22,6 +21,8 @@ public class MatrixExtractor { private GeoNetworkInspector gnInspector; private AlgorithmConfiguration configuration; public static int maxSignalLength = 100000; + public static int maxzLength = 100000; + boolean log = true; public MatrixExtractor(AlgorithmConfiguration configuration) { gnInspector = new GeoNetworkInspector(); @@ -40,41 +41,20 @@ public class MatrixExtractor { return false; } - public static List> generateCoordinateTripletsInBoundingBox(double x1, double x2, double y1, double y2, double z, double xResolution, double yResolution) { - - int ysteps = (int) ((y2 - y1) / yResolution); - int xsteps = (int) ((x2 - x1) / xResolution); - List> tuples = new ArrayList>(); - AnalysisLogger.getLogger().debug("Building the points grid according to YRes:" + yResolution + " and XRes:" + xResolution); - // build the tuples according to the desired resolution - for (int i = 0; i < ysteps + 1; i++) { - double y = (i * yResolution) + y1; - if (i == ysteps) - y = y2; - for (int j = 0; j < xsteps + 1; j++) { - double x = (j * xResolution) + x1; - if (j == xsteps) - x = x2; - tuples.add(new Tuple(x, y, z)); - } - } - return tuples; - } - protected List getRawValuesInTimeInstantAndBoundingBox(String layerTitle, int time, List> coordinates3d, double xL, double xR, double yL, double yR) throws Exception { return getRawValuesInTimeInstantAndBoundingBox(layerTitle, time, coordinates3d, xL, xR, yL, yR, false); } - - private GISDataConnector currentconnector; - private String layer; - private String layerURL; - - protected List getRawValuesInTimeInstantAndBoundingBox(String layerTitle, int time, List> coordinates3d, double xL, double xR, double yL, double yR, boolean saveLayer) throws Exception { - + + + public GISDataConnector currentconnector; + public String layerName; + public String layerURL; + + public GISDataConnector getConnector(String layerTitle) throws Exception { // get the layer Metadata meta = null; GISDataConnector connector = null; - if (currentconnector != null && saveLayer) + if (currentconnector != null) connector = currentconnector; else { if (isTable()) { @@ -86,76 +66,61 @@ public class MatrixExtractor { } // if the layer is good if (meta != null) { - layer = gnInspector.getLayerName(meta); - if (layer == null) - layer = layerTitle; + layerName = gnInspector.getLayerName(meta); + if (layerName == null) + layerName = layerTitle; layerURL = ""; if (gnInspector.isNetCDFFile(meta)) { Identification id = meta.getIdentificationInfo().iterator().next(); String title = id.getCitation().getTitle().toString(); - AnalysisLogger.getLogger().debug("found a netCDF file with title " + title + " and layer name " + layer); + AnalysisLogger.getLogger().debug("found a netCDF file with title " + title + " and layer name " + layerName); layerURL = gnInspector.getOpenDapLink(meta); - connector = new NetCDF(); + connector = new NetCDF(layerURL, layerName); } else if (gnInspector.isAscFile(meta)) { AnalysisLogger.getLogger().debug("managing ASC File"); layerURL = gnInspector.getHttpLink(meta); connector = new ASC(); } else if (gnInspector.isWFS(meta)) { - AnalysisLogger.getLogger().debug("found a Geo Layer with reference " + layerTitle + " and layer name " + layer); + AnalysisLogger.getLogger().debug("found a Geo Layer with reference " + layerTitle + " and layer name " + layerName); layerURL = gnInspector.getGeoserverLink(meta); connector = new WFS(); } currentconnector = connector; } + + return currentconnector; + } + + //4D Extraction +/** + * Extract raw values in a time instant according to a set of grid points and a bounding box + */ + protected List getRawValuesInTimeInstantAndBoundingBox(String layerTitle, int time, List> coordinates3d, double xL, double xR, double yL, double yR, boolean saveLayer) throws Exception { + GISDataConnector connector = getConnector(layerTitle); //execute connector if (connector != null) - return connector.getFeaturesInTimeInstantAndArea(layerURL, layer, time, coordinates3d, xL, xR, yL, yR); + return connector.getFeaturesInTimeInstantAndArea(layerURL, layerName, time, coordinates3d, xL, xR, yL, yR); else throw new Exception("ERROR: Connector not found for layer " + layerTitle + " - Cannot Rasterize!"); } - - boolean log = true; - public double[] takeSignalInTime(String layerTitle, double x, double y, double z, double resolution) throws Exception { -// HashMap signal = new HashMap(); - double[] signal = new double[maxSignalLength]; - int t = 0; - log=false; - while (true) { - try { - if (t%100==0) - AnalysisLogger.getLogger().debug("Matrix Extractor-> Extracting Time Instant " + t); - double[][] values = takeTimeInstantMatrix(layerTitle, t, x, x, y, y, z, resolution, resolution, true); -// signal.put(t,values[0][0]); - - signal[t]=values[0][0]; - - t++; - if (t==maxSignalLength) - break; - } catch (Exception e) { - AnalysisLogger.getLogger().debug("Matrix Extractor-> No More Time Intervals!"); - break; - } - } - -// double[] dsignal = new double[signal.size()]; - double[] dsignal = new double[t]; -// int i = 0; -// for (Double signald : signal.values()) { - for (int i=0;iFAO aquatic species distribution map")) { @@ -207,7 +172,7 @@ public class MatrixExtractor { AnalysisLogger.getLogger().debug("Bounding box: (" + x1 + "," + x2 + ";" + y1 + "," + y2 + ")"); // long t0=System.currentTimeMillis(); - List timeValues = getRawValuesInTimeInstantAndBoundingBox(layerTitle, timeInstant, tuples, x1, x2, y1, y2, savelayer); + List timeValues = getRawValuesInTimeInstantAndBoundingBox(layerTitle, timeInstant, tuples, x1, x2, y1, y2, cachelayer); // AnalysisLogger.getLogger().debug("Elapsed:"+(System.currentTimeMillis()-t0)); if (log) @@ -243,18 +208,8 @@ public class MatrixExtractor { // applyNearestNeighbor(); if (log) - AnalysisLogger.getLogger().debug("Features map: " + slice.length + "," + slice[0].length); + AnalysisLogger.getLogger().debug("Features map: rows " + slice.length + ", cols " + slice[0].length); return slice; } - - public void applyNearestNeighbor() { - - /* - * AnalysisLogger.getLogger().debug("Applying nearest Neighbor to all the rows"); //apply nearest neighbor to each row AlgorithmConfiguration config = new AlgorithmConfiguration(); config.setConfigPath(configDir); boolean rapidinit = false; - * - * - * for (int i=0;i Extracting Time Instant " + timeIndex); + double[][] values = extractXYGridWithFixedTZ(layerTitle, timeIndex, x, x, y, y, z, resolution, resolution, true); + int ver = values.length; + int hor = values.length; + //take central value + double value=values[ver/2][hor/2]; + return value; + } + +} diff --git a/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/RasterTable.java b/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/RasterTable.java index 75246a0..27645ca 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/RasterTable.java +++ b/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/RasterTable.java @@ -10,6 +10,7 @@ import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration; import org.gcube.dataanalysis.ecoengine.utils.DatabaseUtils; import org.gcube.dataanalysis.ecoengine.utils.Tuple; import org.gcube.dataanalysis.geo.utils.CSquareCodesConverter; +import org.gcube.dataanalysis.geo.utils.VectorOperations; import org.hibernate.SessionFactory; /** @@ -66,7 +67,7 @@ public class RasterTable { // create a table DatabaseFactory.executeSQLUpdate(String.format(createTableStatement, tablename), dbconnection); AnalysisLogger.getLogger().debug("Table " + tablename + " created"); - List> coordinates = MatrixExtractor.generateCoordinateTripletsInBoundingBox(x1, x2, y1, y2, z, xResolution, yResolution); + List> coordinates = VectorOperations.generateCoordinateTripletsInBoundingBox(x1, x2, y1, y2, z, xResolution, yResolution); int triplets = coordinates.size(); AnalysisLogger.getLogger().debug("Generated " + triplets + " coordinates triples"); List values = associateValueToCoordinates(coordinates, valuesMatrix); diff --git a/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/TimeSeriesExtractor.java b/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/TimeSeriesExtractor.java new file mode 100644 index 0000000..d17a627 --- /dev/null +++ b/src/main/java/org/gcube/dataanalysis/geo/matrixmodel/TimeSeriesExtractor.java @@ -0,0 +1,62 @@ +package org.gcube.dataanalysis.geo.matrixmodel; + +import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger; +import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration; + +public class TimeSeriesExtractor extends MatrixExtractor{ + + public TimeSeriesExtractor(AlgorithmConfiguration configuration) { + super(configuration); + } + + //Time Analysis + /** + * Extracts an observations signal for a certain point in space + */ + + public double[] extractT(String layerTitle, double x, double y, double z, double resolution) throws Exception { + double[] signal = new double[maxSignalLength]; + int t = 0; + log=false; + while (true) { + try { + if (t%100==0) + AnalysisLogger.getLogger().debug("Matrix Extractor-> Extracting Time Instant " + t); + double[][] values = extractXYGridWithFixedTZ(layerTitle, t, x, x, y, y, z, resolution, resolution, true); + + signal[t]=values[0][0]; + + t++; + if (t==maxSignalLength) + break; + } catch (Exception e) { + AnalysisLogger.getLogger().debug("Matrix Extractor-> No More Time Intervals! "+e.getMessage()); + break; + } + } + + AnalysisLogger.getLogger().debug("Matrix Extractor-> Signal Length:"+t); + double[] dsignal = new double[t]; + for (int i=0;i Extracting Z value " + z); + + double[][] values = extractXYGridWithFixedTZ(layerTitle, timeIndex, x, x, y, y, z, resolution, resolution, true); + signal[zcounter]=values[0][0]; + zcounter++; + } catch (Exception e) { + AnalysisLogger.getLogger().debug("Matrix Extractor-> No More Time Intervals!"); + break; + } + } + + AnalysisLogger.getLogger().debug("Matrix Extractor-> Signal Length:"+zcounter); + double[] dsignal = new double[zcounter]; + for (int i=0;i