private void AddPolygon(SdoGeometry sdoGeometry, IPolygon polygon)
        {
            int numInteriorRings        = polygon.NumInteriorRings;
            var info                    = new decimal[(numInteriorRings + 1) * 3];
            int ordinatesPreviousOffset = 0;

            if (sdoGeometry.OrdinatesArray != null)
            {
                ordinatesPreviousOffset = sdoGeometry.OrdinatesArray.Length;
            }
            int ordinatesOffset = ordinatesPreviousOffset + 1;
            var ordinates       = new decimal[] { };

            for (int i = 0; i < info.Length; i = i + 3)
            {
                ElementType  et;
                Coordinate[] coords;
                if (i == 0)
                {
                    et     = ElementType.EXTERIOR_RING_STRAIGHT_SEGMENTS;
                    coords = polygon.ExteriorRing.Coordinates;

                    // 1003: exterior polygon ring (must be specified in counterclockwise order)
                    if (!CGAlgorithms.IsCCW(coords))
                    {
                        coords = this.ReverseRing(coords);
                    }
                }
                else
                {
                    et     = ElementType.INTERIOR_RING_STRAIGHT_SEGMENTS;
                    coords = polygon.InteriorRings[i - 1].Coordinates;

                    // 2003: interior polygon ring (must be specified in clockwise order)
                    if (CGAlgorithms.IsCCW(coords))
                    {
                        coords = this.ReverseRing(coords);
                    }
                }
                //info.setElement(i, ordinatesOffset, et, 0);
                info[i + 0]     = ordinatesOffset;
                info[i + 1]     = et.EType();
                info[i + 2]     = et.Interpretation();
                ordinates       = this.ConvertAddCoordinates(ordinates, coords, sdoGeometry.Dimensionality, sdoGeometry.LRS > 0);
                ordinatesOffset = ordinatesPreviousOffset + ordinates.Length + 1;
            }
            sdoGeometry.addElement(info);
            sdoGeometry.AddOrdinates(ordinates);
        }
        private void AddPolygon(SdoGeometry sdoGeometry, IPolygon polygon)
        {
            int numInteriorRings = polygon.NumInteriorRings;

            double[] info            = new double[(numInteriorRings + 1) * 3];
            int      ordinatesOffset = 1;

            if (sdoGeometry.OrdinatesArray != null)
            {
                ordinatesOffset = sdoGeometry.OrdinatesArray.Length + 1;
            }
            double?[] ordinates = new double?[] { };
            for (int i = 0; i < info.Length; i++)
            {
                ElementType  et;
                Coordinate[] coords;
                if (i == 0)
                {
                    et     = ElementType.EXTERIOR_RING_STRAIGHT_SEGMENTS;
                    coords = polygon.ExteriorRing.Coordinates;
                    if (!CGAlgorithms.IsCCW(coords))
                    {
                        coords = ReverseRing(coords);
                    }
                }
                else
                {
                    et     = ElementType.INTERIOR_RING_STRAIGHT_SEGMENTS;
                    coords = polygon.InteriorRings[i - 1].Coordinates;
                    if (CGAlgorithms.IsCCW(coords))
                    {
                        coords = ReverseRing(coords);
                    }
                }
                //info.setElement(i, ordinatesOffset, et, 0);
                info[i + 0]     = ordinatesOffset;
                info[i + 1]     = (double)et;
                info[i + 2]     = 0;
                ordinates       = ConvertAddCoordinates(ordinates, coords, sdoGeometry.Dimensionality, sdoGeometry.LRS > 0);
                ordinatesOffset = ordinates.Length + 1;
            }
            sdoGeometry.addElement(info);
            sdoGeometry.AddOrdinates(ordinates);
        }
예제 #3
0
        private void AddPolygon(SdoGeometry sdoGeometry, IPolygon polygon, int dimention, int lrsPos)
        {
            int numInteriorRings = polygon.NumInteriorRings;

            int[] elements        = new int[(numInteriorRings + 1) * ElementTupleSize];
            int   ordinatesOffset = 1;

            ICoordinate[] coords;
            if (sdoGeometry.OrdinatesArray != null && sdoGeometry.OrdinatesArray.Length > 0)
            {
                ordinatesOffset = sdoGeometry.OrdinatesArray.Length + 1;
            }
            double[] ordinates = new double[] { };

            //addExterior
            elements[0] = ordinatesOffset;
            elements[1] = (int)SdoGeometryTypes.ETYPE_SIMPLE.POLYGON_EXTERIOR;
            elements[2] = 1;
            coords      = polygon.ExteriorRing.Coordinates;
            if (!CGAlgorithms.IsCCW(coords))
            {
                coords = ReverseRing(coords);
            }
            ordinates        = AppendCoordinates(ordinates, ConvertCoordinates(coords, dimention, HasLRS(lrsPos)));
            ordinatesOffset += ordinates.Length;
            //add holes
            for (int i = 0; i < numInteriorRings; i++)
            {
                coords = polygon.InteriorRings[i].Coordinates;
                if (CGAlgorithms.IsCCW(coords))
                {
                    coords = ReverseRing(coords);
                }


                elements[(i + 1) * ElementTupleSize + 0] = ordinatesOffset;
                elements[(i + 1) * ElementTupleSize + 1] = (int)SdoGeometryTypes.ETYPE_SIMPLE.POLYGON_INTERIOR;
                elements[(i + 1) * ElementTupleSize + 2] = 1;
                ordinates       = AppendCoordinates(ordinates, ConvertCoordinates(coords, dimention, HasLRS(lrsPos)));
                ordinatesOffset = ordinates.Length + 1;
            }
            sdoGeometry.AddElement(elements);
            sdoGeometry.AddOrdinates(ordinates);
        }