예제 #1
0
        protected virtual void TestCircle(double x, double y, double dist)
        {
            ICircle c   = ctx.MakeCircle(x, y, dist);
            String  msg = c.ToString();
            ICircle c2  = ctx.MakeCircle(ctx.MakePoint(x, y), dist);

            Assert.Equal(c, c2);
            Assert.Equal(c.GetHashCode(), c2.GetHashCode());

            Assert.Equal(/*msg,*/ dist > 0, c.HasArea);
            double area = c.GetArea(ctx);

            Assert.True(/*msg,*/ c.HasArea == (area > 0.0));
            IRectangle bbox = c.BoundingBox;

            Assert.Equal(/*msg,*/ dist > 0, bbox.GetArea(ctx) > 0);
            Assert.True(area <= bbox.GetArea(ctx));
            if (!ctx.IsGeo)
            {
                //if not geo then units of dist == units of x,y
                AssertEqualsRatio(msg, bbox.Height, dist * 2);
                AssertEqualsRatio(msg, bbox.Width, dist * 2);
            }
            AssertRelation(msg, SpatialRelation.CONTAINS, c, c.Center);
            AssertRelation(msg, SpatialRelation.CONTAINS, bbox, c);
        }
예제 #2
0
        protected virtual void TestRectangle(double minX, double width, double minY, double height)
        {
            double maxX = minX + width;
            double maxY = minY + height;

            minX = NormX(minX);
            maxX = NormX(maxX);

            IRectangle r = ctx.MakeRectangle(minX, maxX, minY, maxY);

            //test equals & hashcode of duplicate
            IRectangle r2 = ctx.MakeRectangle(minX, maxX, minY, maxY);

            Assert.Equal(r, r2);
            Assert.Equal(r.GetHashCode(), r2.GetHashCode());

            string msg = r.ToString();

            Assert.Equal(/*msg,*/ width != 0 && height != 0, r.HasArea);
            Assert.Equal(/*msg,*/ width != 0 && height != 0, r.GetArea(ctx) > 0);
            if (ctx.IsGeo && r.Width == 360 && r.Height == 180)
            {
                //whole globe
                double earthRadius = DistanceUtils.ToDegrees(1);
                CustomAssert.EqualWithDelta(4 * Math.PI * earthRadius * earthRadius, r.GetArea(ctx), 1.0);//1km err
            }

            AssertEqualsRatio(msg, height, r.Height);
            AssertEqualsRatio(msg, width, r.Width);
            IPoint center = r.Center;

            msg += " ctr:" + center;
            //System.out.println(msg);
            AssertRelation(msg, SpatialRelation.CONTAINS, r, center);

            IDistanceCalculator dc = ctx.DistCalc;
            double dUR             = dc.Distance(center, r.MaxX, r.MaxY);
            double dLR             = dc.Distance(center, r.MaxX, r.MinY);
            double dUL             = dc.Distance(center, r.MinX, r.MaxY);
            double dLL             = dc.Distance(center, r.MinX, r.MinY);

            Assert.Equal(/*msg,*/ width != 0 || height != 0, dUR != 0);
            if (dUR != 0)
            {
                Assert.True(dUR > 0 && dLL > 0);
            }
            AssertEqualsRatio(msg, dUR, dUL);
            AssertEqualsRatio(msg, dLR, dLL);
            if (!ctx.IsGeo || center.Y == 0)
            {
                AssertEqualsRatio(msg, dUR, dLL);
            }
        }
예제 #3
0
        public virtual void TestArea()
        {
            //simple bbox
            IRectangle        r      = RandomRectangle(20);
            NtsSpatialContext ctxNts = (NtsSpatialContext)ctx;
            NtsGeometry       rPoly  = ctxNts.MakeShape(ctxNts.GetGeometryFrom(r), false, false);

            CustomAssert.EqualWithDelta(r.GetArea(null), rPoly.GetArea(null), 0.0);
            CustomAssert.EqualWithDelta(r.GetArea(ctx), rPoly.GetArea(ctx), 0.000001);//same since fills 100%

            CustomAssert.EqualWithDelta(1300, POLY_SHAPE.GetArea(null), 0.0);

            //fills 27%
            CustomAssert.EqualWithDelta(0.27, POLY_SHAPE.GetArea(ctx) / POLY_SHAPE.BoundingBox.GetArea(ctx), 0.009);
            Assert.True(POLY_SHAPE.BoundingBox.GetArea(ctx) > POLY_SHAPE.GetArea(ctx));
        }
예제 #4
0
        public virtual void TestArea()
        {
            double radius = DistanceUtils.EARTH_MEAN_RADIUS_KM * DistanceUtils.KM_TO_DEG;
            //surface of a sphere is 4 * pi * r^2
            double earthArea = 4 * Math.PI * radius * radius;

            ICircle c = ctx.MakeCircle(random.Next(-180, 180), random.Next(-90, 90),
                                       180); //180 means whole earth

            CustomAssert.EqualWithDelta(earthArea, c.GetArea(ctx), 1.0);

            CustomAssert.EqualWithDelta(earthArea, ctx.WorldBounds.GetArea(ctx), 1.0);

            //now check half earth
            ICircle cHalf = ctx.MakeCircle(c.Center, 90);

            CustomAssert.EqualWithDelta(earthArea / 2, cHalf.GetArea(ctx), 1.0);

            //circle with same radius at +20 lat with one at -20 lat should have same area as well as bbox with same area
            ICircle c2 = ctx.MakeCircle(c.Center, 30);
            ICircle c3 = ctx.MakeCircle(c.Center.X, 20, 30);

            CustomAssert.EqualWithDelta(c2.GetArea(ctx), c3.GetArea(ctx), 0.01);
            ICircle c3Opposite = ctx.MakeCircle(c.Center.X, -20, 30);

            CustomAssert.EqualWithDelta(c3.GetArea(ctx), c3Opposite.GetArea(ctx), 0.01);
            CustomAssert.EqualWithDelta(c3.BoundingBox.GetArea(ctx), c3Opposite.BoundingBox.GetArea(ctx), 0.01);

            //small shapes near the equator should have similar areas to euclidean rectangle
            IRectangle smallRect = ctx.MakeRectangle(0, 1, 0, 1);

            CustomAssert.EqualWithDelta(1.0, smallRect.GetArea(null), 0.0);
            double smallDelta = smallRect.GetArea(null) - smallRect.GetArea(ctx);

            Assert.True(smallDelta > 0 && smallDelta < 0.0001);

            ICircle smallCircle = ctx.MakeCircle(0, 0, 1);

            smallDelta = smallCircle.GetArea(null) - smallCircle.GetArea(ctx);
            Assert.True(smallDelta > 0 && smallDelta < 0.0001);

            //bigger, but still fairly similar
            //c2 = ctx.makeCircle(c.getCenter(), 30);
            double areaRatio = c2.GetArea(null) / c2.GetArea(ctx);

            Assert.True(areaRatio > 1 && areaRatio < 1.1);
        }
예제 #5
0
        public virtual double GetArea(SpatialContext ctx)
        {
            double MAX_AREA = m_bbox.GetArea(ctx);
            double sum      = 0;

            foreach (Shapes.IShape geom in m_shapes)
            {
                sum += geom.GetArea(ctx);
                if (sum >= MAX_AREA)
                {
                    return(MAX_AREA);
                }
            }

            return(sum);
        }
예제 #6
0
 public override double Area(IRectangle rect)
 {
     return(rect.GetArea(null));
 }