package se.kodapan.osm.city; import weka.classifiers.bayes.NaiveBayes; import weka.classifiers.functions.SMO; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.net.URL; import java.text.DecimalFormat; import java.util.Map; /** * @author kalle * @since 2015-01-12 04:47 */ public class EkonomiskaKartanInstanceFactory extends InstanceFactory { public static void main(String[] args) throws Exception { WekaClassifier classifier = new WekaClassifier(); classifier.setTrainingDataArffFile(new File("trainingData.arff")); classifier.setClassifier(new NaiveBayes()); classifier.setPalette(new Palette() .addColor("#6A8B5D") .addColor("#8EB27A") .addColor("#A2BE97") .addColor("#BBC228") .addColor("#4F5D40") .addColor("#9EB23C") .addColor("#778E43")); classifier.setInstanceFactory(new CachedInstanceFactory(new File("data/ekonomiska-kartan"), classifier, new EkonomiskaKartanInstanceFactory(classifier))); Grid grid = new Grid( // jönköping huskvarna 57.747, 14.099, 57.826, 14.324 // vellinge // 55.462, 12.99, 55.485, 13.045 // malmö // 55.5325167053891, 12.887306213378906, 55.63225992920628, 13.100166320800781 , 5000, 5000, 250 ); for (int x = 0; x < grid.getColumns().length; x++) { for (int y = 0; y < grid.getColumns()[x].length; y++) { Cell cell = grid.getColumns()[x][y]; try { cell.setInstance(classifier.getInstanceFactory().newInstance( grid.getCellSouth(x, y), grid.getCellWest(x, y), grid.getCellNorth(x, y), grid.getCellEast(x, y) )); } catch (Exception e) { e.printStackTrace(); } } } grid.writeOsmXML(new File("grid.osm.xml")); Map<Instance, String> trainingData = grid.loadTrainingData(classifier.getInstanceFactory()); for (Map.Entry<Instance, String> instance : trainingData.entrySet()) { classifier.train(instance.getKey(), instance.getValue()); } classifier.build(); for (int x = 0; x < grid.getColumns().length; x++) { for (int y = 0; y < grid.getColumns()[x].length; y++) { Cell cell = grid.getColumns()[x][y]; if (cell.getInstance() != null) { cell.setClassification(classifier.classify(cell.getInstance())); } } } grid.writeOsmXML(new File("classified.osm.xml")); } public EkonomiskaKartanInstanceFactory(Classifier classifier) { super(classifier); } private int width = 256; private int height = 256; @Override public BufferedImage loadImage(double south, double west, double north, double east) throws Exception { DecimalFormat df = new DecimalFormat("#.#######"); String url = new StringBuilder("http://www.gavert.net/cgi-bin/mapserv") .append("?map=ek.map") .append("&FORMAT=image/png&VERSION=1.1.1") .append("&SERVICE=WMS") .append("&REQUEST=GetMap&LAYERS=virtualraster") .append("&STYLES=") .append("&SRS=EPSG:4326") .append("&WIDTH=").append(String.valueOf(width)) .append("&HEIGHT=").append(String.valueOf(height)) .append("&BBOX=").append(df.format(west)).append(",").append(df.format(south)).append(",").append(df.format(east)).append(",").append(df.format(north)) .toString(); System.out.println(url); return ImageIO.read(new URL(url)); } }