public static ElementContainer ToElementContainer(this List <CustomObject> queryResults) { List <Way> ways = new List <Way>(); List <Node> nodes = new List <Node>(); List <Relation> relations = new List <Relation>(); foreach (CustomObject result in queryResults) { if (result.CustomData.ContainsKey("elements")) { List <object> elements = (List <object>)result.CustomData["elements"];// .Cast<CustomObject>(); CustomObject tags = new CustomObject(); foreach (object ele in elements) { try { CustomObject element = (CustomObject)ele; long id = 0; if (element.CustomData["id"] is int) { id = (int)element.CustomData["id"]; } if (element.CustomData["id"] is long) { id = (long)element.CustomData["id"]; } if (element.CustomData.ContainsKey("tags")) { tags = (CustomObject)element.CustomData["tags"]; } if ((string)element.CustomData["type"] == "node") { double latitude = (double)element.CustomData["lat"]; double longitude = (double)element.CustomData["lon"]; Node node = new Node() { Latitude = latitude, Longitude = longitude, OsmID = id }; node.AddTags(tags); nodes.Add(node); } if ((string)element.CustomData["type"] == "way") { List <object> ids = new List <object>(); if (element.CustomData.ContainsKey("nodes")) { ids = (List <object>)element.CustomData["nodes"]; } Way way = new Way() { OsmID = id }; way.AddTags(tags); way.AddNodeIds(ids); ways.Add(way); } if ((string)element.CustomData["type"] == "relation") { List <object> members = new List <object>(); if (element.CustomData.ContainsKey("members")) { members = (List <object>)element.CustomData["members"]; } Relation relation = new Relation() { OsmID = id }; relation.AddTags(tags); relation.AddMembers(members); relations.Add(relation); } } catch (Exception e) { throw new ArgumentException("Unexpected data format from OpenStreetMap " + e.Message); } } } } foreach (Way way in ways) { List <Node> waynodes = new List <Node>(); foreach (Int64 id in way.NodeOsmIds) { waynodes.Add(nodes.Find(x => x.OsmID == id)); } way.Nodes = waynodes; } return(new ElementContainer() { Nodes = nodes, Ways = ways, Relations = relations }); }