ecological-engine-geospatia.../src/main/java/org/gcube/dataanalysis/geo/connectors/asc/AscRasterReader.java

140 lines
4.9 KiB
Java

package org.gcube.dataanalysis.geo.connectors.asc;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
import org.gcube.dataanalysis.geo.utils.transfer.TransferUtil;
/**
* A class which reads an ESRI ASCII raster file into a Raster
*/
public class AscRasterReader {
String noData = AscRaster.DEFAULT_NODATA;
Pattern header = Pattern.compile("^(\\w+)\\s+(-?\\d+(.\\d+)?)");
public static void main(String[] args) throws IOException {
AscRasterReader rt = new AscRasterReader();
rt.readRaster("data/test.asc");
}
/**
* The most useful method - reads a raster file, and returns a Raster object.
*
* Throws standard IOExceptions associated with opening and reading files, and RuntimeExceptions if there are problems with the file format
*
* @param filename
* @return the Raster object read in from the file
* @throws IOException
*/
public AscRaster readRaster(String filename) throws IOException, RuntimeException {
AscRaster raster = new AscRaster();
BufferedReader input = null;
URLConnection urlConn = null;
if (filename.startsWith("http")) {
AnalysisLogger.getLogger().debug("Getting file from http");
/*
* URL fileurl = new URL(filename); urlConn = fileurl.openConnection(); urlConn.setConnectTimeout(120000); urlConn.setReadTimeout(1200000); urlConn.setAllowUserInteraction(false); urlConn.setDoOutput(true); input = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
*/
// using Manzi's data Transfer to overcome https issues
try {
input = new BufferedReader(new InputStreamReader(TransferUtil.getInputStream(new URI(filename), 120000)));
} catch (URISyntaxException e) {
AnalysisLogger.getLogger().debug("Error: Bad URI " + filename);
}
} else {
AnalysisLogger.getLogger().debug("Getting file from local file");
input = new BufferedReader(new FileReader(filename));
}
try {
// while( input.ready() )
while (true)
{
String line = input.readLine();
if (line==null)
break;
if (line != null && line.length() > 0)
line = line.trim();
Matcher headMatch = header.matcher(line);
// Match all the heads
if (headMatch.matches()) {
String head = headMatch.group(1);
String value = headMatch.group(2);
if (head.equalsIgnoreCase("nrows"))
raster.rows = Integer.parseInt(value);
else if (head.equalsIgnoreCase("ncols"))
raster.cols = Integer.parseInt(value);
else if (head.equalsIgnoreCase("xllcorner"))
raster.xll = Double.parseDouble(value);
else if (head.equalsIgnoreCase("yllcorner"))
raster.yll = Double.parseDouble(value);
else if (head.equalsIgnoreCase("NODATA_value"))
raster.NDATA = value;
else if (head.equals("cellsize"))
raster.cellsize = Double.parseDouble(value);
else if (head.equals("dx"))
raster.dx = Double.parseDouble(value);
else if (head.equals("dy"))
raster.dy = Double.parseDouble(value);
else
System.out.println("Unknown setting: " + line);
} else if (line.matches("^-?\\d+.*")) {
// System.out.println( "Processing data section");
// Check that data is set up!
// Start processing numbers!
int row = 0;
double[][] data = new double[raster.rows][];
while (true) {
line = line.trim();
// System.out.println( "Got data row: " + line );
String[] inData = line.split("\\s+");
double[] numData = new double[raster.cols];
if (inData.length != numData.length) {
System.out.println(inData);
throw new RuntimeException("Wrong number of columns: Expected " + raster.cols + " got " + inData.length + " for line \n" + line);
}
for (int col = 0; col < raster.cols; col++) {
if (inData[col].equals(noData))
numData[col] = Double.NaN;
else
numData[col] = Double.parseDouble(inData[col]);
}
data[row] = numData;
// Ugly backward input structure...
line = input.readLine();
// if (input.ready())
if (line==null)
break;
// else
// break;
row++;
}
if (row != raster.rows - 1)
throw new RuntimeException("Wrong number of rows: expected " + raster.rows + " got " + (row + 1));
raster.data = data;
} else {
if (line.length() >= 0 && !line.matches("^\\s*$"))
AnalysisLogger.getLogger().debug("Unknown line: " + line);
}
}
} catch (Exception e) {
AnalysisLogger.getLogger().debug("ASC Reader: Finished to read the stream");
}
if (input != null) {
input.close();
if (urlConn != null && urlConn.getInputStream() != null)
urlConn.getInputStream().close();
}
return raster;
}
}