public void AddNode(OsmNode node) { if (this.nodes.ContainsKey(node.ObjectId)) { throw new OsmDuplicatedObjectIdException(node); } nodes.Add(node.ObjectId, node); }
/// <summary> /// Calculates the orientation of the way. /// </summary> /// <param name="osmDB">The OSM database.</param> /// <returns>A value indicating the orientation: /// <list> /// <item><0</item><description>Way is clockwise.</description> /// <item>>=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)); }
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); } }
static public double ValueNum(OsmNode osmElement, string key) { return(Double.Parse(osmElement.GetTagValue(key), System.Globalization.CultureInfo.InvariantCulture)); }
static public string ValueString(OsmNode osmElement, string key) { return(osmElement.GetTagValue(key)); }
static public bool IsTaggedWith(OsmNode osmElement, string key) { return(osmElement.HasTag(key)); }