introducing Geo charts
git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/data-analysis/EcologicalEngineGeoSpatialExtension@112288 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
ac76e5d9bd
commit
5df3b52b89
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,130 @@
|
||||||
|
package org.gcube.dataanalysis.geo.algorithms;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.ColumnType;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.ColumnTypesList;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.DatabaseType;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.InputTable;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.TableTemplates;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.transducers.charts.AbstractChartsProducer;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.utils.IOHelper;
|
||||||
|
import org.gcube.dataanalysis.geo.charts.GeoMapChart;
|
||||||
|
import org.gcube.dataanalysis.geo.charts.GeoTemporalPoint;
|
||||||
|
|
||||||
|
public class StaticGeoChartProducer extends AbstractChartsProducer {
|
||||||
|
|
||||||
|
protected static String longitudeParameter = "Longitude";
|
||||||
|
protected static String latitudeParameter = "Latitude";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setInputParameters() {
|
||||||
|
List<TableTemplates> templates = new ArrayList<TableTemplates>();
|
||||||
|
templates.add(TableTemplates.GENERIC);
|
||||||
|
InputTable tinput = new InputTable(templates, inputTableParameter, "The input table");
|
||||||
|
inputs.add(tinput);
|
||||||
|
|
||||||
|
ColumnType p1 = new ColumnType(inputTableParameter, longitudeParameter, "The column containing longitude decimal values", "long", false);
|
||||||
|
ColumnType p2 = new ColumnType(inputTableParameter, latitudeParameter, "The column containing latitude decimal values", "lat", false);
|
||||||
|
ColumnTypesList q = new ColumnTypesList(inputTableParameter, quantitiesParameter, "The numeric quantities to visualize ", true);
|
||||||
|
|
||||||
|
inputs.add(p1);
|
||||||
|
inputs.add(p2);
|
||||||
|
inputs.add(q);
|
||||||
|
|
||||||
|
DatabaseType.addDefaultDBPars(inputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "An algorithm producing a charts that displays quantities as colors of countries. The color indicates the sum of the values recorded in a country.";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String InfoRetrievalQuery(String table, String[] dimensions, String quantity, String time) {
|
||||||
|
if (quantity.length() == 0)
|
||||||
|
return "select distinct " + Arrays.toString(dimensions).replace("[", "").replace("]", "") + " from " + table;
|
||||||
|
else
|
||||||
|
return "select distinct " + Arrays.toString(dimensions).replace("[", "").replace("]", "") + " , " + quantity + " as quanta232a from " + table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getDimensions() {
|
||||||
|
String[] dimensions = { IOHelper.getInputParameter(config, longitudeParameter), IOHelper.getInputParameter(config, latitudeParameter) };
|
||||||
|
return dimensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LinkedHashMap<String , Object> createCharts(String[] dimensions, String quantity, String time, List<Object> rows, boolean displaychart) {
|
||||||
|
if (dimensions == null)
|
||||||
|
dimensions = new String[0];
|
||||||
|
|
||||||
|
List<GeoTemporalPoint> xyvalues = new ArrayList<GeoTemporalPoint>();
|
||||||
|
long t0 = System.currentTimeMillis();
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: building Geo dataset");
|
||||||
|
for (Object row : rows) {
|
||||||
|
Object[] array = (Object[]) row;
|
||||||
|
Double lat = null;
|
||||||
|
Double longitude = null;
|
||||||
|
Double q = null;
|
||||||
|
try {
|
||||||
|
longitude = Double.parseDouble("" + array[0]);
|
||||||
|
lat = Double.parseDouble("" + array[1]);
|
||||||
|
if (quantity.length() >0)
|
||||||
|
q = Double.parseDouble("" + array[2]);
|
||||||
|
else
|
||||||
|
q = 0d;
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
if (lat != null && longitude != null && q != null)
|
||||||
|
xyvalues.add(new GeoTemporalPoint(longitude, lat, q));
|
||||||
|
else
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: skipping these values "+longitude+","+lat+","+q);
|
||||||
|
}
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: producing charts");
|
||||||
|
LinkedHashMap<String , Object> charts = new LinkedHashMap<String, Object>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
String baseImageName = new File(config.getPersistencePath(), "" + UUID.randomUUID()).getAbsolutePath();
|
||||||
|
String pointsImage = baseImageName + "_points.jpg";
|
||||||
|
if (xyvalues.size()>0){
|
||||||
|
GeoMapChart.createWorldImageWithPoints(config.getConfigPath(),xyvalues, pointsImage);
|
||||||
|
charts.put("Distribution of latitudes and longitudes points",ImageIO.read(new File(pointsImage)));
|
||||||
|
|
||||||
|
|
||||||
|
if (quantity.length()>0) {
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: quantity is present, producing all the static geocharts");
|
||||||
|
String eezImage = baseImageName + "_eez.jpg";
|
||||||
|
GeoMapChart.createEEZWeightedImage(config.getConfigPath(),xyvalues, eezImage, config.getPersistencePath());
|
||||||
|
try{charts.put("Distribution of summed quantities over Exclusive Economic Zone delimitations",ImageIO.read(new File(eezImage)));}catch(Exception e){AnalysisLogger.getLogger().debug("StaticGeoChartProducer: WARNING could not produce EEZ chart");}
|
||||||
|
String faoImage = baseImageName + "_FAO.jpg";
|
||||||
|
GeoMapChart.createFAOAreasWeightedImage(config.getConfigPath(),xyvalues, faoImage, config.getPersistencePath());
|
||||||
|
try{charts.put("Distribution of summed quantities over FAO Major Area delimitations",ImageIO.read(new File(faoImage)));}catch(Exception e){AnalysisLogger.getLogger().debug("StaticGeoChartProducer: WARNING could not produce FAO chart");}
|
||||||
|
String worldImage = baseImageName + "_world.jpg";
|
||||||
|
GeoMapChart.createWorldWeightedImage(config.getConfigPath(),xyvalues, worldImage, config.getPersistencePath(),null,null);
|
||||||
|
try{charts.put("Distribution of summed quantities over emerged lands, divided per country",ImageIO.read(new File(worldImage)));}catch(Exception e){AnalysisLogger.getLogger().debug("StaticGeoChartProducer: WARNING could not country chart");}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: quantity is absent, producing only one geochart");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: no viable point was found");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: error in producing GeoCharts " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
AnalysisLogger.getLogger().debug("StaticGeoChartProducer: procedure finished in ms " + (System.currentTimeMillis() - t0));
|
||||||
|
return charts;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
package org.gcube.dataanalysis.geo.algorithms;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.ColumnType;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.ColumnTypesList;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.DatabaseType;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.InputTable;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.TableTemplates;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.transducers.charts.TimeSeriesChartsTransducerer;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.utils.IOHelper;
|
||||||
|
import org.gcube.dataanalysis.geo.charts.GeoMapChart;
|
||||||
|
import org.gcube.dataanalysis.geo.charts.GeoTemporalPoint;
|
||||||
|
|
||||||
|
public class TimeGeoChartProducer extends TimeSeriesChartsTransducerer {
|
||||||
|
|
||||||
|
protected static String longitudeParameter = "Longitude";
|
||||||
|
protected static String latitudeParameter = "Latitude";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setInputParameters() {
|
||||||
|
List<TableTemplates> templates = new ArrayList<TableTemplates>();
|
||||||
|
templates.add(TableTemplates.GENERIC);
|
||||||
|
InputTable tinput = new InputTable(templates, inputTableParameter, "The input table");
|
||||||
|
inputs.add(tinput);
|
||||||
|
|
||||||
|
ColumnType p1 = new ColumnType(inputTableParameter, longitudeParameter, "The column containing longitude decimal values", "long", false);
|
||||||
|
ColumnType p2 = new ColumnType(inputTableParameter, latitudeParameter, "The column containing latitude decimal values", "lat", false);
|
||||||
|
ColumnTypesList q = new ColumnTypesList(inputTableParameter, quantitiesParameter, "The numeric quantities to visualize ", false);
|
||||||
|
ColumnType t = new ColumnType(inputTableParameter, timeParameter, "The column containing time information", "year", false);
|
||||||
|
|
||||||
|
inputs.add(p1);
|
||||||
|
inputs.add(p2);
|
||||||
|
inputs.add(q);
|
||||||
|
inputs.add(t);
|
||||||
|
|
||||||
|
DatabaseType.addDefaultDBPars(inputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescription() {
|
||||||
|
return "An algorithm producing an animated gif displaying quantities as colors in time. The color indicates the sum of the values recorded in a country.";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String InfoRetrievalQuery(String table, String[] dimensions, String quantity, String time) {
|
||||||
|
return "select distinct " + Arrays.toString(dimensions).replace("[", "").replace("]", "") + " , " + quantity + "," + time + " from " + table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getDimensions() {
|
||||||
|
String[] dimensions = { IOHelper.getInputParameter(config, longitudeParameter), IOHelper.getInputParameter(config, latitudeParameter) };
|
||||||
|
return dimensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LinkedHashMap<String, Object> createCharts(String[] dimensions, String quantity, String time, List<Object> rows, boolean displaychart) {
|
||||||
|
if (dimensions == null)
|
||||||
|
dimensions = new String[0];
|
||||||
|
|
||||||
|
List<GeoTemporalPoint> xyvalues = new ArrayList<GeoTemporalPoint>();
|
||||||
|
long t0 = System.currentTimeMillis();
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: building Geo dataset");
|
||||||
|
for (Object row : rows) {
|
||||||
|
Object[] array = (Object[]) row;
|
||||||
|
Double lat = null;
|
||||||
|
Double longitude = null;
|
||||||
|
Double q = null;
|
||||||
|
String timel = null;
|
||||||
|
try {
|
||||||
|
longitude = Double.parseDouble("" + array[0]);
|
||||||
|
lat = Double.parseDouble("" + array[1]);
|
||||||
|
q = Double.parseDouble("" + array[2]);
|
||||||
|
if (array[3] != null)
|
||||||
|
timel = "" + array[3];
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
if (lat != null && longitude != null && q != null && timel != null) {
|
||||||
|
xyvalues.add(new GeoTemporalPoint(longitude, lat, q, timel));
|
||||||
|
|
||||||
|
} else
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: skipping these values " + longitude + "," + lat + "," + q + "," + timel);
|
||||||
|
}
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: producing charts");
|
||||||
|
|
||||||
|
LinkedHashMap<String, Object> charts = new LinkedHashMap<String, Object>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
String baseImageName = new File(config.getPersistencePath(), "" + UUID.randomUUID()).getAbsolutePath();
|
||||||
|
String timeImage = baseImageName + "_time.gif";
|
||||||
|
String cumulativeImage = baseImageName + "_cutime.gif";
|
||||||
|
String faotimeImage = baseImageName + "_faotime.gif";
|
||||||
|
String eeztimeImage = baseImageName + "_eeztime.gif";
|
||||||
|
String pointsImage = baseImageName + "points.gif";
|
||||||
|
if (xyvalues.size() > 0) {
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: producing Points Chart in time " + pointsImage);
|
||||||
|
GeoMapChart.createPointsImageInTime(config.getConfigPath(), xyvalues, pointsImage, config.getPersistencePath());
|
||||||
|
charts.put("A GIF file displaying the points recorded in the time frames of the dataset", new File(pointsImage));
|
||||||
|
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: producing World Chart in time " + timeImage);
|
||||||
|
GeoMapChart.createWorldWeightedImageInTime(config.getConfigPath(), xyvalues, timeImage, config.getPersistencePath(), false);
|
||||||
|
charts.put("A GIF file displaying the temporal trend of quantities in each time instant over emerged lands, divided per country", new File(timeImage));
|
||||||
|
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: producing cumulative World Chart in time " + cumulativeImage);
|
||||||
|
GeoMapChart.createWorldWeightedImageInTime(config.getConfigPath(), xyvalues, cumulativeImage, config.getPersistencePath(), true);
|
||||||
|
charts.put("A GIF file displaying the temporal trend of cumulative quantities over emerged lands, divided per country", new File(cumulativeImage));
|
||||||
|
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: producing EEZ World Chart in time " + eeztimeImage);
|
||||||
|
GeoMapChart.createEEZWeightedImageInTime(config.getConfigPath(), xyvalues, eeztimeImage, config.getPersistencePath(), true);
|
||||||
|
charts.put("A GIF file displaying the temporal trend of cumulative quantities over Exclusive Economic Zones", new File(eeztimeImage));
|
||||||
|
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: producing FAO Areas World Chart in time " + faotimeImage);
|
||||||
|
GeoMapChart.createFAOAreasWeightedImageInTime(config.getConfigPath(), xyvalues, faotimeImage, config.getPersistencePath(), true);
|
||||||
|
charts.put("A GIF file displaying the temporal trend of cumulative quantities over FAO Areas", new File(faotimeImage));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: no point was found");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: error in producing GeoCharts " + e.getMessage());
|
||||||
|
AnalysisLogger.getLogger().debug(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
AnalysisLogger.getLogger().debug("TimeGeoChartProducer: procedure finished in ms " + (System.currentTimeMillis() - t0));
|
||||||
|
return charts;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,336 @@
|
||||||
|
package org.gcube.dataanalysis.geo.charts;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.io.File;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.utils.GifSequenceWriter;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.utils.TimeAnalyzer;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.utils.Tuple;
|
||||||
|
import org.gcube.dataanalysis.geo.connectors.asc.AscRaster;
|
||||||
|
import org.gcube.dataanalysis.geo.connectors.asc.AscRasterReader;
|
||||||
|
import org.gcube.dataanalysis.geo.connectors.asc.AscRasterWriter;
|
||||||
|
|
||||||
|
import density.Grid;
|
||||||
|
import density.LazyGrid;
|
||||||
|
import density.Sample;
|
||||||
|
import density.ShrunkGrid;
|
||||||
|
import density.WorldImageProducer;
|
||||||
|
|
||||||
|
public class GeoMapChart {
|
||||||
|
|
||||||
|
public static List<Tuple<Double>> generateRandomWorldPoints() {
|
||||||
|
|
||||||
|
List<Tuple<Double>> xyvalues = new ArrayList<Tuple<Double>>();
|
||||||
|
for (int j = 0; j < 8000; j++) {
|
||||||
|
double randomx = ((180) * Math.random()) - 180 * Math.random();
|
||||||
|
double randomy = ((90) * Math.random()) - 90 * Math.random();
|
||||||
|
xyvalues.add(new Tuple<Double>(randomx, randomy));
|
||||||
|
}
|
||||||
|
|
||||||
|
return xyvalues;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createWorldImageWithPoints(String configFolder, List<GeoTemporalPoint> xyvalues, String outImageFileName) throws Exception {
|
||||||
|
// URL is = ClassLoader.getSystemResource("raster_res/templatelayerres05.asc");
|
||||||
|
// GeoMapChart.class.getClassLoader().getResource("raster_res/templatelayerres05.asc");
|
||||||
|
String is = (new File(configFolder,"templatelayerres05.asc")).getAbsolutePath();
|
||||||
|
createImage(is, outImageFileName, xyvalues, true, 100d, 10000d, false, false,null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createWorldImageWithPointsAndFixedTime(String configFolder, List<GeoTemporalPoint> xyvalues, String outImageFileName, Date time) throws Exception {
|
||||||
|
String is = (new File(configFolder,"templatelayerres05.asc")).getAbsolutePath();
|
||||||
|
createImage(is, outImageFileName, xyvalues, true, 100d, 10000d, false, false,time);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Date> extractTimefromPoints(List<GeoTemporalPoint> points){
|
||||||
|
List<Date> times = new ArrayList<Date>();
|
||||||
|
HashMap<Date, String> timesh = new HashMap<Date, String>();
|
||||||
|
|
||||||
|
for (GeoTemporalPoint p : points){
|
||||||
|
timesh.put(p.time,"");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Date t: timesh.keySet()){
|
||||||
|
int i=0;
|
||||||
|
for (Date d:times){
|
||||||
|
if (d.after(t))
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
times.add(i, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
return times;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createImage(String filepath, String outImageFileName, List<GeoTemporalPoint> xypoints, boolean displaypoints, double min, double max, boolean makelegend, boolean logscale, Date fixedTime) throws Exception {
|
||||||
|
Grid g = new ShrunkGrid(new LazyGrid(filepath), 2000);
|
||||||
|
double cellsize = g.getDimension().getcellsize();
|
||||||
|
double xll = g.getDimension().getxllcorner();
|
||||||
|
double yll = g.getDimension().getyllcorner();
|
||||||
|
// int nrows = g.getDimension().getnrows();
|
||||||
|
// int ncols = g.getDimension().getncols();
|
||||||
|
|
||||||
|
WorldImageProducer d = new WorldImageProducer(g);
|
||||||
|
AscRaster raster = new AscRaster(cellsize, -1, -1, xll, yll);
|
||||||
|
|
||||||
|
Date minimumTime = new Date(System.currentTimeMillis());
|
||||||
|
Date maximumTime = new Date(0);
|
||||||
|
HashMap<Date,String> timeFrames = new HashMap<Date, String>();
|
||||||
|
|
||||||
|
if (xypoints != null) {
|
||||||
|
Sample[] samps = new Sample[xypoints.size()];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
|
||||||
|
for (GeoTemporalPoint t : xypoints) {
|
||||||
|
double longitude = t.x;
|
||||||
|
double latitude = t.y;
|
||||||
|
|
||||||
|
if (minimumTime.after(t.time))
|
||||||
|
minimumTime = new Date(t.time.getTime());
|
||||||
|
if (maximumTime.before(t.time))
|
||||||
|
maximumTime = new Date(t.time.getTime());
|
||||||
|
|
||||||
|
if (timeFrames.get(t.time)==null)
|
||||||
|
timeFrames.put(t.time, "");
|
||||||
|
|
||||||
|
if (fixedTime!=null && t.time.compareTo(fixedTime)!=0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
samps[i] = new Sample(1, raster.latitude2Index(latitude), raster.longitude2Index(longitude), latitude, longitude, "sample");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (displaypoints)
|
||||||
|
d.setTestSamples(samps);
|
||||||
|
}
|
||||||
|
|
||||||
|
// we leave this piece of code here for future developments
|
||||||
|
boolean logScale = logscale;
|
||||||
|
if (!logScale) {
|
||||||
|
d.setMode(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
d.minval = min;
|
||||||
|
d.maxval = max;
|
||||||
|
|
||||||
|
d.visible = false;
|
||||||
|
d.makeLegend = makelegend;
|
||||||
|
d.makeTimeline = fixedTime!=null;
|
||||||
|
|
||||||
|
if (d.makeTimeline){
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(xypoints.get(0).timePattern, Locale.ENGLISH);
|
||||||
|
int timeidx = TimeAnalyzer.getTimeIndexInTimeRange(maximumTime, minimumTime, fixedTime, timeFrames.size());
|
||||||
|
d.setTime(timeFrames.size(), timeidx, sdf.format(minimumTime), sdf.format(fixedTime));
|
||||||
|
}
|
||||||
|
d.makeImage();
|
||||||
|
d.writeImage(outImageFileName, 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static HashMap<Double, Double> createWorldWeightedImage(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir, Date fixedTime, HashMap<Double, Double> weights) throws Exception {
|
||||||
|
String is = (new File(configFolder,"worldcountries_hires.asc")).getAbsolutePath();
|
||||||
|
return createWeightedImage(is, xypoints, outImageFileName, tempdir, false,fixedTime,weights);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createWorldWeightedImageInTime(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir, boolean cumulative) throws Exception {
|
||||||
|
String is = (new File(configFolder,"worldcountries_hires.asc")).getAbsolutePath();
|
||||||
|
createImageInTime(is, configFolder, xypoints, outImageFileName, tempdir, cumulative);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createEEZWeightedImageInTime(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir, boolean cumulative) throws Exception {
|
||||||
|
String is = (new File(configFolder,"eez.asc")).getAbsolutePath();
|
||||||
|
createImageInTime(is, configFolder, xypoints, outImageFileName, tempdir, cumulative);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createFAOAreasWeightedImageInTime(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir, boolean cumulative) throws Exception {
|
||||||
|
String is = (new File(configFolder,"faoareas.asc")).getAbsolutePath();
|
||||||
|
createImageInTime(is, configFolder, xypoints, outImageFileName, tempdir, cumulative);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createImageInTime(String rastersupport, String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir, boolean cumulative) throws Exception {
|
||||||
|
List<Date> times = extractTimefromPoints(xypoints);
|
||||||
|
int i=1;
|
||||||
|
List<String> images = new ArrayList<String>();
|
||||||
|
HashMap<Double, Double> weights = null;
|
||||||
|
for (Date t:times){
|
||||||
|
String tempimg = new File(tempdir,i+"_"+UUID.randomUUID()+".png").getAbsolutePath();
|
||||||
|
if (!cumulative)
|
||||||
|
weights=null;
|
||||||
|
|
||||||
|
HashMap<Double, Double> weightstemp = createWeightedImage(rastersupport, xypoints, tempimg, tempdir, false, t,weights);
|
||||||
|
if (weightstemp!=null){
|
||||||
|
images.add(tempimg);
|
||||||
|
weights=weightstemp;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
AnalysisLogger.getLogger().debug("GeoMapChart: Writing GIF "+outImageFileName);
|
||||||
|
|
||||||
|
GifSequenceWriter.writeGif(outImageFileName, images, 1500);
|
||||||
|
|
||||||
|
for (String image:images){
|
||||||
|
new File(image).delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createPointsImageInTime(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir) throws Exception {
|
||||||
|
List<Date> times = extractTimefromPoints(xypoints);
|
||||||
|
int i=1;
|
||||||
|
List<String> images = new ArrayList<String>();
|
||||||
|
for (Date t:times){
|
||||||
|
String tempimg = new File(tempdir,i+"_"+UUID.randomUUID()+".png").getAbsolutePath();
|
||||||
|
createWorldImageWithPointsAndFixedTime(configFolder,xypoints, tempimg, t);
|
||||||
|
images.add(tempimg);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
AnalysisLogger.getLogger().debug("GeoMapChart: Writing GIF");
|
||||||
|
|
||||||
|
GifSequenceWriter.writeGif(outImageFileName, images, 1500);
|
||||||
|
|
||||||
|
for (String image:images){
|
||||||
|
new File(image).delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void createEEZWeightedImage(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir) throws Exception {
|
||||||
|
String is = (new File(configFolder,"eez.asc")).getAbsolutePath();
|
||||||
|
createWeightedImage(is, xypoints, outImageFileName, tempdir, true,null,null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createFAOAreasWeightedImage(String configFolder,List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir) throws Exception {
|
||||||
|
String is = (new File(configFolder,"faoareas.asc")).getAbsolutePath();
|
||||||
|
createWeightedImage(is, xypoints, outImageFileName, tempdir, false,null,null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<Double, Double> createWeightedImage(String rasterSupportFilePath, List<GeoTemporalPoint> xypoints, String outImageFileName, String tempdir, boolean logscale, Date fixedTime, HashMap<Double, Double> previousweights) throws Exception {
|
||||||
|
|
||||||
|
AscRasterReader reader = new AscRasterReader();
|
||||||
|
AscRaster raster = reader.readRaster(rasterSupportFilePath);
|
||||||
|
|
||||||
|
HashMap<Double, Double> countryweights = new HashMap<Double, Double>();
|
||||||
|
double max = -Double.MAX_VALUE;
|
||||||
|
double min = Double.MAX_VALUE;
|
||||||
|
|
||||||
|
for (GeoTemporalPoint triplet : xypoints) {
|
||||||
|
double x = triplet.x;
|
||||||
|
double y = triplet.y;
|
||||||
|
double weigh = triplet.weight;
|
||||||
|
Date time = triplet.time;
|
||||||
|
|
||||||
|
if (fixedTime!=null && time.compareTo(fixedTime)!=0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int latid = raster.latitude2Index(y);
|
||||||
|
int lonid = raster.longitude2Index(x);
|
||||||
|
|
||||||
|
Double value = raster.getValue(latid, lonid);
|
||||||
|
// int[] lats = { latid - 1, latid + 1, latid - 2, latid + 2};
|
||||||
|
// int[] longs = { lonid - 1, lonid + 1, lonid - 2, lonid + 2};
|
||||||
|
int[] lats = { latid - 1, latid + 1};
|
||||||
|
int[] longs = { lonid - 1, lonid + 1};
|
||||||
|
|
||||||
|
// search nearby
|
||||||
|
if (Double.isNaN(value)) {
|
||||||
|
for (int la = 0; la < lats.length; la++) {
|
||||||
|
for (int lo = 0; lo < longs.length; lo++) {
|
||||||
|
value = raster.getValue(lats[la], longs[lo]);
|
||||||
|
if (!Double.isNaN(value))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!Double.isNaN(value))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//check again if the value is NaN
|
||||||
|
if (!Double.isNaN(value)) {
|
||||||
|
|
||||||
|
Double currentw = countryweights.get(value);
|
||||||
|
if (currentw != null) {
|
||||||
|
weigh += currentw;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (previousweights!=null){
|
||||||
|
currentw = previousweights.get(value);
|
||||||
|
if (currentw != null)
|
||||||
|
weigh += currentw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (weigh > max)
|
||||||
|
max = weigh;
|
||||||
|
if (weigh < min)
|
||||||
|
min = weigh;
|
||||||
|
|
||||||
|
countryweights.put(value, weigh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//case in which we did not find any country in this year
|
||||||
|
if (countryweights.size()==0)
|
||||||
|
return null;
|
||||||
|
//add the previous missing weights
|
||||||
|
if (previousweights!=null){
|
||||||
|
for (Double country:previousweights.keySet()){
|
||||||
|
if (countryweights.get(country)==null){
|
||||||
|
Double pweigh = previousweights.get(country);
|
||||||
|
countryweights.put(country,pweigh);
|
||||||
|
if (pweigh > max)
|
||||||
|
max = pweigh;
|
||||||
|
if (pweigh < min)
|
||||||
|
min = pweigh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//adjust min and max
|
||||||
|
if (min==max){
|
||||||
|
if (max>0)
|
||||||
|
min = 0;
|
||||||
|
else
|
||||||
|
max = 0;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* for (Double key:countryweights.keySet()){ Double weigh = countryweights.get(key);
|
||||||
|
*
|
||||||
|
* if (weigh==0) System.out.println(key+":"+weigh); }
|
||||||
|
*/
|
||||||
|
AscRasterWriter writer = new AscRasterWriter();
|
||||||
|
|
||||||
|
int ncols = raster.getCols();
|
||||||
|
int nrows = raster.getRows();
|
||||||
|
|
||||||
|
for (int i = 0; i < nrows; i++) {
|
||||||
|
for (int j = 0; j < ncols; j++) {
|
||||||
|
double country = raster.getValue(i, j);
|
||||||
|
if (!Double.isNaN(country)) {
|
||||||
|
Double weigh = countryweights.get(country);
|
||||||
|
if (weigh != null)
|
||||||
|
raster.setValue(i, j, weigh);
|
||||||
|
else
|
||||||
|
raster.setValue(i, j, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String ascfile = new File(tempdir, "" + UUID.randomUUID() + ".asc").getAbsolutePath();
|
||||||
|
writer.writeRaster(ascfile, raster);
|
||||||
|
createImage(ascfile, outImageFileName, xypoints, false, min, max, true, logscale,fixedTime);
|
||||||
|
System.gc();
|
||||||
|
boolean deleted = new File(ascfile).delete();
|
||||||
|
AnalysisLogger.getLogger().debug("GeoMapChart: deleted ASC file "+ascfile+" :"+deleted);
|
||||||
|
|
||||||
|
return countryweights;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package org.gcube.dataanalysis.geo.charts;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.gcube.dataanalysis.ecoengine.utils.TimeAnalyzer;
|
||||||
|
|
||||||
|
public class GeoTemporalPoint {
|
||||||
|
|
||||||
|
public double x;
|
||||||
|
public double y;
|
||||||
|
public double z;
|
||||||
|
public double weight;
|
||||||
|
public Date time;
|
||||||
|
public String timePattern = "MM/dd/yyyy";
|
||||||
|
|
||||||
|
public GeoTemporalPoint(double x, double y, double z, double weight, String time) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
this.weight = weight;
|
||||||
|
if (time == null)
|
||||||
|
this.time = new Date(System.currentTimeMillis());
|
||||||
|
else {
|
||||||
|
TimeAnalyzer tsa = new TimeAnalyzer();
|
||||||
|
Date timedate = tsa.string2Date(time);
|
||||||
|
String timePattern = tsa.getPattern();
|
||||||
|
this.time = timedate;
|
||||||
|
this.timePattern = timePattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public GeoTemporalPoint(double x, double y, String time) {
|
||||||
|
this(x, y, 0d, 1d, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GeoTemporalPoint(double x, double y, double weight, String time) {
|
||||||
|
this(x, y, 0d, weight, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GeoTemporalPoint(double x, double y, double weight) {
|
||||||
|
this(x, y, 0d, weight, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -157,7 +157,7 @@ public class AscRaster {
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getValue(int row, int column) {
|
public double getValue(int row, int column) {
|
||||||
if (row < rows && column < cols)
|
if (row < rows && column < cols && row>-1 && column>-1)
|
||||||
if (data[row][column]!= Double.parseDouble(NDATA))
|
if (data[row][column]!= Double.parseDouble(NDATA))
|
||||||
return data[row][column];
|
return data[row][column];
|
||||||
else
|
else
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
package org.gcube.dataanalysis.geo.test;
|
||||||
|
|
||||||
|
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
|
||||||
|
import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration;
|
||||||
|
import org.gcube.dataanalysis.geo.algorithms.StaticGeoChartProducer;
|
||||||
|
import org.gcube.dataanalysis.geo.algorithms.TimeGeoChartProducer;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestGeoCharts {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStaticChart() throws Exception{
|
||||||
|
AnalysisLogger.setLogger("./cfg/" + AlgorithmConfiguration.defaultLoggerFile);
|
||||||
|
AlgorithmConfiguration config = new AlgorithmConfiguration();
|
||||||
|
|
||||||
|
config.setConfigPath("./cfg/");
|
||||||
|
config.setPersistencePath("./chartstmp/");
|
||||||
|
config.setParam("DatabaseUserName", "utente");
|
||||||
|
config.setParam("DatabasePassword", "d4science");
|
||||||
|
config.setParam("DatabaseURL", "jdbc:postgresql://statistical-manager.d.d4science.research-infrastructures.eu/testdb");
|
||||||
|
config.setParam("DatabaseDriver", "org.postgresql.Driver");
|
||||||
|
|
||||||
|
config.setParam("InputTable", "timeseries_id08b3abb9_c7b0_4b82_8117_64b69055416f");
|
||||||
|
config.setParam("Longitude", "x");
|
||||||
|
config.setParam("Latitude", "y");
|
||||||
|
config.setParam("Quantities", "fvalue");
|
||||||
|
|
||||||
|
config.setGcubeScope("/gcube/devsec/devVRE");
|
||||||
|
|
||||||
|
StaticGeoChartProducer cscreator = new StaticGeoChartProducer();
|
||||||
|
cscreator.setConfiguration(config);
|
||||||
|
cscreator.compute();
|
||||||
|
|
||||||
|
System.out.println("DONE! "+cscreator.getOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStaticChartNoQuantities() throws Exception{
|
||||||
|
AnalysisLogger.setLogger("./cfg/" + AlgorithmConfiguration.defaultLoggerFile);
|
||||||
|
AlgorithmConfiguration config = new AlgorithmConfiguration();
|
||||||
|
|
||||||
|
config.setConfigPath("./cfg/");
|
||||||
|
config.setPersistencePath("./chartstmp/");
|
||||||
|
config.setParam("DatabaseUserName", "utente");
|
||||||
|
config.setParam("DatabasePassword", "d4science");
|
||||||
|
config.setParam("DatabaseURL", "jdbc:postgresql://statistical-manager.d.d4science.research-infrastructures.eu/testdb");
|
||||||
|
config.setParam("DatabaseDriver", "org.postgresql.Driver");
|
||||||
|
|
||||||
|
config.setParam("InputTable", "timeseries_id08b3abb9_c7b0_4b82_8117_64b69055416f");
|
||||||
|
config.setParam("Longitude", "x");
|
||||||
|
config.setParam("Latitude", "y");
|
||||||
|
|
||||||
|
config.setGcubeScope("/gcube/devsec/devVRE");
|
||||||
|
|
||||||
|
StaticGeoChartProducer cscreator = new StaticGeoChartProducer();
|
||||||
|
cscreator.setConfiguration(config);
|
||||||
|
cscreator.compute();
|
||||||
|
|
||||||
|
System.out.println("DONE! "+cscreator.getOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTimeChart() throws Exception{
|
||||||
|
AnalysisLogger.setLogger("./cfg/" + AlgorithmConfiguration.defaultLoggerFile);
|
||||||
|
AlgorithmConfiguration config = new AlgorithmConfiguration();
|
||||||
|
|
||||||
|
config.setConfigPath("./cfg/");
|
||||||
|
config.setPersistencePath("./chartstmp/");
|
||||||
|
config.setParam("DatabaseUserName", "utente");
|
||||||
|
config.setParam("DatabasePassword", "d4science");
|
||||||
|
config.setParam("DatabaseURL", "jdbc:postgresql://statistical-manager.d.d4science.research-infrastructures.eu/testdb");
|
||||||
|
config.setParam("DatabaseDriver", "org.postgresql.Driver");
|
||||||
|
|
||||||
|
config.setParam("InputTable", "timeseries_idf1ae1dbe_a2b2_41d9_8e8b_30c739a47903");
|
||||||
|
config.setParam("Longitude", "decimallongitude");
|
||||||
|
config.setParam("Latitude", "decimallatitude");
|
||||||
|
config.setParam("Quantities", "maxdepth");
|
||||||
|
config.setParam("Time", "time");
|
||||||
|
|
||||||
|
config.setGcubeScope("/gcube/devsec/devVRE");
|
||||||
|
|
||||||
|
TimeGeoChartProducer cscreator = new TimeGeoChartProducer();
|
||||||
|
cscreator.setConfiguration(config);
|
||||||
|
cscreator.compute();
|
||||||
|
|
||||||
|
System.out.println("DONE! "+cscreator.getOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSmallTimeChart() throws Exception{
|
||||||
|
AnalysisLogger.setLogger("./cfg/" + AlgorithmConfiguration.defaultLoggerFile);
|
||||||
|
AlgorithmConfiguration config = new AlgorithmConfiguration();
|
||||||
|
|
||||||
|
config.setConfigPath("./cfg/");
|
||||||
|
config.setPersistencePath("./chartstmp/");
|
||||||
|
config.setParam("DatabaseUserName", "utente");
|
||||||
|
config.setParam("DatabasePassword", "d4science");
|
||||||
|
config.setParam("DatabaseURL", "jdbc:postgresql://statistical-manager.d.d4science.research-infrastructures.eu/testdb");
|
||||||
|
config.setParam("DatabaseDriver", "org.postgresql.Driver");
|
||||||
|
|
||||||
|
config.setParam("InputTable", "generic_idc3f49110_995b_45cd_9846_240f25c136be");
|
||||||
|
config.setParam("Longitude", "decimallongitude");
|
||||||
|
config.setParam("Latitude", "decimallatitude");
|
||||||
|
config.setParam("Quantities", "maxdepth");
|
||||||
|
config.setParam("Time", "eventdate");
|
||||||
|
|
||||||
|
config.setGcubeScope("/gcube/devsec/devVRE");
|
||||||
|
|
||||||
|
TimeGeoChartProducer cscreator = new TimeGeoChartProducer();
|
||||||
|
cscreator.setConfiguration(config);
|
||||||
|
cscreator.compute();
|
||||||
|
|
||||||
|
System.out.println("DONE! "+cscreator.getOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package org.gcube.dataanalysis.geo.test;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import org.gcube.dataanalysis.geo.charts.GeoMapChart;
|
||||||
|
|
||||||
|
public class TestResourcesRetrieval {
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String args[]){
|
||||||
|
|
||||||
|
URL is = GeoMapChart.class.getClassLoader().getResource("raster_res/templatelayerres05.asc");
|
||||||
|
System.out.println(is.getPath());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue