diff --git a/src/ac/ed/lurg/ModelMain.java b/src/ac/ed/lurg/ModelMain.java index efd08059cd1e485c25d9e2d3a8fd7ce828b84d66..2ce1ffb0a62bff676d34162ec3b49d97cc49dd6a 100644 --- a/src/ac/ed/lurg/ModelMain.java +++ b/src/ac/ed/lurg/ModelMain.java @@ -274,16 +274,8 @@ public class ModelMain { } private RasterSet<LandCoverItem> getInitialLandCover() { - LandCoverReader lcReader = new LandCoverReader(desiredProjection); RasterSet<LandCoverItem> initLC = lcReader.getRasterDataFromFile(ModelConfig.INITAL_LAND_COVER_FILE); - - // scale all fractional areas read in by the actual area - for (Entry<RasterKey, LandCoverItem> entry : initLC.entrySet()) { - double cellArea = initLC.getAreaMha(entry.getKey()); - entry.getValue().scaleAll(cellArea); - } - return initLC; } diff --git a/src/ac/ed/lurg/landuse/AreasItem.java b/src/ac/ed/lurg/landuse/AreasItem.java index 6a24ed18a351b057cc5c74c55b524779a17e90b6..a59a49d866377081354ba1b3ce0cc56435c567f7 100644 --- a/src/ac/ed/lurg/landuse/AreasItem.java +++ b/src/ac/ed/lurg/landuse/AreasItem.java @@ -20,7 +20,7 @@ public class AreasItem implements RasterItem { public void setLandCoverAreas(LandCoverItem landCover) { if (landCover != null) { for (LandCoverType lcType : LandCoverType.values()) - landCoverAreas.put(lcType, landCover.getLandCover(lcType)); + landCoverAreas.put(lcType, landCover.getLandCoverArea(lcType)); } } diff --git a/src/ac/ed/lurg/landuse/LandCoverItem.java b/src/ac/ed/lurg/landuse/LandCoverItem.java index 0ff7f0c40cdb7692c9a37b6036f084121c66a901..828984e7c5fbd5c9f129628281f32ef725d0dfcf 100644 --- a/src/ac/ed/lurg/landuse/LandCoverItem.java +++ b/src/ac/ed/lurg/landuse/LandCoverItem.java @@ -2,7 +2,6 @@ package ac.ed.lurg.landuse; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; import ac.ed.lurg.types.LandCoverType; import ac.sac.raster.RasterItem; @@ -11,24 +10,33 @@ import ac.sac.raster.RasterItem; * This is used in the initalisation phase, after that land-use is used */ public class LandCoverItem implements RasterItem { - Map<LandCoverType, Double> landcover = new HashMap<LandCoverType, Double>(); - + private Map<LandCoverType, Double> landcover = new HashMap<LandCoverType, Double>(); + private double totalArea; + /** Area in Mha */ - public Double getLandCover(LandCoverType landType) { - return landcover.get(landType); + public Double getLandCoverArea(LandCoverType landType) { + return getLandCoverFract(landType) * totalArea; } - - public void setLandCover(LandCoverType landType, double d) { - landcover.put(landType, d); + + public Double getLandCoverFract(LandCoverType landType) { + Double d = landcover.get(landType); + return d==null ? 0 : d.doubleValue(); } - public void scaleAll(double factor) { - for (Entry<LandCoverType, Double> entry : landcover.entrySet()) { - landcover.put(entry.getKey(), entry.getValue() * factor); - } + /** Area in Mha */ + public double getTotalArea() { + return totalArea; + } + /** Area in Mha */ + public void setTotalArea(double totalArea) { + this.totalArea = totalArea; + } + + public void setLandCoverFract(LandCoverType landType, double d) { + landcover.put(landType, d); } - + /*public double getTotal() { double total = 0; for (double d : landcover.values()) { @@ -36,4 +44,4 @@ public class LandCoverItem implements RasterItem { } return total; }*/ -} +} \ No newline at end of file diff --git a/src/ac/ed/lurg/landuse/LandCoverReader.java b/src/ac/ed/lurg/landuse/LandCoverReader.java index 4eb7022c6f776654a8af76e5abf4ef854f7480d8..3253f6d829ef1c52647dab1b819106f7ffb94efd 100644 --- a/src/ac/ed/lurg/landuse/LandCoverReader.java +++ b/src/ac/ed/lurg/landuse/LandCoverReader.java @@ -7,18 +7,20 @@ import java.io.IOException; import ac.ed.lurg.types.LandCoverType; import ac.ed.lurg.utils.LogWriter; 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; - private static int CROPLAND_COL = 2; - private static int PASTURE_COL = 3; - private static int NATURAL_COL = 4; - private static int BARREN_COL = 5; private RasterSet<LandCoverItem> dataset; + + private int croplandCol = 2; + private int pastureCol = 3; + private int naturalCol = 4; + private int barrenCol = 5; public LandCoverReader (RasterHeaderDetails rasterProj) { dataset = new RasterSet<LandCoverItem> (rasterProj) { @@ -31,31 +33,49 @@ public class LandCoverReader { } private String[] parseLine(String line) { - return line.split(" +"); + return line.trim().split(" +"); } - + + private boolean handleHeader(String[] headertokens) throws IOException { + if (headertokens.length < 6) { + LogWriter.printlnError("Too few columns"); + return false; + } + 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; - int row = 0; + String line = in.readLine(); // read header + boolean headOk = handleHeader(parseLine(line)); - while ((line=in.readLine()) != null) { - String[] tokens = parseLine(line.trim()); + if (!headOk) { + LogWriter.printlnError("Problems reading head " + filename); + throw new RuntimeException("Too few columns in " + filename); + } - if (tokens.length < 6) { - LogWriter.printlnError("Too few columns in " + filename); - throw new RuntimeException("Too few columns in " + filename + "(row " + row + ")"); - } - - if (row == 0) { - row++; - continue; - } - + 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]); @@ -63,13 +83,13 @@ public class LandCoverReader { } LandCoverItem lcData = dataset.getFromCoordinates(colValues[X_COL], colValues[Y_COL]); - // lcData.setArea(dataset.getAreaMha(entry.getKey())); + RasterKey key = dataset.getKeyFromCoordinates(colValues[X_COL], colValues[Y_COL]); + lcData.setTotalArea(dataset.getAreaMha(key)); - lcData.setLandCover(LandCoverType.CROPLAND, colValues[CROPLAND_COL]); - lcData.setLandCover(LandCoverType.PASTURE, colValues[PASTURE_COL]); - lcData.setLandCover(LandCoverType.OTHER_NATURAL, colValues[NATURAL_COL]); - lcData.setLandCover(LandCoverType.BARREN, colValues[BARREN_COL]); - row++; + 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(); diff --git a/src/ac/sac/raster/RasterSet.java b/src/ac/sac/raster/RasterSet.java index c67d7ebb9f9b04e1227253f22a4ae52ac7e5c4a6..5eb3820dfce3963cc30f567e76f36842986cf2da 100755 --- a/src/ac/sac/raster/RasterSet.java +++ b/src/ac/sac/raster/RasterSet.java @@ -56,6 +56,11 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> { /** Method to get raster item for coordinates */ public D getFromCoordinates(double source_x, double source_y) { + RasterKey key = getKeyFromCoordinates(source_x, source_y); + return get(key.getCol(), key.getRow()); // can't just call get(key) as may need to create the RasterItem + } + + public RasterKey getKeyFromCoordinates(double source_x, double source_y) { int col = (int) Math.round((source_x - header.getXllCorner())/header.getXCellSize()); // header.getNrows() - 1, lower left basis. Minus 1 as nrows is number, but indexed from zero @@ -64,8 +69,9 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> { if (row < 0 || col < 0) { LogWriter.println("Got negative values"); } - return get(col, row); + return new RasterKey(col, row); } + public double getXCoordin(RasterKey key) { double x = header.getXCellSize() * key.getCol() + header.getXllCorner(); @@ -82,6 +88,11 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> { return y; } +// get the RasterItem if it already exists +// public D get(RasterKey key) { +// return get(key); +// } + /** Method to really get the data, or create it. Assumes the col and row are in the internal header format */ public D get(int col, int row) { if (header.getNcolumns() < col+1)