def create_measurement_file(induction_tab, travel_time_tab, edge_tab, link_tab, net_offset): result_doc = Document() root = result_doc.createElement("additional") result_doc.appendChild(root) for loop in induction_tab: ind_loop = result_doc.createElement("inductionLoop") ind_loop.setAttribute("id", "_".join([loop["no"], loop["name"]])) sumo_lane = "_".join([loop["lane"].split(" ")[0], str(int(loop["lane"].split(" ")[1]) - 1)]) ind_loop.setAttribute("lane", sumo_lane) pathlen = loop["pos"] link_id = loop["lane"].split(" ")[0] lane_index = str(int(loop["lane"].split(" ")[1]) - 1) vissim_loop_coords = get_detector_coords_from_link(link_id, link_tab, pathlen) sumo_loop_coords = convert_vissim_to_sumo_coords(vissim_loop_coords, net_offset) polyline = [lane for lane in [edge for edge in edge_tab if edge["id"] == link_id][ 0]["lanes"] if lane["index"] == lane_index][0]["shape"].split(" ") shape = [] for point in polyline: shape.append(point.split(",")) edge_offset = geomhelper.polygonOffsetWithMinimumDistanceToPoint( sumo_loop_coords, [[float(coord) for coord in point] for point in shape]) ind_loop.setAttribute("pos", str(edge_offset)) ind_loop.setAttribute("file", "ind_out.xml") ind_loop.setAttribute("freq", "900") root.appendChild(ind_loop) for det in travel_time_tab: travel_time = result_doc.createElement("entryExitDetector") travel_time.setAttribute("id", det["no"]) travel_time.setAttribute("freq", "900") travel_time.setAttribute("file", "time_out.xml") start_edge = [edge for edge in edge_tab if edge["id"] == det["startLink"]] if len(start_edge) > 0: start_point = get_detector_coords_from_link(start_edge[0]["id"], link_tab, det["startPos"]) sumo_point = convert_vissim_to_sumo_coords(start_point, net_offset) for lane in start_edge[0]["lanes"]: det_entry = result_doc.createElement("detEntry") polyline = lane["shape"].split(" ") shape = [] for point in polyline: shape.append(point.split(",")) start_offset = geomhelper.polygonOffsetWithMinimumDistanceToPoint( sumo_point, [[float(coord) for coord in point] for point in shape]) det_entry.setAttribute("lane", lane["id"]) if start_offset < float(lane["length"]): det_entry.setAttribute("pos", str(start_offset)) else: det_entry.setAttribute("pos", lane["length"]) travel_time.appendChild(det_entry) end_edge = [edge for edge in edge_tab if edge["id"] == det["endLink"]] if len(end_edge) > 0: end_point = get_detector_coords_from_link(end_edge[0]["id"], link_tab, det["endPos"]) sumo_point = convert_vissim_to_sumo_coords(end_point, net_offset) for lane in end_edge[0]["lanes"]: det_exit = result_doc.createElement("detExit") polyline = lane["shape"].split(" ") shape = [] for point in polyline: shape.append(point.split(",")) end_offset = geomhelper.polygonOffsetWithMinimumDistanceToPoint( sumo_point, [[float(coord) for coord in point] for point in shape]) det_exit.setAttribute("lane", lane["id"]) if end_offset < float(lane["length"]): det_exit.setAttribute("pos", str(end_offset)) else: det_exit.setAttribute("pos", lane["length"]) travel_time.appendChild(det_exit) root.appendChild(travel_time) return result_doc