220 lines
9.3 KiB
Java
220 lines
9.3 KiB
Java
package org.gcube.dataanalysis.geo.connectors.wcs;
|
|
|
|
import java.io.File;
|
|
import java.net.URI;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
import org.gcube.contentmanagement.graphtools.utils.HttpRequest;
|
|
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.connectors.asc.ASC;
|
|
import org.gcube.dataanalysis.geo.interfaces.GISDataConnector;
|
|
import org.gcube.dataanalysis.geo.meta.OGCFormatter;
|
|
import org.gcube.dataanalysis.geo.utils.GdalConverter;
|
|
import org.gcube.dataanalysis.geo.utils.GeoTiffMetadata;
|
|
import org.gcube.dataanalysis.geo.utils.VectorOperations;
|
|
import org.gcube.dataanalysis.geo.utils.transfer.TransferUtil;
|
|
|
|
public class WCS implements GISDataConnector {
|
|
// WCS examples
|
|
// String wcs = "http://geoserver-dev.d4science-ii.research-infrastructures.eu/geoserver/wcs?service=WCS&version=1.0.0&request=GetCoverage&COVERAGE=aquamaps:WorldClimBio2&CRS=EPSG:4326&BBOX=-60,-30,60,30,0,0&WIDTH=640&HEIGHT=480&DEPTH=1&FORMAT=geotiff";
|
|
// String wcs = "http://geoserver-dev.d4science-ii.research-infrastructures.eu/geoserver/wcs?service=WCS&version=1.0.0&request=GetCoverage&COVERAGE=aquamaps:WorldClimBio2&CRS=EPSG:4326&BBOX=-60,-30,60,30&WIDTH=640&HEIGHT=480&FORMAT=geotiff&CIAO=1&DEPTH=2&TIME=3&RESX=2&RESY=3";
|
|
// String wcs = "http://geoserver-dev.d4science-ii.research-infrastructures.eu/geoserver/wcs?service=WCS&version=1.0.0&request=GetCoverage&COVERAGE=aquamaps:WorldClimBio2&CRS=EPSG:4326&BBOX=-60,-30,60,30&WIDTH=640&HEIGHT=480&FORMAT=geotiff";
|
|
// String wcs = "http://geoserver-dev.d4science-ii.research-infrastructures.eu/geoserver/wcs/wcs?service=wcs&version=1.0.0&request=GetCoverage&coverage=aquamaps:WorldClimBio2&CRS=EPSG:4326&bbox=-180,0,180,90&width=1&height=1&format=geotiff&RESPONSE_CRS=EPSG:4326";
|
|
|
|
public String baseURL;
|
|
public String coverage;
|
|
public String crs = "EPSG:4326";
|
|
public String boundingBox = "-180,-90,180,90";
|
|
public String width = "640";
|
|
public String height = "480";
|
|
public String depth = null;
|
|
public String format = "geotiff";
|
|
public String time = null;
|
|
public String responseCRS = "EPSG:4326";
|
|
public String resx;
|
|
public String resy;
|
|
public String resz;
|
|
|
|
public double zScale = 0;
|
|
public String persistenceDir;
|
|
|
|
public HashMap<String, String> parameters = new HashMap<String, String>();
|
|
|
|
public WCS(AlgorithmConfiguration config, String wcsURL) throws Exception {
|
|
parseWCSURL(wcsURL);
|
|
persistenceDir = config.getPersistencePath();
|
|
retrieveZScale();
|
|
}
|
|
|
|
public void retrieveZScale() throws Exception {
|
|
String uuid = null;
|
|
try{
|
|
String url = OGCFormatter.getWcsUrl(baseURL, coverage, crs, responseCRS, "-180,0,180,90", "1", "1", depth, format, resx, resy, resz, time, parameters);
|
|
AnalysisLogger.getLogger().debug("Retrieving Z parameters: " + url);
|
|
int urlCheck = HttpRequest.checkUrl(url, null, null);
|
|
AnalysisLogger.getLogger().debug("Checking url: " + urlCheck);
|
|
uuid = new File(persistenceDir, "geotiff" + UUID.randomUUID().toString().replace("-", "") + ".tiff").getAbsolutePath();
|
|
// HttpRequest.downloadFile(url, uuid);
|
|
TransferUtil downloadutil = new TransferUtil();
|
|
downloadutil.setConnectiontimeout(120000);
|
|
downloadutil.setTransferTimeout(120000);
|
|
downloadutil.performTransfer(new URI(url), uuid);
|
|
GeoTiffMetadata meta = new GeoTiffMetadata();
|
|
meta.readAndDisplayMetadata(uuid);
|
|
zScale = meta.zScale;
|
|
AnalysisLogger.getLogger().debug("Retrieved Z Scale: " + zScale);
|
|
}catch (Exception e){
|
|
throw e;
|
|
}
|
|
finally{
|
|
if (uuid!=null)
|
|
AnalysisLogger.getLogger().debug("Deleting point-tiff file :"+uuid+" "+new File(uuid).delete());
|
|
}
|
|
}
|
|
|
|
public void parseWCSURL(String wcsURL) {
|
|
int questionIDX = wcsURL.indexOf("?");
|
|
if (questionIDX < 0) {
|
|
baseURL = wcsURL;
|
|
return;
|
|
}
|
|
|
|
baseURL = wcsURL.substring(0, questionIDX);
|
|
|
|
String toParse = wcsURL.substring(questionIDX + 1);
|
|
String[] elements = toParse.split("&");
|
|
for (String element : elements) {
|
|
int eqIdx = element.indexOf("=");
|
|
if (eqIdx < 0)
|
|
continue;
|
|
String paramName = element.substring(0, eqIdx);
|
|
String paramValue = element.substring(eqIdx + 1);
|
|
associateParameter(paramName, paramValue);
|
|
}
|
|
|
|
AnalysisLogger.getLogger().debug("WCS Parsing finished");
|
|
}
|
|
|
|
private void associateParameter(String parameter, String value) {
|
|
|
|
if (parameter.equalsIgnoreCase("COVERAGE"))
|
|
coverage = value;
|
|
else if (parameter.equalsIgnoreCase("CRS"))
|
|
crs = value;
|
|
else if (parameter.equalsIgnoreCase("BBOX"))
|
|
boundingBox = value;
|
|
else if (parameter.equalsIgnoreCase("WIDTH"))
|
|
width = value;
|
|
else if (parameter.equalsIgnoreCase("HEIGHT"))
|
|
height = value;
|
|
else if (parameter.equalsIgnoreCase("DEPTH"))
|
|
depth = value;
|
|
else if (parameter.equalsIgnoreCase("FORMAT"))
|
|
format = value;
|
|
else if (parameter.equalsIgnoreCase("RESX"))
|
|
resx = value;
|
|
else if (parameter.equalsIgnoreCase("RESY"))
|
|
resy = value;
|
|
else if (parameter.equalsIgnoreCase("RESZ"))
|
|
resz = value;
|
|
else if (parameter.equalsIgnoreCase("TIME"))
|
|
time = value;
|
|
else if (parameter.equalsIgnoreCase("RESPONSE_CRS"))
|
|
responseCRS = value;
|
|
else {
|
|
if (!parameter.equalsIgnoreCase("service") && !parameter.equalsIgnoreCase("version") && !parameter.equalsIgnoreCase("request"))
|
|
parameters.put(parameter, value);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public List<Double> getFeaturesInTimeInstantAndArea(String layerURL, String layerName, int time, List<Tuple<Double>> coordinates3d, double BBxL, double BBxR, double BByL, double BByR) throws Exception {
|
|
|
|
if (time > 0)
|
|
throw new Exception("Time is currently not supported in WCS");
|
|
|
|
String uuid = null;
|
|
String ascFile = null;
|
|
try {
|
|
String resolutionx = resx;
|
|
String resolutiony = resy;
|
|
|
|
if (coordinates3d.size() > 1) {
|
|
double x1 = coordinates3d.get(0).getElements().get(0);
|
|
double x2 = coordinates3d.get(1).getElements().get(0);
|
|
resolutionx = "" + Math.abs(x2 - x1);
|
|
double y1 = coordinates3d.get(0).getElements().get(0);
|
|
double y2 = coordinates3d.get(1).getElements().get(0);
|
|
resolutiony = "" + Math.abs(y2 - y1);
|
|
}
|
|
|
|
AnalysisLogger.getLogger().debug("Resolution parameters: resx: " +resolutionx+" resy: "+resolutiony );
|
|
|
|
String url = OGCFormatter.getWcsUrl(baseURL, coverage, crs, responseCRS, "" + BBxL + "," + BByL + "," + BBxR + "," + BByR, null, null, depth, format, resolutionx, resolutiony, resz, "" + time, parameters);
|
|
AnalysisLogger.getLogger().debug("Retrieving Z parameters: " + url);
|
|
int urlCheck = HttpRequest.checkUrl(url, null, null);
|
|
AnalysisLogger.getLogger().debug("Checking url: " + urlCheck);
|
|
String randomFile = new File(persistenceDir, "geotiff" + UUID.randomUUID().toString().replace("-", "")).getAbsolutePath();
|
|
uuid = randomFile + ".tiff";
|
|
// HttpRequest.downloadFile(url, uuid);
|
|
TransferUtil downloadutil = new TransferUtil();
|
|
downloadutil.setConnectiontimeout(120000);
|
|
downloadutil.setTransferTimeout(120000);
|
|
downloadutil.performTransfer(new URI(url), uuid);
|
|
AnalysisLogger.getLogger().debug("Converting to ASCII file: " + uuid);
|
|
ascFile = GdalConverter.convertToASC(uuid,255);
|
|
AnalysisLogger.getLogger().debug("Conversion to ASCII complete: " + ascFile);
|
|
ASC asc = new ASC();
|
|
List<Double> points = asc.getFeaturesInTimeInstantAndArea(ascFile, layerName, time, coordinates3d, BBxL, BBxR, BByL, BByR);
|
|
AnalysisLogger.getLogger().debug("Retrieved: " + points.size() + " points");
|
|
return points;
|
|
} catch (Exception e) {
|
|
throw e;
|
|
} finally {
|
|
if (uuid != null){
|
|
AnalysisLogger.getLogger().debug("Deleting tiff:"+new File(uuid).delete());
|
|
AnalysisLogger.getLogger().debug("Deleting tiff aux file:"+new File(uuid.replace(".tiff", ".prj")).delete());
|
|
}
|
|
if (ascFile!= null){
|
|
AnalysisLogger.getLogger().debug("Deleting asc:"+new File(ascFile).delete());
|
|
AnalysisLogger.getLogger().debug("Deleting asc aux file:"+new File(ascFile+".aux.xml").delete());
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public double getMinZ(String layerURL, String layerName) {
|
|
// TODO: understand z management on the basis of at least one example
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public double getMaxZ(String layerURL, String layerName) {
|
|
// TODO: understand z management on the basis of at least one example
|
|
return 0;
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
String wcsUrl = "http://geoserver-dev.d4science-ii.research-infrastructures.eu/geoserver/wcs/wcs?service=wcs&version=1.0.0&request=GetCoverage&coverage=aquamaps:WorldClimBio2&CRS=EPSG:4326&bbox=-180,0,180,90&width=1&height=1&format=geotiff&RESPONSE_CRS=EPSG:4326";
|
|
|
|
AlgorithmConfiguration config = new AlgorithmConfiguration();
|
|
config.setGcubeScope("/d4science.research-infrastructures.eu/gCubeApps/BiodiversityLab");
|
|
config.setConfigPath("./cfg/");
|
|
config.setPersistencePath("./");
|
|
|
|
WCS wcs = new WCS(config, wcsUrl);
|
|
|
|
List<Tuple<Double>> triplets = VectorOperations.generateCoordinateTripletsInBoundingBox(-30d, 30d, -30d, 30d, 0, 0.5, 0.5);
|
|
|
|
List<Double> points = wcs.getFeaturesInTimeInstantAndArea(wcsUrl, "", 0, triplets, -180d, 180d, -90d, 90d);
|
|
AnalysisLogger.getLogger().debug("points:" + points);
|
|
}
|
|
|
|
}
|