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); }
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); } }
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)); }
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); }
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); }
public override double Area(IRectangle rect) { return(rect.GetArea(null)); }