Skip to content
Snippets Groups Projects
Commit dd1a2063 authored by Peter Alexander's avatar Peter Alexander
Browse files

Changes to fix reading of LPJG file

parent 424f4635
No related branches found
No related tags found
No related merge requests found
...@@ -67,6 +67,10 @@ public class ModelMain { ...@@ -67,6 +67,10 @@ public class ModelMain {
private void doTimestep(int timestep) { private void doTimestep(int timestep) {
YieldRaster yieldSurfaces = getYieldSurfaces(timestep); YieldRaster yieldSurfaces = getYieldSurfaces(timestep);
// YieldResponsesItem yresp = yieldSurfaces.getFromCoordinates(-50.0, -4.0);
// LogWriter.printlnError("Test key: " + yresp.getYieldMax(CropType.CEREALS) + ", " + yresp.getYieldFertOnly(CropType.CEREALS) + ", " + yresp.getYieldIrrigOnly(CropType.CEREALS));
LogWriter.println("Timestep " + timestep); LogWriter.println("Timestep " + timestep);
CropToDoubleMap totalArea = new CropToDoubleMap(); CropToDoubleMap totalArea = new CropToDoubleMap();
......
...@@ -25,7 +25,7 @@ import ac.sac.raster.RasterKey; ...@@ -25,7 +25,7 @@ import ac.sac.raster.RasterKey;
import ac.sac.raster.RasterSet; import ac.sac.raster.RasterSet;
public class GamsRasterOptimiser { public class GamsRasterOptimiser {
public static final boolean DEBUG = false; public static final boolean DEBUG = true;
private GamsRasterInput rasterInputData; private GamsRasterInput rasterInputData;
private LazyHashMap<Integer, Set<RasterKey>> mapping; private LazyHashMap<Integer, Set<RasterKey>> mapping;
...@@ -49,28 +49,28 @@ public class GamsRasterOptimiser { ...@@ -49,28 +49,28 @@ public class GamsRasterOptimiser {
private GamsRasterOutput convertToRaster(GamsLocationInput gamsInput, GamsLocationOutput gamsOutput) { private GamsRasterOutput convertToRaster(GamsLocationInput gamsInput, GamsLocationOutput gamsOutput) {
RasterSet<AreasItem> newAreaRaster = allocAreas(gamsInput.getPreviousAreas(), gamsOutput); RasterSet<AreasItem> newAreaRaster = allocAreas(gamsInput.getPreviousAreas(), gamsOutput);
RasterSet<IntensitiesItem> newIntensityRaster = allocIntensities(gamsOutput); RasterSet<IntensitiesItem> newIntensityRaster = allocIntensities(gamsOutput);
return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, newAreaRaster, gamsOutput.getCommoditiesData()); return new GamsRasterOutput(gamsOutput.getStatus(), newIntensityRaster, newAreaRaster, gamsOutput.getCommoditiesData());
} }
private RasterSet<AreasItem> allocAreas(Map<Integer, ? extends AreasItem> prevAreasAgg, GamsLocationOutput gamsOutput) { private RasterSet<AreasItem> allocAreas(Map<Integer, ? extends AreasItem> prevAreasAgg, GamsLocationOutput gamsOutput) {
RasterSet<AreasItem> newAreaRaster = new RasterSet<AreasItem>(); RasterSet<AreasItem> newAreaRaster = new RasterSet<AreasItem>();
RasterSet<AreasItem> prevAreaRaster = rasterInputData.getPreviousAreas(); RasterSet<AreasItem> prevAreaRaster = rasterInputData.getPreviousAreas();
for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) { for (Map.Entry<Integer, AreasItem> entry : gamsOutput.getCropAreas().entrySet()) {
Integer locId = entry.getKey(); Integer locId = entry.getKey();
AreasItem newAreaAggItem = entry.getValue(); AreasItem newAreaAggItem = entry.getValue();
AreasItem prevAreaAggItem = prevAreasAgg.get(locId); AreasItem prevAreaAggItem = prevAreasAgg.get(locId);
Set<RasterKey> keys = mapping.get(locId); Set<RasterKey> keys = mapping.get(locId);
CropToDouble cropChangeTotals = newAreaAggItem.getCropChanges(prevAreaAggItem); CropToDouble cropChangeTotals = newAreaAggItem.getCropChanges(prevAreaAggItem);
if (DEBUG) LogWriter.println("Processing location id " + locId); // if (DEBUG) LogWriter.println("Processing location id " + locId);
double shortfall = allocAllAreasForAgg(newAreaRaster, prevAreaRaster, keys, cropChangeTotals); double shortfall = allocAllAreasForAgg(newAreaRaster, prevAreaRaster, keys, cropChangeTotals);
if (shortfall > 0) if (shortfall > 0)
LogWriter.printlnError("This should never happen, due to GAMS constraint. Not able to incorporate all changes, as not enough forest or natural areas left: " + shortfall); LogWriter.printlnError("This should never happen, due to GAMS constraint. Not able to incorporate all changes, as not enough forest or natural areas left: " + shortfall);
} }
return newAreaRaster; return newAreaRaster;
} }
...@@ -79,9 +79,9 @@ public class GamsRasterOptimiser { ...@@ -79,9 +79,9 @@ public class GamsRasterOptimiser {
double totalShortfall = 0; double totalShortfall = 0;
Set<RasterKey> keysWithSpace = new HashSet<RasterKey>(); Set<RasterKey> keysWithSpace = new HashSet<RasterKey>();
CropToDouble avgCropChange = cropChange.scale(1.0/keys.size()); CropToDouble avgCropChange = cropChange.scale(1.0/keys.size());
for (RasterKey key : keys) { for (RasterKey key : keys) {
if (DEBUG) LogWriter.println(" Processing raster key " + key); //if (DEBUG) LogWriter.println(" Processing raster key " + key);
AreasItem prevAreasRasterItem = prevAreaRaster.get(key); AreasItem prevAreasRasterItem = prevAreaRaster.get(key);
AreasItem newAreasRasterItem = new AreasItem(); AreasItem newAreasRasterItem = new AreasItem();
...@@ -97,13 +97,13 @@ public class GamsRasterOptimiser { ...@@ -97,13 +97,13 @@ public class GamsRasterOptimiser {
if (totalShortfall > 0 & keysWithSpace.size() > 0) { // more to allocate and some free areas to allocate into if (totalShortfall > 0 & keysWithSpace.size() > 0) { // more to allocate and some free areas to allocate into
if (DEBUG) LogWriter.println("A total area of " + totalShortfall + " is unallocated, so trying again with areas with space"); if (DEBUG) LogWriter.println("A total area of " + totalShortfall + " is unallocated, so trying again with areas with space");
double factor = totalShortfall / cropChange.getTotal(); double factor = totalShortfall / cropChange.getTotal();
allocAllAreasForAgg(newAreaRaster, newAreaRaster, keysWithSpace, cropChange.scale(factor)); allocAllAreasForAgg(newAreaRaster, newAreaRaster, keysWithSpace, cropChange.scale(factor));
} }
return totalShortfall; return totalShortfall;
} }
/** returns the net area of crop change that not been able to be allocated */ /** returns the net area of crop change that not been able to be allocated */
private double allocRasterArea(AreasItem newAreasRasterItem, AreasItem prevAreasRasterItem, CropToDouble cropChange) { private double allocRasterArea(AreasItem newAreasRasterItem, AreasItem prevAreasRasterItem, CropToDouble cropChange) {
...@@ -114,7 +114,7 @@ public class GamsRasterOptimiser { ...@@ -114,7 +114,7 @@ public class GamsRasterOptimiser {
double prevNatural = prevAreasRasterItem.getLandCoverArea(LandDataType.OTHER_NATURAL); double prevNatural = prevAreasRasterItem.getLandCoverArea(LandDataType.OTHER_NATURAL);
double ratioOfChanges = 1; double ratioOfChanges = 1;
if (netAddedCrop > prevForest + prevNatural) { if (netAddedCrop > prevForest + prevNatural) {
ratioOfChanges = (prevForest + prevNatural) / netAddedCrop; ratioOfChanges = (prevForest + prevNatural) / netAddedCrop;
forestRemoved = prevForest; forestRemoved = prevForest;
...@@ -139,9 +139,9 @@ public class GamsRasterOptimiser { ...@@ -139,9 +139,9 @@ public class GamsRasterOptimiser {
for (CropType crop : CropType.values()) { for (CropType crop : CropType.values()) {
double prevCropArea = prevAreasRasterItem.getCropArea(crop); double prevCropArea = prevAreasRasterItem.getCropArea(crop);
Double d = cropChange.get(crop); Double d = cropChange.get(crop);
double additionalArea = (d == null) ? 0 : d * ratioOfChanges; double additionalArea = (d == null) ? 0 : d * ratioOfChanges;
// LogWriter.println(String.format("%s, %.1f", crop, additionalArea)); // LogWriter.println(String.format("%s, %.1f", crop, additionalArea));
newAreasRasterItem.setCropArea(crop, prevCropArea + additionalArea); newAreasRasterItem.setCropArea(crop, prevCropArea + additionalArea);
} }
...@@ -171,11 +171,32 @@ public class GamsRasterOptimiser { ...@@ -171,11 +171,32 @@ public class GamsRasterOptimiser {
RasterSet<AreasItem> cropAreaRaster = rasterInputData.getPreviousAreas(); RasterSet<AreasItem> cropAreaRaster = rasterInputData.getPreviousAreas();
RasterSet<IrrigationCostItem> irrigCostRaster = rasterInputData.getIrrigationCost(); RasterSet<IrrigationCostItem> irrigCostRaster = rasterInputData.getIrrigationCost();
List<Double> cerealDivisions = getDivisions(yieldRaster, CropType.CEREALS, 2); {
List<Double> pastureDivisions = getDivisions(yieldRaster, CropType.MEAT_OR_PASTURE, 2); // YieldResponsesItem yresp = yieldRaster.getFromCoordinates(-118.0, -33.0);
// LogWriter.printlnError("Test key2: " + yresp.getYieldMax(CropType.CEREALS) + ", " + yresp.getYieldFertOnly(CropType.CEREALS) + ", " + yresp.getYieldIrrigOnly(CropType.CEREALS));
}
// look for inconsistencies
for (Entry<RasterKey, YieldResponsesItem> entry : yieldRaster.entrySet()) {
YieldResponsesItem yresp = entry.getValue();
RasterKey key = entry.getKey();
if (yresp != null && (yresp.getYieldMax(CropType.CEREALS) < yresp.getYieldFertOnly(CropType.CEREALS) || yresp.getYieldMax(CropType.CEREALS) < yresp.getYieldIrrigOnly(CropType.CEREALS))) {
LogWriter.printlnError(key.getCol() + ", " + key.getRow() + ": " + yieldRaster.getXCoordin(key) + ", " + yieldRaster.getYCoordin(key) + ": " + yresp.getYieldMax(CropType.CEREALS) + ", " + yresp.getYieldFertOnly(CropType.CEREALS) + ", " + yresp.getYieldIrrigOnly(CropType.CEREALS));
}
// else if (yresp != null)
// LogWriter.println(key.getCol() + ", " + key.getRow() + ": " + yieldRaster.getXCoordin(key) + ", " + yieldRaster.getYCoordin(key) + ": " + yresp.getYieldMax(CropType.CEREALS) + ", " + yresp.getYieldFertOnly(CropType.CEREALS) + ", " + yresp.getYieldIrrigOnly(CropType.CEREALS));
}
int numCerealCats = (1+cerealDivisions.size()); int numCerealCats = 4;
if (DEBUG) LogWriter.println("Making " + numCerealCats * (1+pastureDivisions.size()) + " categories"); int numPastureCats = 4;
List<Double> cerealDivisions = getDivisions(yieldRaster, CropType.CEREALS, numCerealCats);
List<Double> pastureDivisions = getDivisions(yieldRaster, CropType.MEAT_OR_PASTURE, numPastureCats);
if (DEBUG) LogWriter.println("Making " + numCerealCats * numPastureCats + " categories");
LazyHashMap<Integer, AveragingYieldResponsesItem> aggregatedYields = new LazyHashMap<Integer, AveragingYieldResponsesItem>() { LazyHashMap<Integer, AveragingYieldResponsesItem> aggregatedYields = new LazyHashMap<Integer, AveragingYieldResponsesItem>() {
protected AveragingYieldResponsesItem createValue() { return new AveragingYieldResponsesItem(); } protected AveragingYieldResponsesItem createValue() { return new AveragingYieldResponsesItem(); }
...@@ -190,14 +211,18 @@ public class GamsRasterOptimiser { ...@@ -190,14 +211,18 @@ public class GamsRasterOptimiser {
protected Set<RasterKey> createValue() { return new HashSet<RasterKey>(); } protected Set<RasterKey> createValue() { return new HashSet<RasterKey>(); }
}; };
int countFound = 0, countMissing = 0;
for (Entry<RasterKey, YieldResponsesItem> entry : yieldRaster.entrySet()) { for (Entry<RasterKey, YieldResponsesItem> entry : yieldRaster.entrySet()) {
YieldResponsesItem yresp = entry.getValue(); YieldResponsesItem yresp = entry.getValue();
RasterKey key = entry.getKey(); RasterKey key = entry.getKey();
if (yresp == null) { if (yresp == null) {
countMissing++;
LogWriter.printlnError("No YieldResponsesItem for " + key + ", x=" + yieldRaster.getXCoordin(key) + ", y=" + yieldRaster.getYCoordin(key)); LogWriter.printlnError("No YieldResponsesItem for " + key + ", x=" + yieldRaster.getXCoordin(key) + ", y=" + yieldRaster.getYCoordin(key));
} }
else { else {
countFound++;
//LogWriter.println("YieldResponsesItem found for " + key + ", x=" + yieldRaster.getXCoordin(key) + ", y=" + yieldRaster.getYCoordin(key)); //LogWriter.println("YieldResponsesItem found for " + key + ", x=" + yieldRaster.getXCoordin(key) + ", y=" + yieldRaster.getYCoordin(key));
AreasItem cropAreas = cropAreaRaster.get(key); AreasItem cropAreas = cropAreaRaster.get(key);
...@@ -205,18 +230,18 @@ public class GamsRasterOptimiser { ...@@ -205,18 +230,18 @@ public class GamsRasterOptimiser {
LogWriter.printlnError("GamsRasterOptimiser: Can't find cropAreas for " + key); LogWriter.printlnError("GamsRasterOptimiser: Can't find cropAreas for " + key);
continue; continue;
} }
IrrigationCostItem irrigCost = irrigCostRaster.get(key); IrrigationCostItem irrigCost = irrigCostRaster.get(key);
int cerealCat = findCategory(cerealDivisions, yresp.getYieldMax(CropType.CEREALS)); int cerealCat = findCategory(cerealDivisions, yresp.getYieldMax(CropType.CEREALS));
int pastureCat = findCategory(pastureDivisions, yresp.getYieldMax(CropType.MEAT_OR_PASTURE)); int pastureCat = findCategory(pastureDivisions, yresp.getYieldMax(CropType.MEAT_OR_PASTURE));
Integer id = cerealCat + pastureCat * numCerealCats; Integer id = cerealCat + pastureCat * numCerealCats;
AveragingYieldResponsesItem avgYResp = aggregatedYields.lazyGet(id); AveragingYieldResponsesItem avgYResp = aggregatedYields.lazyGet(id);
AreasItem aggAreas = aggregatedAreas.lazyGet(id); AreasItem aggAreas = aggregatedAreas.lazyGet(id);
IrrigationCostItem avgIrigCost = aggregatedIrrigCosts.lazyGet(id); IrrigationCostItem avgIrigCost = aggregatedIrrigCosts.lazyGet(id);
mapping.lazyGet(id).add(entry.getKey()); mapping.lazyGet(id).add(entry.getKey());
// Irrigation cost // Irrigation cost
double suitableAreaThisTime = cropAreas.getSuitableLand(); double suitableAreaThisTime = cropAreas.getSuitableLand();
if (irrigCost!= null && suitableAreaThisTime > 0) { if (irrigCost!= null && suitableAreaThisTime > 0) {
...@@ -230,12 +255,12 @@ public class GamsRasterOptimiser { ...@@ -230,12 +255,12 @@ public class GamsRasterOptimiser {
for (YieldType yieldType : YieldType.values()) { for (YieldType yieldType : YieldType.values()) {
avgYResp.setYield(yieldType, crop, yresp.getYield(yieldType, crop)); avgYResp.setYield(yieldType, crop, yresp.getYield(yieldType, crop));
} }
double areaSoFar = aggAreas.getCropArea(crop); double areaSoFar = aggAreas.getCropArea(crop);
double areaThisTime = cropAreas.getCropArea(crop); double areaThisTime = cropAreas.getCropArea(crop);
aggAreas.setCropArea(crop, areaSoFar + areaThisTime); aggAreas.setCropArea(crop, areaSoFar + areaThisTime);
} }
// Land cover, we only need forest and other natural // Land cover, we only need forest and other natural
for (LandDataType landType : Arrays.asList(LandDataType.FOREST, LandDataType.OTHER_NATURAL)) { for (LandDataType landType : Arrays.asList(LandDataType.FOREST, LandDataType.OTHER_NATURAL)) {
double areaThisTime = cropAreas.getLandCoverArea(landType); double areaThisTime = cropAreas.getLandCoverArea(landType);
...@@ -244,13 +269,14 @@ public class GamsRasterOptimiser { ...@@ -244,13 +269,14 @@ public class GamsRasterOptimiser {
} }
} }
} }
if (DEBUG) { LogWriter.println("YieldResponsesItem: " + rasterInputData.getCountryInput().getCountry() + ", countFound=" + countFound + ", countMissing=" + countMissing);
for (Map.Entry<Integer, Set<RasterKey>> e : mapping.entrySet()) {
LogWriter.println(e.getKey() + " category has " + e.getValue().size() + " raster areas");
for (RasterKey key : e.getValue()) { for (Map.Entry<Integer, Set<RasterKey>> e : mapping.entrySet()) {
LogWriter.println(String.format("\t%s: yields pasture=%.1f, cereal=%.1f", key, yieldRaster.get(key).getYieldMax(CropType.MEAT_OR_PASTURE), yieldRaster.get(key).getYieldMax(CropType.CEREALS))); LogWriter.println(e.getKey() + " category has " + e.getValue().size() + " raster areas");
} if (DEBUG) for (RasterKey key : e.getValue()) {
LogWriter.println(String.format("\t%s: yields pasture=%.1f, cereal=%.1f", key, yieldRaster.get(key).getYieldMax(CropType.MEAT_OR_PASTURE), yieldRaster.get(key).getYieldMax(CropType.CEREALS)));
} }
} }
...@@ -262,7 +288,7 @@ public class GamsRasterOptimiser { ...@@ -262,7 +288,7 @@ public class GamsRasterOptimiser {
int numDivisions = divisions.size(); int numDivisions = divisions.size();
for (category = 0; category<numDivisions; category++) { for (category = 0; category<numDivisions; category++) {
if (yield > divisions.get(category)) { if (yield < divisions.get(category)) {
break; break;
} }
} }
...@@ -274,28 +300,31 @@ public class GamsRasterOptimiser { ...@@ -274,28 +300,31 @@ public class GamsRasterOptimiser {
for (YieldResponsesItem yresp : yieldRaster.values()) { for (YieldResponsesItem yresp : yieldRaster.values()) {
if (yresp == null) { if (yresp == null) {
//LogWriter.println("GamsRasterOptimiser: Can't get value for crop " + crop); if (DEBUG) LogWriter.println("GamsRasterOptimiser: Can't get value for crop " + crop);
} }
else { else {
double d = yresp.getYieldMax(crop); double d = yresp.getYieldMax(crop);
//LogWriter.println("GamsRasterOptimiser: Got value for crop " + crop + " of " + d);
if (Double.isNaN(d))
LogWriter.println("GamsRasterOptimiser: Got NaN value for crop " + crop); if (Double.isNaN(d) || d == 0.0) {
else if (DEBUG) LogWriter.println("GamsRasterOptimiser: Got NaN or zero value for crop " + crop);
}
else {
yieldValues.add(d); yieldValues.add(d);
}
} }
} }
if (yieldValues.size() == 0) { if (yieldValues.size() == 0) {
throw new RuntimeException("No yield values for country, crop = " + crop); throw new RuntimeException("No yield values for country, crop = " + crop);
} }
Collections.sort(yieldValues); Collections.sort(yieldValues);
List<Double> divisions = new ArrayList<Double>(); List<Double> divisions = new ArrayList<Double>();
for (int i=1; i < numCategories; i++) { for (int i=1; i < numCategories; i++) {
double d = yieldValues.get(yieldValues.size()/numCategories); double d = yieldValues.get(yieldValues.size()/numCategories*i);
divisions.add(d); divisions.add(d);
} }
......
...@@ -55,21 +55,29 @@ public class LPJYieldResponseMapReader { ...@@ -55,21 +55,29 @@ public class LPJYieldResponseMapReader {
record.y = d; record.y = d;
break; break;
case 2: case 2:
record.teWW = d; record.teSW = d;
break; break;
case 3: case 3:
record.trRi = d; record.teSWirr = d;
break; break;
case 4: case 4:
record.teCo = d; record.teWW = d;
break; break;
case 5: case 5:
record.teSo = d; record.teWWirr = d;
break; break;
case 6: case 6:
record.teWWirr = d; record.teCo = d;
break;
case 7:
record.teCoirr = d;
break;
case 8:
record.trRi = d;
break;
case 9:
record.trRiirr = d;
break; break;
} }
col++; col++;
...@@ -99,18 +107,21 @@ public class LPJYieldResponseMapReader { ...@@ -99,18 +107,21 @@ public class LPJYieldResponseMapReader {
//YieldRecord values in kg DM / m2, we want t/ha, so 10 times larger //YieldRecord values in kg DM / m2, we want t/ha, so 10 times larger
for (CropType crop : CropType.getAllItems()) { for (CropType crop : CropType.getAllItems()) {
item.setYield(noIrrigYieldType, crop, record.teWW * 10); item.setYield(noIrrigYieldType, crop, record.teSW * 10);
item.setYield(maxIrrigYieldType, crop, record.teWWirr * 10); item.setYield(maxIrrigYieldType, crop, record.teSWirr * 10);
} }
} }
class YieldRecord { class YieldRecord {
double x; double x;
double y; double y;
double teSW;
double teSWirr;
double teWW; double teWW;
double teWWirr; double teWWirr;
double trRi;
double teCo; double teCo;
double teSo; double teCoirr;
double trRi;
double trRiirr;
} }
} }
\ No newline at end of file
...@@ -7,7 +7,7 @@ import ac.ed.lurg.types.YieldType; ...@@ -7,7 +7,7 @@ import ac.ed.lurg.types.YieldType;
import ac.ed.lurg.utils.LogWriter; import ac.ed.lurg.utils.LogWriter;
public class YieldResponse { public class YieldResponse {
private Map<YieldType, Double> yields = new HashMap<YieldType, Double>(); Map<YieldType, Double> yields = new HashMap<YieldType, Double>();
private double fertParm; private double fertParm;
private double irrigParm; private double irrigParm;
...@@ -37,7 +37,7 @@ public class YieldResponse { ...@@ -37,7 +37,7 @@ public class YieldResponse {
public double getIrrigParam() { public double getIrrigParam() {
if (irrigParm == 0) if (irrigParm == 0)
irrigParm = calcParam (0, 0.6, 1); // we don't have a mide irrigation figure, so lets assume 60% at mid point irrigParm = calcParam (0, 0.6, 1); // we don't have a mid irrigation figure, so lets assume 60% at mid point
return irrigParm; return irrigParm;
} }
......
...@@ -77,6 +77,6 @@ public class RasterKey implements Serializable { ...@@ -77,6 +77,6 @@ public class RasterKey implements Serializable {
} }
public String toString() { public String toString() {
return "row:" + row + ", col:" + col; return "col:" + col + ", row:" + row;
} }
} }
...@@ -75,8 +75,8 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> { ...@@ -75,8 +75,8 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> {
} }
public double getYCoordin(RasterKey key) { public double getYCoordin(RasterKey key) {
double x = header.getCellSize() * (key.getRow() + 1) + header.getYllCorner(); double y = header.getCellSize() * (header.getNrows() - 1 - key.getRow()) + header.getYllCorner();
return x; return y;
} }
/** Method to really get the data, or create it. Assumes the col and row are in the internal header format */ /** Method to really get the data, or create it. Assumes the col and row are in the internal header format */
...@@ -123,6 +123,7 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> { ...@@ -123,6 +123,7 @@ public class RasterSet<D extends RasterItem> extends HashMap<RasterKey, D> {
public RasterSet<D> popSubsetForKeys(RasterSet<D> subset, Collection<RasterKey> keys) { public RasterSet<D> popSubsetForKeys(RasterSet<D> subset, Collection<RasterKey> keys) {
for (RasterKey key : keys) { for (RasterKey key : keys) {
//LogWriter.println("popSubsetForKeys: " + key.getCol() + ", " + key.getRow() + ": " + getXCoordin(key) + ", " + getYCoordin(key));
subset.put(key, get(key)); subset.put(key, get(key));
} }
return subset; return subset;
......
package ac.sac.raster;
import org.junit.Test;
import ac.ed.lurg.yield.YieldRaster;
import ac.ed.lurg.yield.YieldResponsesItem;
public class RasterSetTest {
@Test
public void test() {
YieldRaster dataset = new YieldRaster(new RasterHeaderDetails(720,360,-180,-90,0.5,""));
double y = dataset.getYCoordin(new RasterKey(0,179));
System.out.println("y=" +y);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment