From 9f26aa3df87e8ad124abfa3fe7de2f479452bc08 Mon Sep 17 00:00:00 2001
From: Peter Alexander <peter@blackhillock.co.uk>
Date: Thu, 13 Apr 2017 20:09:54 +0100
Subject: [PATCH] Allow column order of hurtt file to vary

---
 src/ac/ed/lurg/landuse/LandCoverReader.java   | 13 ++++++++--
 .../raster/AbstractTabularRasterReader.java   | 25 ++++++++++++++++---
 src/ac/sac/raster/RasterSet.java              |  2 +-
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/ac/ed/lurg/landuse/LandCoverReader.java b/src/ac/ed/lurg/landuse/LandCoverReader.java
index d7113cde..520dff75 100644
--- a/src/ac/ed/lurg/landuse/LandCoverReader.java
+++ b/src/ac/ed/lurg/landuse/LandCoverReader.java
@@ -26,7 +26,16 @@ public class LandCoverReader extends AbstractTabularRasterReader<LandCoverItem>
 		lcData.setLandCoverFract(LandCoverType.MANAGED_FOREST, getValueForCol(rowValues, "managed_forest"));
 		lcData.setLandCoverFract(LandCoverType.UNMANAGED_FOREST, getValueForCol(rowValues, "unmanaged_forest"));
 		lcData.setLandCoverFract(LandCoverType.BARREN, getValueForCol(rowValues, "barren"));
-		lcData.setLandCoverFract(LandCoverType.URBAN, getValueForCol(rowValues, "urban"));
-		
+		lcData.setLandCoverFract(LandCoverType.URBAN, getValueForCol(rowValues, "urban"));	
+	}
+	
+	@Override
+	protected int getXCol() {
+		return getColForName("lon");
+	}
+	
+	@Override
+	protected int getYCol() {
+		return getColForName("lat");
 	}
 }
diff --git a/src/ac/sac/raster/AbstractTabularRasterReader.java b/src/ac/sac/raster/AbstractTabularRasterReader.java
index 14b6cdf8..83847b88 100644
--- a/src/ac/sac/raster/AbstractTabularRasterReader.java
+++ b/src/ac/sac/raster/AbstractTabularRasterReader.java
@@ -17,6 +17,7 @@ public abstract class AbstractTabularRasterReader<D extends RasterItem> {
 	protected RasterSet<D> dataset;
 	private String delimiterRegex;
 	private int minColNum;
+	protected String[] dataColNames;
 
 	public AbstractTabularRasterReader (String delimiterRegex, int minColNum) {
 		this.delimiterRegex = delimiterRegex;
@@ -32,6 +33,14 @@ public abstract class AbstractTabularRasterReader<D extends RasterItem> {
 		return line.trim().split(delimiterRegex);
 	}
 	
+	protected int getXCol() {
+		return X_COL;
+	}
+	
+	protected int getYCol() {
+		return Y_COL;
+	}
+	
 	private String[] handleHeader(String[] headertokens) {
 		if (headertokens.length < minColNum) {
 			LogWriter.printlnError("Too few columns");
@@ -53,7 +62,7 @@ public abstract class AbstractTabularRasterReader<D extends RasterItem> {
 		try {
 			in = new BufferedReader(new FileReader(filename));
 			String line = in.readLine(); // read header
-			String[] dataColNames = handleHeader(parseLine(line));
+			dataColNames = handleHeader(parseLine(line));
 
 			while ((line=in.readLine()) != null) {
 				if (line.isEmpty()) // skip empty lines
@@ -62,8 +71,8 @@ public abstract class AbstractTabularRasterReader<D extends RasterItem> {
 				String[] tokens = parseLine(line);
 				
 				try {
-					double x = Double.parseDouble(tokens[X_COL]);
-					double y = Double.parseDouble(tokens[Y_COL]);
+					double x = Double.parseDouble(tokens[getXCol()]);
+					double y = Double.parseDouble(tokens[getYCol()]);
 				
 					Map<String, Double> rowValues = new HashMap<String, Double>(dataColNames.length);
 					for (int i=2; i<tokens.length; i++) {
@@ -103,6 +112,16 @@ public abstract class AbstractTabularRasterReader<D extends RasterItem> {
 		return dataset;
 	}
 	
+	protected int getColForName(String colName) {
+		String lowerColName = colName.toLowerCase();
+		int i=0;
+		for (; i<colName.length(); i++)
+			if (dataColNames[i].toLowerCase().equals(lowerColName))
+				return i;
+			
+		return Integer.MIN_VALUE;
+	}
+	
 	protected double getValueForCol(Map<String, Double> rowValues, String colName) {
 		Double d = rowValues.get(colName.toLowerCase());
 		if (d == null) {
diff --git a/src/ac/sac/raster/RasterSet.java b/src/ac/sac/raster/RasterSet.java
index 7bc26df3..f207da45 100755
--- a/src/ac/sac/raster/RasterSet.java
+++ b/src/ac/sac/raster/RasterSet.java
@@ -67,7 +67,7 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> {
 		int row = header.getNrows() - 1 - (int) Math.round((source_y - header.getYllCorner())/header.getYCellSize());
 	
 		if (row < 0 || col < 0) {
-			LogWriter.println("Got negative values");
+			LogWriter.println("Got negative row or col values: " + row + ", "+  col);
 		}
 		return new RasterKey(col, row);
 	}
-- 
GitLab