Пример #1
0
        public void Constructor_Member_CreatesNewRelationMembeAndSetsMember()
        {
            Node member = new Node(11);
            RelationMember target = new RelationMember(member);

            Assert.Same(member, target.Member);
            Assert.True(string.IsNullOrEmpty(target.Role));
        }
Пример #2
0
        public void Constructor_Member_Role_CreatesRelationMemberAndSetsMemberAndRole()
        {
            Node member = new Node(11);
            string role = "role";
            RelationMember target = new RelationMember(member, role);

            Assert.Same(member, target.Member);
            Assert.Equal(role, target.Role);
        }
Пример #3
0
        public void Constructor_int_IEnumerable_CreatesRelationWithMembersAndInitializesProperties()
        {
            int id = 11;
            var members = new RelationMember[] { new RelationMember(new Node(1)), new RelationMember(new Node(2)), new RelationMember(new Node(3)) };
            Relation target = new Relation(id, members);

            Assert.Equal(id, target.ID);
            Assert.Equal(members.Length, target.Geometries.Count);
            for (int i = 0; i < members.Length; i++) {
                Assert.Same(members[i], target.Geometries[i]);
            }

            Assert.Empty(target.Tags);
        }
Пример #4
0
        public void Constructor_int_tags_CreatesRelationAndIntializesProperties()
        {
            int id = 11;
            var members = new RelationMember[] { new RelationMember(new Node(1)), new RelationMember(new Node(2)), new RelationMember(new Node(3)) };
            TagsCollection tags = new TagsCollection();
            Relation target = new Relation(id, members, tags);

            Assert.Equal(id, target.ID);
            Assert.Equal(members.Length, target.Geometries.Count);
            for (int i = 0; i < members.Length; i++) {
                Assert.Same(members[i], target.Geometries[i]);
            }

            Assert.Same(tags, target.Tags);
        }
Пример #5
0
 /// <summary>
 /// Initializes a new instance of the RelationMemberInfo structure with values from specific RelationMember.
 /// </summary>
 /// <param name="source">The RelationMember object to copy valyes from.</param>
 public RelationMemberInfo(RelationMember source)
 {
     this.Reference = source.Member.ID;
     this.MemberType = source.MemberType;
     this.Role = source.Role;
 }
        /// <summary>
        /// Creates a new instaance of the OsmDatabase class and loads data from specific IOsmReader into it.
        /// </summary>
        /// <param name="reader">The IOsmReader to read data from.</param>
        /// <param name="ignoreReferentialErrors">A value indicatings whether Load function should skip geometries that reference miising geometries.</param>
        /// <returns>New instance of the OsmDatabase class with data loaded from specified reader.</returns>
        public static OsmGeometryDatabase Load(IOsmReader reader, bool ignoreReferentialErrors)
        {
            OsmGeometryDatabase db = new OsmGeometryDatabase();

            List <RelationInfo> relations = new List <RelationInfo>();

            IEntityInfo entityInfo = null;

            while ((entityInfo = reader.Read()) != null)
            {
                switch (entityInfo.EntityType)
                {
                case EntityType.Node: db.Nodes.Add(Node.FromNodeInfo(entityInfo as NodeInfo)); break;

                case EntityType.Way:
                    Way toAdd = Way.FromWayInfo(entityInfo as WayInfo, db, !ignoreReferentialErrors);
                    if (toAdd == null)
                    {
                        if (!ignoreReferentialErrors)
                        {
                            throw new ArgumentException(string.Format("Way (ID = {0}) references missing node.", entityInfo.ID));
                        }
                    }
                    else
                    {
                        db.Ways.Add(toAdd);
                    }

                    break;

                case EntityType.Relation:
                    RelationInfo ri = entityInfo as RelationInfo;
                    db.Relations.Add(new Relation(ri.ID)
                    {
                        Tags = ri.Tags, Metadata = ri.Metadata
                    });
                    relations.Add(ri);
                    break;
                }
            }

            foreach (var relationInfo in relations)
            {
                Relation relation = db.Relations[relationInfo.ID];

                foreach (var memberInfo in relationInfo.Members)
                {
                    RelationMember member = RelationMember.FromRelationMemberInfo(memberInfo, db, false);
                    if (member == null)
                    {
                        if (!ignoreReferentialErrors)
                        {
                            throw new ArgumentException(string.Format("Relation (ID = {0}) references missing OSM entity.", memberInfo.Reference));
                        }

                        db.Relations.Remove(relation);
                    }
                    else
                    {
                        relation.Geometries.Add(member);
                    }
                }
            }

            return(db);
        }
Пример #7
0
        public void MemberType_ReturnsCorrectValueForWay()
        {
            RelationMember target = new RelationMember(new Way(11));

            Assert.Equal(EntityType.Way, target.MemberType);
        }
Пример #8
0
        public void MemberType_ReturnsCorrectValueForNode()
        {
            RelationMember target = new RelationMember(new Node(11));

            Assert.Equal(EntityType.Node, target.MemberType);
        }
Пример #9
0
        public void IsMeasured_GetsTrueForMeasuredMember()
        {
            Mock<Node> memberM = new Mock<Node>(11);
            memberM.SetupGet(property => property.IsMeasured).Returns(true);

            RelationMember target = new RelationMember(memberM.Object);

            Assert.Equal(memberM.Object.IsMeasured, target.IsMeasured);
        }
Пример #10
0
        public void Is3D_GetsFalseFor2DMember()
        {
            Mock<Node> memberM = new Mock<Node>(11);
            memberM.SetupGet(property => property.Is3D).Returns(false);

            RelationMember target = new RelationMember(memberM.Object);

            Assert.Equal(memberM.Object.Is3D, target.Is3D);
        }
Пример #11
0
        public void GetEnvelopeReturnsMembersEnvelope()
        {
            Envelope expectedEnvelope = new Envelope(new Coordinate(1.1, 2.2));
            Mock<Way> member = new Mock<Way>(11);
            member.Setup(function => function.GetEnvelope()).Returns(expectedEnvelope);

            RelationMember target = new RelationMember(member.Object);

            Assert.Same(expectedEnvelope, target.GetEnvelope());
        }
Пример #12
0
        /// <summary>
        /// Creates a new instance of the RelationMember class based on the data from RelationInfo object.
        /// </summary>
        /// <param name="info">The RelationMemberInfo object that contains data about member.</param>
        /// <param name="entities">The entities that can be referenced by RelationMember.</param>
        /// <param name="throwOnMissing">bool value indicating whether references to the missing entity should cause exception.</param>
        /// <returns>The RelationMember object created from RelationMemberInfo or null if referenced node is missing.</returns>
        public static RelationMember FromRelationMemberInfo(RelationMemberInfo info, IEntityCollection<IOsmGeometry> entities, bool throwOnMissing)
        {
            if (info.MemberType == EntityType.Unknown) {
                throw new ArgumentException("info.MemberType cannot be EntityType.Unknown");
            }

            if (entities.Contains(info.Reference, info.MemberType) == false) {
                if (throwOnMissing) {
                    throw new ArgumentException(string.Format("Referenced Entity (ID = {0}, type = {1}) not found in entities collection.", info.Reference, info.MemberType), "info.Reference");
                }
                else {
                    return null;
                }
            }

            RelationMember result = new RelationMember(entities[info.Reference, info.MemberType], info.Role) { MemberType = info.MemberType };
            if (result.Member.EntityType != info.MemberType) {
                throw new ArgumentException("Type of the referenced entity doesn't match type of the entity in the collection.");
            }

            return result;
        }