Ejemplo n.º 1
0
        public void AddNode(OsmNode node)
        {
            if (this.nodes.ContainsKey(node.ObjectId))
            {
                throw new OsmDuplicatedObjectIdException(node);
            }

            nodes.Add(node.ObjectId, node);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calculates the orientation of the way.
        /// </summary>
        /// <param name="osmDB">The OSM database.</param>
        /// <returns>A value indicating the orientation:
        /// <list>
        /// <item>&lt;0</item><description>Way is clockwise.</description>
        /// <item>&gt;=0</item><description>Way is counterclockwise.</description>
        /// </list>
        /// </returns>
        public double CalculateOrientation(OsmDatabase osmDB)
        {
            if (nodesList.Count < 3)
            {
                return(0);
            }

            // first find rightmost lowest vertex of the polygon
            int    rmin = 0;
            double xmin = osmDB.Nodes [nodesList[0]].Longitude;
            double ymin = osmDB.Nodes [nodesList[0]].Latitude;

            for (int i = 1; i < nodesList.Count; i++)
            {
                OsmNode node = osmDB.Nodes[nodesList[i]];

                if (node.Latitude > ymin)
                {
                    continue;
                }
                if (node.Latitude == ymin)
                {                              // just as low
                    if (node.Longitude < xmin) // and to left
                    {
                        continue;
                    }
                }
                rmin = i;          // a new rightmost lowest vertex
                xmin = node.Longitude;
                ymin = node.Latitude;
            }

            OsmNode point0 = osmDB.Nodes[nodesList[(rmin - 1 + nodesList.Count) % nodesList.Count]];
            OsmNode point1 = osmDB.Nodes[nodesList[rmin]];
            OsmNode point2 = osmDB.Nodes[nodesList[(rmin + 1) % nodesList.Count]];

            // test orientation at this rmin vertex
            // ccw <=> the edge leaving is left of the entering edge
            return((point1.Longitude - point0.Longitude) * (point2.Latitude - point0.Latitude)
                   - (point2.Longitude - point0.Longitude) * (point1.Latitude - point0.Latitude));
        }
Ejemplo n.º 3
0
        public void ImportData(osm osmData)
        {
            foreach (osmNode originalNode in osmData.Node)
            {
                OsmObjectAction objectAction = ParseOsmObjectAction(originalNode.Action);
                if (objectAction == OsmObjectAction.Delete)
                {
                    continue;
                }

                OsmNode node = new OsmNode(originalNode.Id, originalNode.Lat, originalNode.Lon);
                if (originalNode.Timestamp != null)
                {
                    node.Timestamp = DateTime.Parse(originalNode.Timestamp, CultureInfo.InvariantCulture);
                }
                node.User        = OsmUser.Fetch(originalNode.User, originalNode.Uid);
                node.ChangesetId = originalNode.Changeset;
                node.Visible     = originalNode.Visible;
                node.Action      = objectAction;

                foreach (tag tag in originalNode.Tag)
                {
                    node.SetTag(tag.K, tag.V);
                }

                AddNode(node);
            }

            foreach (osmWay originalWay in osmData.Way)
            {
                OsmObjectAction objectAction = ParseOsmObjectAction(originalWay.Action);
                if (objectAction == OsmObjectAction.Delete)
                {
                    continue;
                }

                OsmWay way = new OsmWay(originalWay.Id);
                if (originalWay.Timestamp != null)
                {
                    way.Timestamp = DateTime.Parse(originalWay.Timestamp, CultureInfo.InvariantCulture);
                }
                way.User        = OsmUser.Fetch(originalWay.User, originalWay.Uid);
                way.ChangesetId = originalWay.Changeset;
                way.Visible     = originalWay.Visible;
                way.Action      = objectAction;

                foreach (osmWayND nd in originalWay.Nd)
                {
                    way.AddNode(nd.Ref);
                }

                foreach (tag tag in originalWay.Tag)
                {
                    way.SetTag(tag.K, tag.V);
                }

                AddWay(way);
            }

            foreach (osmRelation originalRelation in osmData.Relation)
            {
                OsmObjectAction objectAction = ParseOsmObjectAction(originalRelation.Action);
                if (objectAction == OsmObjectAction.Delete)
                {
                    continue;
                }

                if (originalRelation.Action == "delete")
                {
                    continue;
                }

                OsmRelation relation = new OsmRelation(originalRelation.Id);
                if (originalRelation.Timestamp != null)
                {
                    relation.Timestamp = DateTime.Parse(originalRelation.Timestamp, CultureInfo.InvariantCulture);
                }
                relation.User        = OsmUser.Fetch(originalRelation.User, originalRelation.Uid);
                relation.ChangesetId = originalRelation.Changeset;
                relation.Visible     = originalRelation.Visible;
                relation.Action      = objectAction;

                foreach (osmRelationMember member in originalRelation.Member)
                {
                    OsmReferenceType referenceType = ParseOsmReferenceType(member.Type);
                    relation.AddMember(referenceType, member.Ref, member.Role);
                }

                foreach (tag tag in originalRelation.Tag)
                {
                    relation.SetTag(tag.K, tag.V);
                }

                AddRelation(relation);
            }
        }
Ejemplo n.º 4
0
 static public double ValueNum(OsmNode osmElement, string key)
 {
     return(Double.Parse(osmElement.GetTagValue(key), System.Globalization.CultureInfo.InvariantCulture));
 }
Ejemplo n.º 5
0
 static public string ValueString(OsmNode osmElement, string key)
 {
     return(osmElement.GetTagValue(key));
 }
Ejemplo n.º 6
0
 static public bool IsTaggedWith(OsmNode osmElement, string key)
 {
     return(osmElement.HasTag(key));
 }