From 2399aebc487804ac9252f0f1f432c8ffde9f13f5 Mon Sep 17 00:00:00 2001 From: Peter Alexander <peter@blackhillock.co.uk> Date: Wed, 5 Aug 2015 13:36:17 +0100 Subject: [PATCH] A little refactoring --- src/ac/ed/lurg/landuse/LandCoverReader.java | 100 +++--------------- .../raster/AbstractTabularRasterReader.java | 88 +++++++++++++++ 2 files changed, 103 insertions(+), 85 deletions(-) create mode 100644 src/ac/sac/raster/AbstractTabularRasterReader.java diff --git a/src/ac/ed/lurg/landuse/LandCoverReader.java b/src/ac/ed/lurg/landuse/LandCoverReader.java index 3253f6d8..dbe86eb2 100644 --- a/src/ac/ed/lurg/landuse/LandCoverReader.java +++ b/src/ac/ed/lurg/landuse/LandCoverReader.java @@ -1,28 +1,22 @@ package ac.ed.lurg.landuse; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - import ac.ed.lurg.types.LandCoverType; -import ac.ed.lurg.utils.LogWriter; +import ac.sac.raster.AbstractTabularRasterReader; import ac.sac.raster.RasterHeaderDetails; import ac.sac.raster.RasterKey; import ac.sac.raster.RasterSet; -public class LandCoverReader { - - private static int X_COL = 0; - private static int Y_COL = 1; +public class LandCoverReader extends AbstractTabularRasterReader<LandCoverItem> { - private RasterSet<LandCoverItem> dataset; - + private static final int MIN_COLS = 6; private int croplandCol = 2; private int pastureCol = 3; private int naturalCol = 4; private int barrenCol = 5; public LandCoverReader (RasterHeaderDetails rasterProj) { + super(" +", MIN_COLS); + dataset = new RasterSet<LandCoverItem> (rasterProj) { private static final long serialVersionUID = 4642550777741425501L; @Override @@ -31,85 +25,21 @@ public class LandCoverReader { } }; } - - private String[] parseLine(String line) { - return line.trim().split(" +"); - } - - private boolean handleHeader(String[] headertokens) throws IOException { - if (headertokens.length < 6) { - LogWriter.printlnError("Too few columns"); - return false; - } + + protected void handleHeader(String[] headertokens) { + handleHeader(headertokens); croplandCol = findColIndex(headertokens, "CROPLAND"); pastureCol = findColIndex(headertokens, "PASTURE"); naturalCol = findColIndex(headertokens, "NATURAL"); barrenCol = findColIndex(headertokens, "BARREN"); - - return true; } - - private int findColIndex(String[] headertokens, String colName) { - for (int i=0; i<headertokens.length; i++) { - if (headertokens[i].toUpperCase().equals(colName)) { - return i; - } - } - - throw new RuntimeException("Can't find colName " + colName); - } - - public RasterSet<LandCoverItem> getRasterDataFromFile(String filename) { - long startTime = System.currentTimeMillis(); - - BufferedReader in = null; - try { - in = new BufferedReader(new FileReader(filename)); - String line = in.readLine(); // read header - boolean headOk = handleHeader(parseLine(line)); - - if (!headOk) { - LogWriter.printlnError("Problems reading head " + filename); - throw new RuntimeException("Too few columns in " + filename); - } - - while ((line=in.readLine()) != null) { - String[] tokens = parseLine(line); - - double[] colValues = new double[tokens.length]; - for (int i=0; i<tokens.length; i++) { - double d = Double.parseDouble(tokens[i]); - colValues[i] = d; - } - - LandCoverItem lcData = dataset.getFromCoordinates(colValues[X_COL], colValues[Y_COL]); - RasterKey key = dataset.getKeyFromCoordinates(colValues[X_COL], colValues[Y_COL]); - lcData.setTotalArea(dataset.getAreaMha(key)); - - lcData.setLandCoverFract(LandCoverType.CROPLAND, colValues[croplandCol]); - lcData.setLandCoverFract(LandCoverType.PASTURE, colValues[pastureCol]); - lcData.setLandCoverFract(LandCoverType.OTHER_NATURAL, colValues[naturalCol]); - lcData.setLandCoverFract(LandCoverType.BARREN, colValues[barrenCol]); - } - - in.close(); - } - catch (Exception e) { - LogWriter.printlnError("Problem reading initial land cover data"); - e.printStackTrace(); - throw new RuntimeException(e); - } - finally { - if (in != null) - try { - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - LogWriter.println("Reading " + filename + ", took " + (System.currentTimeMillis() - startTime) + " ms"); - return dataset; + @Override + protected void setData(RasterKey key, LandCoverItem lcData, double[] colValues) { + lcData.setTotalArea(dataset.getAreaMha(key)); + lcData.setLandCoverFract(LandCoverType.CROPLAND, colValues[croplandCol]); + lcData.setLandCoverFract(LandCoverType.PASTURE, colValues[pastureCol]); + lcData.setLandCoverFract(LandCoverType.OTHER_NATURAL, colValues[naturalCol]); + lcData.setLandCoverFract(LandCoverType.BARREN, colValues[barrenCol]); } } diff --git a/src/ac/sac/raster/AbstractTabularRasterReader.java b/src/ac/sac/raster/AbstractTabularRasterReader.java new file mode 100644 index 00000000..7abbc23c --- /dev/null +++ b/src/ac/sac/raster/AbstractTabularRasterReader.java @@ -0,0 +1,88 @@ +package ac.sac.raster; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +import ac.ed.lurg.utils.LogWriter; + +public abstract class AbstractTabularRasterReader<D extends RasterItem> { + + private static int X_COL = 0; + private static int Y_COL = 1; + + protected RasterSet<D> dataset; + private String delimiterRegex; + private int minColNum; + + public AbstractTabularRasterReader (String delimiterRegex, int minColNum) { + this.delimiterRegex = delimiterRegex; + this.minColNum = minColNum; + } + + private String[] parseLine(String line) { + return line.trim().split(delimiterRegex); + } + + private void handleHeader(String[] headertokens) { + if (headertokens.length < minColNum) { + LogWriter.printlnError("Too few columns"); + } + } + + protected int findColIndex(String[] headertokens, String colName) { + for (int i=0; i<headertokens.length; i++) { + if (headertokens[i].toUpperCase().equals(colName)) { + return i; + } + } + + throw new RuntimeException("Can't find colName " + colName); + } + + public RasterSet<D> getRasterDataFromFile(String filename) { + long startTime = System.currentTimeMillis(); + + BufferedReader in = null; + try { + in = new BufferedReader(new FileReader(filename)); + String line = in.readLine(); // read header + handleHeader(parseLine(line)); + + while ((line=in.readLine()) != null) { + String[] tokens = parseLine(line); + + double[] colValues = new double[tokens.length]; + for (int i=0; i<tokens.length; i++) { + double d = Double.parseDouble(tokens[i]); + colValues[i] = d; + } + + D item = dataset.getFromCoordinates(colValues[X_COL], colValues[Y_COL]); + RasterKey key = dataset.getKeyFromCoordinates(colValues[X_COL], colValues[Y_COL]); + setData(key, item, colValues); + } + + in.close(); + } + catch (Exception e) { + LogWriter.printlnError("Problem reading initial land cover data"); + e.printStackTrace(); + throw new RuntimeException(e); + } + finally { + if (in != null) + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + LogWriter.println("Reading " + filename + ", took " + (System.currentTimeMillis() - startTime) + " ms"); + + return dataset; + } + + abstract protected void setData(RasterKey key, D item, double[] colValues); +} -- GitLab