package maps.convert.osm2gml;
import maps.osm.OSMMap;
import maps.gml.GMLMap;
import maps.convert.ConvertStep;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JComponent;
import javax.swing.JProgressBar;
import javax.swing.Box;
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Dimension;
import java.awt.Insets;
import java.util.List;
import java.util.ArrayList;
/**
This class converts OSMMaps to GMLMaps.
*/
public class Convertor {
private static final int PROGRESS_WIDTH = 200;
private static final int PROGRESS_HEIGHT = 10;
private static final int STATUS_WIDTH = 500;
private static final int STATUS_HEIGHT = 10;
private static final int MARGIN = 4;
/**
Convert an OSMMap to a GMLMap.
@param map The OSMMap to convert.
@return A new GMLMap.
*/
public GMLMap convert(OSMMap map) {
GMLMap gmlMap = new GMLMap();
JFrame frame = new JFrame("OSM to GML converter");
JPanel main = new JPanel(new BorderLayout());
JComponent top = Box.createVerticalBox();
top.add(new JLabel("Converting OSM map with " + map.getRoads().size() + " roads and " + map.getBuildings().size() + " buildings"));
top.add(new JLabel("Map size: " + (map.getMaxLongitude() - map.getMinLongitude()) + " x " + (map.getMaxLatitude() - map.getMinLatitude())));
GridBagLayout layout = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
c.insets = new Insets(MARGIN, MARGIN, MARGIN, MARGIN);
JPanel progress = new JPanel(layout);
// Random random = new Random();
TemporaryMap temp = new TemporaryMap(map);
List<ConvertStep> steps = new ArrayList<ConvertStep>();
addStep(new CleanOSMStep(temp), steps, progress, layout, c);
addStep(new ScanOSMStep(temp), steps, progress, layout, c);
addStep(new MakeTempObjectsStep(temp), steps, progress, layout, c);
addStep(new SplitIntersectingEdgesStep(temp), steps, progress, layout, c);
addStep(new SplitShapesStep(temp), steps, progress, layout, c);
addStep(new RemoveShapesStep(temp), steps, progress, layout, c);
addStep(new MergeShapesStep(temp), steps, progress, layout, c);
addStep(new ComputePassableEdgesStep(temp), steps, progress, layout, c);
/*
addStep(new CreateBuildingsStep(temp, ConvertTools.sizeOf1Metre(osmMap), random), steps, progress, layout, c);
addStep(new CreateEntrancesStep(temp), steps, progress, layout, c);
addStep(new PruneStep(temp), steps, progress, layout, c);
*/
addStep(new MakeObjectsStep(temp, gmlMap), steps, progress, layout, c);
main.add(top);
main.add(progress);
frame.setContentPane(main);
frame.pack();
frame.setVisible(true);
for (ConvertStep next : steps) {
next.doStep();
}
return gmlMap;
}
private void addStep(ConvertStep step, List<ConvertStep> steps, JComponent panel, GridBagLayout layout, GridBagConstraints c) {
JLabel title = new JLabel(step.getDescription());
JProgressBar progress = step.getProgressBar();
JComponent status = step.getStatusComponent();
c.gridx = 0;
c.weightx = 1;
layout.setConstraints(title, c);
panel.add(title);
c.gridx = 1;
c.weightx = 0;
layout.setConstraints(progress, c);
panel.add(progress);
c.gridx = 2;
c.weightx = 1;
layout.setConstraints(status, c);
panel.add(status);
++c.gridy;
progress.setPreferredSize(new Dimension(PROGRESS_WIDTH, PROGRESS_HEIGHT));
status.setPreferredSize(new Dimension(STATUS_WIDTH, STATUS_HEIGHT));
steps.add(step);
}
}