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                     // edge-element found
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                     // vehicle-element found
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                         // get vehicle position
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             //System.out.println("IOException while parsing " + trace);
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             // parse tracefile
00101             for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {
00102                 if (event == XMLStreamConstants.START_ELEMENT) {
00103                     // get current time
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                     // process only positive time
00112                     if (time>0) {
00113                         // edge found
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                         // vehicle found
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                             // find/calc position of vehicle
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                             // write current entry to ansim tracefile
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 }

Generated on Wed May 5 00:06:37 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6