public void TestRelationMultipolygonAreaOneOuter()
        {
            // tests a multipolygon containing one 'outer' member.
            var source = new MemorySnapshotDb(
                new Node()
            {
                Id        = 1,
                Latitude  = 0,
                Longitude = 0
            },
                new Node()
            {
                Id        = 2,
                Latitude  = 1,
                Longitude = 0
            },
                new Node()
            {
                Id        = 3,
                Latitude  = 0,
                Longitude = 1
            },
                new Way()
            {
                Id    = 1,
                Nodes = new long[]
                {
                    1, 2, 3, 1
                }
            },
                new Relation()
            {
                Id   = 1,
                Tags = new TagsCollection(
                    new Tag("type", "multipolygon")),
                Members = new RelationMember[]
                {
                    new RelationMember()
                    {
                        Id   = 1,
                        Role = "outer",
                        Type = OsmGeoType.Way
                    }
                }
            }).CreateSnapshotDb();

            var interpreter = new DefaultFeatureInterpreter();
            var features    = interpreter.Interpret(source.GetRelation(1), source);

            Assert.IsNotNull(features);
            Assert.AreEqual(1, features.Count);
            var feature = features[0];

            Assert.IsInstanceOf <LinearRing>(feature.Geometry);
            Assert.IsTrue(feature.Attributes.Contains("type", "multipolygon"));
        }
        public void TestWayNaturalIsWaterArea()
        {
            var node1 = new Node();

            node1.Id        = 1;
            node1.Latitude  = 0;
            node1.Longitude = 0;
            var node2 = new Node();

            node2.Id        = 2;
            node2.Latitude  = 1;
            node2.Longitude = 0;
            var node3 = new Node();

            node3.Id        = 3;
            node3.Latitude  = 0;
            node3.Longitude = 1;

            var way = new Way();

            way.Id    = 1;
            way.Nodes = new long[]
            {
                1, 2, 3, 1
            };
            way.Tags = new TagsCollection();
            way.Tags.Add("natural", "water");

            var source = (new MemorySnapshotDb()).CreateSnapshotDb();

            source.AddOrUpdate(node1);
            source.AddOrUpdate(node2);
            source.AddOrUpdate(node3);
            source.AddOrUpdate(way);

            // the use of natural=water implies an area-type.
            var interpreter = new DefaultFeatureInterpreter();
            var features    = interpreter.Interpret(way, source);

            Assert.IsNotNull(features);
            Assert.AreEqual(1, features.Count);
            var feature = features[0];

            Assert.IsInstanceOf <LinearRing>(feature.Geometry);
            Assert.IsTrue(feature.Attributes.Contains("natural", "water"));
        }
        public void TestRelationMultipolygonAreaOneOuterTwoPartialInners()
        {
            var source = new MemorySnapshotDb(
                new Node()
            {
                Id        = 1,
                Latitude  = 0,
                Longitude = 0
            },
                new Node()
            {
                Id        = 2,
                Latitude  = 0,
                Longitude = 1
            },
                new Node()
            {
                Id        = 3,
                Latitude  = 1,
                Longitude = 1
            },
                new Node()
            {
                Id        = 4,
                Latitude  = 1,
                Longitude = 0
            },
                new Node()
            {
                Id        = 5,
                Latitude  = 0.25f,
                Longitude = 0.25f
            },
                new Node()
            {
                Id        = 6,
                Latitude  = 0.25f,
                Longitude = 0.40f
            },
                new Node()
            {
                Id        = 7,
                Latitude  = 0.40f,
                Longitude = 0.40f
            },
                new Node()
            {
                Id        = 8,
                Latitude  = 0.40f,
                Longitude = 0.25f
            },
                new Way()
            {
                Id    = 1,
                Nodes = new long[]
                {
                    1, 2, 3, 4, 1
                }
            },
                new Way()
            {
                Id    = 2,
                Nodes = new long[]
                {
                    5, 6, 7
                }
            },
                new Way()
            {
                Id    = 3,
                Nodes = new long[]
                {
                    7, 8, 5
                }
            },
                new Relation()
            {
                Id   = 1,
                Tags = new TagsCollection(
                    new Tag("type", "multipolygon")),
                Members = new RelationMember[]
                {
                    new RelationMember()
                    {
                        Id   = 1,
                        Role = "outer",
                        Type = OsmGeoType.Way
                    },
                    new RelationMember()
                    {
                        Id   = 2,
                        Role = "inner",
                        Type = OsmGeoType.Way
                    },
                    new RelationMember()
                    {
                        Id   = 3,
                        Role = "inner",
                        Type = OsmGeoType.Way
                    }
                }
            }).CreateSnapshotDb();

            var interpreter = new DefaultFeatureInterpreter();
            var features    = interpreter.Interpret(source.GetRelation(1), source);

            Assert.IsNotNull(features);
            Assert.AreEqual(1, features.Count);
            var feature = features[0];

            Assert.IsInstanceOf <Polygon>(feature.Geometry);
            Polygon polygon = feature.Geometry as Polygon;

            Assert.IsNotNull(polygon.Holes);
            Assert.AreEqual(1, polygon.Holes.Count());
            Assert.IsTrue(feature.Attributes.Contains("type", "multipolygon"));
        }