package se.kodapan.osm.city;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author kalle
* @since 2015-01-12 05:19
*/
public abstract class InstanceFactory {
private Classifier classifier;
protected InstanceFactory(Classifier classifier) {
this.classifier = classifier;
}
public abstract BufferedImage loadImage(double south, double west, double north, double east) throws Exception;
public Instance newInstance(double south, double west, double north, double east) throws Exception {
BufferedImage image = loadImage(south, west, north, east);
Instance instance = new Instance();
instance.setNorth(north);
instance.setEast(east);
instance.setWest(west);
instance.setSouth(south);
byte[][] data = new byte[image.getWidth()][];
for (int x = 0; x < image.getWidth(); x++) {
data[x] = new byte[image.getHeight()];
for (int y = 0; y < image.getHeight(); y++) {
data[x][y] = getClassifier().getPalette().getColor(image.getRGB(x, y)).getAttributeIndex();
}
}
instance.setData(data);
Map<Byte, AtomicInteger> occurances = new HashMap<Byte, AtomicInteger>(256);
for (int x = 0; x < data.length; x++) {
for (int y = 0; y < data[x].length; y++) {
AtomicInteger value = occurances.get(data[x][y]);
if (value == null) {
value = new AtomicInteger();
occurances.put(data[x][y], value);
}
value.incrementAndGet();
}
}
double totalDataSize = data.length * data[0].length;
double[] histogramPercent = new double[getClassifier().getPalette().getColors().size()];
for (Map.Entry<Byte, AtomicInteger> entry : occurances.entrySet()) {
histogramPercent[entry.getKey()] = entry.getValue().get() / totalDataSize;
}
instance.setHistogramPercent(histogramPercent);
return instance;
}
public Classifier getClassifier() {
return classifier;
}
}