// <summary> /// Generates the OSM output files. /// </summary> public void CreateLevelFilesOSM() { string path = _options.Directory; string prefix = _options.Prefix; XmlWriterSettings xs = new XmlWriterSettings(); xs.Indent = true; for (int level = 1; level <= StressModel.LevelCount; level++) { string filename = Path.Combine(path, prefix + level.ToString() + ".osm"); if (File.Exists(filename)) { File.Delete(filename); } using (XmlWriter writer = XmlWriter.Create(filename, xs)) { writer.WriteStartDocument(); writer.WriteStartElement("osm"); writer.WriteAttributeString("version", "0.6"); writer.WriteAttributeString("generator", "Bike Ottawa"); { writer.WriteStartElement("note"); writer.WriteString("The data included in this document originated from www.openstreetmap.org and was converted by Bike Ottawa. The data is made available under ODbL."); writer.WriteEndElement(); writer.WriteStartElement("meta"); writer.WriteAttributeString("osm_base", _osmBase); writer.WriteEndElement(); writer.WriteStartElement("bounds"); writer.WriteAttributeString("minlat", _minLat); writer.WriteAttributeString("minlon", _minLon); writer.WriteAttributeString("maxlat", _maxLat); writer.WriteAttributeString("maxlon", _maxLon); writer.WriteEndElement(); foreach (KeyValuePair <string, Node> kvnode in _nodes) { Node n = kvnode.Value; if (n.IsLevel(level)) { writer.WriteStartElement("node"); writer.WriteAttributeString("id", kvnode.Key); writer.WriteAttributeString("lat", n.Lat); writer.WriteAttributeString("lon", n.Lon); writer.WriteEndElement(); } } foreach (KeyValuePair <string, Way> kvway in _ways) { Way w = kvway.Value; if (w.Level == level) { writer.WriteStartElement("way"); writer.WriteAttributeString("id", kvway.Key); { foreach (string nd in w.Nodes) { writer.WriteStartElement("nd"); writer.WriteAttributeString("ref", nd); writer.WriteEndElement(); } } writer.WriteEndElement(); } } } writer.WriteEndElement(); writer.WriteEndDocument(); } } }
/// <summary> /// Processes a way element at the current read position in the reader. /// Exits with the reader positioned at the next sibling element. /// </summary> /// <param name="i_reader">An XmlReader object with the read position on a way element.</param> private void ProcessWays1(XmlReader reader) { if (reader.IsStartElement("way")) { Way way = new Way(); string id = reader.GetAttribute("id"); if (reader.IsEmptyElement) { // Next node. reader.Read(); } else { while (reader.Read()) { if (reader.Name == "tag") { way.AddTag(reader); } else if (reader.Name == "nd") { string nodeRef = reader.GetAttribute("ref"); way.Nodes.Add(nodeRef); } else { if (reader.NodeType == XmlNodeType.EndElement) { reader.Read(); break; } else { throw new Exception("Unexpected element: " + reader.ReadOuterXml()); } } } } // This is a preliminary test to make sure we only add ways that are potentially valid // routes. This could be expanded to further filter the ways but this will typically // be done in the analysis phase. if (_options.IncludeBannedHighways || StressModel.BikingPermitted(id, way)) { if (way.HasTag("highway")) { _ways.Add(id, way); foreach (string nodeRef in way.Nodes) { if (!_usedNodes.Contains(nodeRef)) { _usedNodes.Add(nodeRef); } } } } } else { throw new Exception("Unexpected node: " + reader.Name); } }