Exemple #1
0
        private static GeoAPIPolygon FromPolygon(IPolygon geometry, GeoAPIGeometryFactory factory, bool copyUserData)
        {
            var shell = (GeoAPILinearRing)FromLineString(geometry.Shell, factory, copyUserData);

            GeoAPILinearRing[] holes = null;
            if (geometry.Holes != null && geometry.Holes.Length > 0)
            {
                holes = new GeoAPILinearRing[geometry.Holes.Length];
                for (var i = 0; i < holes.Length; i++)
                {
                    holes[i] = (GeoAPILinearRing)FromLineString(geometry.Holes[i], factory, copyUserData);
                }
            }
            return(factory.CreatePolygon(shell, holes));
        }
 private static GeoAPIPolygon FromPolygon(IPolygon geometry, GeoAPIGeometryFactory factory, bool copyUserData)
 {
     var shell = (GeoAPILinearRing)FromLineString(geometry.Shell, factory, copyUserData);
     GeoAPILinearRing[] holes = null;
     if (geometry.Holes != null && geometry.Holes.Length > 0)
     {
         holes = new GeoAPILinearRing[geometry.Holes.Length];
         for (var i = 0; i < holes.Length; i++)
             holes[i] = (GeoAPILinearRing)FromLineString(geometry.Holes[i], factory, copyUserData);
     }
     return factory.CreatePolygon(shell, holes);
 }
Exemple #3
0
        /// <summary>
        /// Creates a Polygon or MultiPolygon from this Polygon shape.
        /// </summary>
        /// <param name="shape">The shape to convert</param>
        /// <param name="factory">The geometry factory to use.</param>
        /// <param name="copyAttributes">A value indicating whether or not to copy the <see cref="Data.Shape.Attributes"/> to <see cref="GeoAPIGeometry.UserData"/></param>
        /// <returns>The geometry representing the converted shape.</returns>
        private static GeoAPIGeometry FromPolygonShape(Data.Shape shape, GeoAPIGeometryFactory factory, bool copyAttributes)
        {
            var shells = new List <GeoAPILinearRing>();
            var holes  = new List <GeoAPILinearRing>();

            foreach (var part in shape.Range.Parts)
            {
                var coords = new List <GeoAPICoordinate>();
                var i      = part.StartIndex;
                foreach (var d in part)
                {
                    var c = new GeoAPICoordinate(d.X, d.Y);
                    //if (shape.HasM()) c.M = M[i];
                    if (shape.HasZ())
                    {
                        c.Z = shape.Z[i];
                    }
                    i++;
                    coords.Add(c);
                }
                var ring = factory.CreateLinearRing(coords.ToArray());
                if (shape.Range.Parts.Count == 1)
                {
                    shells.Add(ring);
                }
                else
                {
                    if (NetTopologySuite.Algorithm.CGAlgorithms.IsCCW(ring.Coordinates))
                    {
                        holes.Add(ring);
                    }
                    else
                    {
                        shells.Add(ring);
                    }
                }
            }
            //// Now we have a list of all shells and all holes
            var holesForShells = new List <GeoAPILinearRing> [shells.Count];

            for (var i = 0; i < shells.Count; i++)
            {
                holesForShells[i] = new List <GeoAPILinearRing>();
            }

            // Find holes
            foreach (var testRing in holes)
            {
                GeoAPILinearRing minShell = null;
                GeoAPIEnvelope   minEnv   = null;
                var testEnv = testRing.EnvelopeInternal;
                var testPt  = testRing.Coordinates[0];
                for (int j = 0; j < shells.Count; j++)
                {
                    var tryRing = shells[j];
                    var tryEnv  = tryRing.EnvelopeInternal;
                    if (minShell != null)
                    {
                        minEnv = minShell.EnvelopeInternal;
                    }
                    var isContained = tryEnv.Contains(testEnv) &&
                                      (NetTopologySuite.Algorithm.CGAlgorithms.IsPointInRing(testPt, tryRing.Coordinates) ||
                                       (PointInList(testPt, tryRing.Coordinates)));

                    // Check if this new containing ring is smaller than the current minimum ring
                    if (isContained)
                    {
                        if (minShell == null || minEnv.Contains(tryEnv))
                        {
                            minShell = tryRing;
                        }
                        holesForShells[j].Add(testRing);
                    }
                }
            }

            var polygons = new GeoAPIPolygon[shells.Count];

            for (var i = 0; i < shells.Count; i++)
            {
                polygons[i] = factory.CreatePolygon(shells[i], holesForShells[i].ToArray());
            }

            if (polygons.Length == 1)
            {
                if (copyAttributes)
                {
                    polygons[0].UserData = shape.Attributes;
                }
                return(polygons[0]);
            }
            // It's a multi part
            var ret = factory.CreateMultiPolygon(polygons);

            if (copyAttributes)
            {
                ret.UserData = shape.Attributes;
            }
            return(ret);
        }