Exemple #1
0
        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
            });
        }