package maps.convert.osm2gml; import maps.convert.ConvertStep; import java.util.Collection; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import rescuecore2.misc.geometry.Point2D; /** This step creates TemporaryObjects from the OSM data. */ public class MakeTempObjectsStep extends ConvertStep { private TemporaryMap map; /** Construct a MakeTempObjectsStep. @param map The TemporaryMap to populate. */ public MakeTempObjectsStep(TemporaryMap map) { super(); this.map = map; } @Override public String getDescription() { return "Generating temporary objects"; } @Override protected void step() { Collection<OSMRoadInfo> roads = map.getOSMRoadInfo(); Collection<OSMIntersectionInfo> intersections = map.getOSMIntersectionInfo(); Collection<OSMBuildingInfo> buildings = map.getOSMBuildingInfo(); setProgressLimit(roads.size() + intersections.size() + buildings.size()); generateRoadObjects(roads); generateIntersectionObjects(intersections); generateBuildingObjects(buildings); setStatus("Created " + map.getRoads().size() + " roads, " + map.getIntersections().size() + " intersections, " + map.getBuildings().size() + " buildings"); } private void generateRoadObjects(Collection<OSMRoadInfo> roads) { for (OSMRoadInfo road : roads) { if (road.getArea() != null) { List<DirectedEdge> edges = generateEdges(road); if (edges.size() > 2) { map.addRoad(new TemporaryRoad(edges)); } } bumpProgress(); } } private void generateIntersectionObjects(Collection<OSMIntersectionInfo> intersections) { for (OSMIntersectionInfo intersection : intersections) { if (intersection.getArea() != null) { List<DirectedEdge> edges = generateEdges(intersection); if (edges.size() > 2) { map.addIntersection(new TemporaryIntersection(edges)); } } bumpProgress(); } } private void generateBuildingObjects(Collection<OSMBuildingInfo> buildings) { for (OSMBuildingInfo building : buildings) { if (building.getArea() != null) { List<DirectedEdge> edges = generateEdges(building); if (edges.size() > 2) { map.addBuilding(new TemporaryBuilding(edges, building.getBuildingID())); } } bumpProgress(); } } private List<DirectedEdge> generateEdges(OSMShape s) { List<DirectedEdge> result = new ArrayList<DirectedEdge>(); Iterator<Point2D> it = s.getVertices().iterator(); Node first = map.getNode(it.next()); Node previous = first; while (it.hasNext()) { Node n = map.getNode(it.next()); if (!n.equals(previous)) { result.add(map.getDirectedEdge(previous, n)); previous = n; } } if (!previous.equals(first)) { result.add(map.getDirectedEdge(previous, first)); } return result; } }