package maps.convert.legacy2gml;
import maps.legacy.LegacyMap;
import maps.legacy.LegacyMapFormat;
import maps.legacy.LegacyRoad;
import maps.legacy.LegacyNode;
import maps.legacy.LegacyBuilding;
import maps.gml.GMLMap;
import maps.gml.formats.RobocupFormat;
import maps.ScaleConversion;
import java.io.File;
import java.util.Map;
import java.util.HashMap;
import rescuecore2.log.Logger;
/**
This class converts maps from the legacy format to GML.
*/
public final class LegacyToGML {
private static final double MM_TO_M = 0.001;
private LegacyToGML() {}
/**
Run the map convertor.
@param args Command line arguments: legacy-mapdir gml-mapname.
*/
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: LegacyToGML <legacy-mapdir> <gml-mapname>");
return;
}
try {
Logger.info("Reading legacy map");
LegacyMap legacy = LegacyMapFormat.INSTANCE.read(new File(args[0]));
GMLMap gml = new GMLMap();
Logger.info("Converting");
convert(legacy, gml);
Logger.info("Writing GML map");
RobocupFormat.INSTANCE.write(gml, new File(args[1]));
Logger.info("Done");
}
// CHECKSTYLE:OFF:IllegalCatch
catch (Exception e) {
e.printStackTrace();
}
// CHECKSTYLE:ON:IllegalCatch
System.exit(0);
}
private static void convert(LegacyMap legacy, GMLMap gml) {
Map<Integer, RoadInfo> roadInfo = new HashMap<Integer, RoadInfo>();
Map<Integer, NodeInfo> nodeInfo = new HashMap<Integer, NodeInfo>();
Map<Integer, BuildingInfo> buildingInfo = new HashMap<Integer, BuildingInfo>();
Logger.debug("Reading roads");
for (LegacyRoad r : legacy.getRoads()) {
roadInfo.put(r.getID(), new RoadInfo());
}
Logger.debug("Removing duplicate roads");
for (LegacyNode n : legacy.getNodes()) {
Map<Integer, LegacyRoad> roadToFarNode = new HashMap<Integer, LegacyRoad>();
for (int rid : n.getEdges()) {
LegacyRoad road = legacy.getRoad(rid);
if (road == null) {
continue;
}
int farNodeId = (n.getID() == road.getHead()) ? road.getTail() : road.getHead();
// Use the widest road
LegacyRoad existingRoad = roadToFarNode.get(farNodeId);
if (existingRoad != null && road.getWidth() <= existingRoad.getWidth()) {
roadInfo.remove(road.getID());
}
else if (existingRoad != null) {
roadInfo.remove(existingRoad.getID());
roadToFarNode.put(farNodeId, road);
}
else {
roadToFarNode.put(farNodeId, road);
}
}
}
Logger.debug("Reading nodes");
for (LegacyNode n : legacy.getNodes()) {
nodeInfo.put(n.getID(), new NodeInfo(n));
}
Logger.debug("Reading buildings");
for (LegacyBuilding b : legacy.getBuildings()) {
buildingInfo.put(b.getID(), new BuildingInfo(b));
}
Logger.debug("Creating intersections");
for (NodeInfo n : nodeInfo.values()) {
n.process(legacy, gml, roadInfo, buildingInfo);
}
Logger.debug("Creating roads");
for (RoadInfo r : roadInfo.values()) {
r.process(gml);
}
Logger.debug("Creating buildings");
for (BuildingInfo b : buildingInfo.values()) {
b.process(gml, nodeInfo, roadInfo);
}
// Rescale to m
gml.convertCoordinates(new ScaleConversion(gml.getMinX(), gml.getMinY(), MM_TO_M, MM_TO_M));
}
}