コード例 #1
0
ファイル: ConvexHull.cs プロジェクト: yangkf1985/DotSpatial
        /// <summary>
        ///
        /// </summary>
        /// <param name="geom"></param>
        /// <returns></returns>
        private static ICoordinate[] ExtractCoordinates(IGeometry geom)
        {
            UniqueCoordinateArrayFilter filter = new UniqueCoordinateArrayFilter();

            geom.Apply(filter);
            return(filter.Coordinates);
        }
コード例 #2
0
        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)));
        }
コード例 #3
0
        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]);
        }
コード例 #4
0
        /// <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));
        }
コード例 #5
0
 /// <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;
 }