/// <summary> /// /// </summary> /// <param name="geom"></param> /// <returns></returns> private static ICoordinate[] ExtractCoordinates(IGeometry geom) { UniqueCoordinateArrayFilter filter = new UniqueCoordinateArrayFilter(); geom.Apply(filter); return(filter.Coordinates); }
public void TestFilter() { var g = Read("MULTIPOINT(10 10, 20 20, 30 30, 20 20, 10 10)"); var f = new UniqueCoordinateArrayFilter(); g.Apply(f); Assert.That(f.Coordinates.Length, Is.EqualTo(3)); Assert.That(f.Coordinates[0], Is.EqualTo(new Coordinate(10, 10))); Assert.That(f.Coordinates[1], Is.EqualTo(new Coordinate(20, 20))); Assert.That(f.Coordinates[2], Is.EqualTo(new Coordinate(30, 30))); }
public void testUniqueCoordinateArrayFilter() { var g = reader.Read( "MULTIPOINT(10 10, 20 20, 30 30, 20 20, 10 10)"); var f = new UniqueCoordinateArrayFilter(); g.Apply(f); Assert.AreEqual(3, f.Coordinates.Length); Assert.AreEqual(new Coordinate(10, 10), f.Coordinates[0]); Assert.AreEqual(new Coordinate(20, 20), f.Coordinates[1]); Assert.AreEqual(new Coordinate(30, 30), f.Coordinates[2]); }
/// <summary> /// Gets the convex hull for the given geometry. /// </summary> /// <param name="geometry"></param> /// <returns></returns> public Geometry GetConvexHull(Geometry geometry) { this._geometry = geometry; UniqueCoordinateArrayFilter filter = new UniqueCoordinateArrayFilter(); geometry.Apply(filter); Coordinates pts = filter.GetCoordinates(); if (pts.Count == 0) { return(new GeometryCollection(new Geometry[] {}, geometry.PrecisionModel, geometry.GetSRID())); } if (pts.Count == 1) { return(new Point(pts[0], geometry.PrecisionModel, geometry.GetSRID())); } if (pts.Count == 2) { return(new LineString(pts, geometry.PrecisionModel, geometry.GetSRID())); } // sort points for Graham scan. Coordinates pspts; if (pts.Count > 10) { //Probably should be somewhere between 50 and 100? Coordinates rpts = Reduce(pts); pspts = PreSort(rpts); } else { pspts = PreSort(pts); } // Use Graham scan to find convex hull. Stack cHS = GrahamScan(pspts); // Convert stack to an array. Coordinates cH = ToCoordinateArray(cHS); // Convert array to linear ring. //awcreturn lineOrPolygon(cH); return(LineOrPolygon(cH)); }
/// <summary> /// Create a new convex hull construction for the input <see cref="Coordinate" /> array. /// </summary> /// <param name="pts"></param> /// <param name="geomFactory"></param> public ConvexHull(Coordinate[] pts, IGeometryFactory geomFactory) { // _inputPts = pts; _inputPts = UniqueCoordinateArrayFilter.FilterCoordinates(pts); _geomFactory = geomFactory; }