TraceReader.java
Go to the documentation of this file.00001 package ansim;
00002
00003 import java.io.FileInputStream;
00004 import java.io.IOException;
00005 import java.io.InputStream;
00006 import java.io.PrintWriter;
00007 import java.util.HashMap;
00008 import java.util.List;
00009
00010 import javax.xml.stream.XMLInputFactory;
00011 import javax.xml.stream.XMLStreamConstants;
00012 import javax.xml.stream.XMLStreamException;
00013 import javax.xml.stream.XMLStreamReader;
00014
00015 import ansim.Edge;
00016 import ansim.Vehicle;
00017
00023 public class TraceReader {
00031 public static void readFirst(String trace, List<Vehicle> vehicles, HashMap<String, Integer> vehicleIds, List<Edge> edges) {
00032 try {
00033 InputStream in = new FileInputStream(trace);
00034 XMLInputFactory factory = XMLInputFactory.newInstance();
00035 XMLStreamReader parser = factory.createXMLStreamReader(in);
00036 for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {
00037 String edgeid = "";
00038 if (event == XMLStreamConstants.START_ELEMENT) {
00039
00040 if (parser.getLocalName().equals("edge")) {
00041 for (int attr=0; attr < parser.getAttributeCount(); attr++) {
00042 String attrName = parser.getAttributeLocalName(attr);
00043 String value = parser.getAttributeValue(attr);
00044 if ("id".equals(attrName)) edgeid = value;
00045 }
00046 }
00047
00048 if (parser.getLocalName().equals("vehicle")) {
00049 String id = "";
00050 float pos = 0;
00051 float x = 0;
00052 float y = 0;
00053 for (int attr=0; attr < parser.getAttributeCount(); attr++) {
00054 String attrName = parser.getAttributeLocalName(attr);
00055 String value = parser.getAttributeValue(attr);
00056 if ("id".equals(attrName)) id = value;
00057 if ("pos".equals(attrName)) pos = Float.parseFloat(value);
00058 }
00059
00060 if (!vehicleIds.containsKey(id)) {
00061 Edge thisedge = null;
00062 for (Edge edge: edges) {
00063 thisedge = edge;
00064 if (edge.id.equals(edgeid)) break;
00065 }
00066 x = thisedge.xfrom + pos * (thisedge.xto - thisedge.xfrom) / thisedge.length;
00067 y = thisedge.yfrom + pos * (thisedge.yto - thisedge.yfrom) / thisedge.length;
00068 Vehicle vehicle = new Vehicle(id, x, y);
00069 vehicles.add(vehicle);
00070 vehicleIds.put(id, vehicleIds.size());
00071 }
00072 }
00073 }
00074 }
00075 parser.close();
00076 } catch (XMLStreamException e) {
00077 System.err.println(e);
00078 } catch (IOException e) {
00079 System.err.println(e);
00080
00081 }
00082 }
00083
00092 public static void readSecond(PrintWriter out, String trace, List<Vehicle> vehicles, HashMap<String, Integer> vehicleIds, List<Edge> edges) {
00093 try {
00094 InputStream in = new FileInputStream(trace);
00095 XMLInputFactory factory = XMLInputFactory.newInstance();
00096 XMLStreamReader parser = factory.createXMLStreamReader(in);
00097 String edgeid = "";
00098 float time = -1;
00099 out.println("<mobility>");
00100
00101 for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {
00102 if (event == XMLStreamConstants.START_ELEMENT) {
00103
00104 if (parser.getLocalName().equals("timestep")) {
00105 for (int attr=0; attr < parser.getAttributeCount(); attr++) {
00106 String attrName = parser.getAttributeLocalName(attr);
00107 String value = parser.getAttributeValue(attr);
00108 if ("time".equals(attrName)) time = Float.parseFloat(value);
00109 }
00110 }
00111
00112 if (time>0) {
00113
00114 if (parser.getLocalName().equals("edge")) {
00115 for (int attr=0; attr < parser.getAttributeCount(); attr++) {
00116 String attrName = parser.getAttributeLocalName(attr);
00117 String value = parser.getAttributeValue(attr);
00118 if ("id".equals(attrName)) edgeid = value;
00119 }
00120 }
00121
00122 if (parser.getLocalName().equals("vehicle")) {
00123 String id = "";
00124 float pos = 0;
00125 float x = 0;
00126 float y = 0;
00127 for (int attr=0; attr < parser.getAttributeCount(); attr++) {
00128 String attrName = parser.getAttributeLocalName(attr);
00129 String value = parser.getAttributeValue(attr);
00130 if ("id".equals(attrName)) id = value;
00131 if ("pos".equals(attrName)) pos = Float.parseFloat(value);
00132 }
00133 Edge thisedge = null;
00134
00135 for (Edge edge: edges) {
00136 thisedge = edge;
00137 if (edge.id.equals(edgeid)) break;
00138 }
00139 x = thisedge.xfrom + pos * (thisedge.xto - thisedge.xfrom) / thisedge.length;
00140 y = thisedge.yfrom + pos * (thisedge.yto - thisedge.yfrom) / thisedge.length;
00141
00142
00143 out.println(" <position_change>");
00144 out.println(" <node_id>" + vehicleIds.get(id) + "</node_id>");
00145 out.println(" <start_time>" + time + "</start_time>");
00146 out.println(" <end_time>" + (time+1) + "</end_time>");
00147 out.println(" <destination>");
00148 out.println(" <xpos>" + x + "</xpos>");
00149 out.println(" <ypos>" + y + "</ypos>");
00150 out.println(" </destination>");
00151 out.println(" </position_change>");
00152
00153 }
00154 }
00155 }
00156 }
00157 out.println("</mobility>");
00158 parser.close();
00159 } catch (XMLStreamException e) {
00160 System.err.println(e);
00161 } catch (IOException e) {
00162 System.err.println(e);
00163 }
00164 }
00165 }