package maps.convert.osm2gml; import maps.gml.GMLMap; import maps.gml.GMLNode; import maps.gml.GMLEdge; import maps.gml.GMLDirectedEdge; import maps.gml.GMLShape; import maps.convert.ConvertStep; import maps.ScaleConversion; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.Collection; /** This step creates the final GML objects. */ public class MakeObjectsStep extends ConvertStep { private TemporaryMap map; private GMLMap gmlMap; /** Construct a MakeObjectsStep. @param map The TemporaryMap to read. @param gmlMap The GMLMap to populate. */ public MakeObjectsStep(TemporaryMap map, GMLMap gmlMap) { super(); this.map = map; this.gmlMap = gmlMap; } @Override public String getDescription() { return "Generating GML objects"; } @Override protected void step() { double xMin = Double.POSITIVE_INFINITY; double yMin = Double.POSITIVE_INFINITY; for (Node next : map.getAllNodes()) { xMin = Math.min(xMin, next.getX()); yMin = Math.min(yMin, next.getY()); } double sizeOf1m = ConvertTools.sizeOf1Metre(map.getOSMMap()); double scale = 1.0 / sizeOf1m; ScaleConversion conversion = new ScaleConversion(xMin, yMin, scale, scale); Collection<Node> nodes = map.getAllNodes(); Collection<Edge> edges = map.getAllEdges(); setProgressLimit(nodes.size() + edges.size() + (map.getAllObjects().size() * 2)); Map<Node, GMLNode> nodeMap = new HashMap<Node, GMLNode>(); Map<Edge, GMLEdge> edgeMap = new HashMap<Edge, GMLEdge>(); Map<TemporaryObject, GMLShape> shapeMap = new HashMap<TemporaryObject, GMLShape>(); for (Node n : nodes) { GMLNode node = gmlMap.createNode(conversion.convertX(n.getX()), conversion.convertY(n.getY())); nodeMap.put(n, node); bumpProgress(); } for (Edge e : edges) { GMLNode first = nodeMap.get(e.getStart()); GMLNode second = nodeMap.get(e.getEnd()); GMLEdge edge = gmlMap.createEdge(first, second); edgeMap.put(e, edge); bumpProgress(); } for (TemporaryBuilding b : map.getBuildings()) { shapeMap.put(b, gmlMap.createBuilding(makeEdges(b, edgeMap))); bumpProgress(); } for (TemporaryRoad r : map.getRoads()) { shapeMap.put(r, gmlMap.createRoad(makeEdges(r, edgeMap))); bumpProgress(); } for (TemporaryIntersection i : map.getIntersections()) { shapeMap.put(i, gmlMap.createRoad(makeEdges(i, edgeMap))); bumpProgress(); } // Generate neighbour information for (TemporaryObject o : map.getAllObjects()) { GMLShape s = shapeMap.get(o); for (DirectedEdge e : o.getEdges()) { TemporaryObject neighbour = o.getNeighbour(e); if (neighbour != null) { s.setNeighbour(edgeMap.get(e.getEdge()), shapeMap.get(neighbour).getID()); } } bumpProgress(); } setStatus("Created " + gmlMap.getRoads().size() + " roads and " + gmlMap.getBuildings().size() + " buildings"); } private List<GMLDirectedEdge> makeEdges(TemporaryObject o, Map<Edge, GMLEdge> edgeMap) { List<DirectedEdge> oldEdges = o.getEdges(); List<GMLDirectedEdge> result = new ArrayList<GMLDirectedEdge>(oldEdges.size()); for (DirectedEdge dEdge : oldEdges) { result.add(new GMLDirectedEdge(edgeMap.get(dEdge.getEdge()), dEdge.isForward())); } return result; } }