/// <summary>
        /// Reads Polygon shapefile
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        protected IList ReadPolygonData(Stream stream)
        {
            IList list = new ArrayList();

            // Jump to first header
            stream.Seek(100, SeekOrigin.Begin);

            // Read big endian informations
            using (BigEndianBinaryReader beReader = new BigEndianBinaryReader(stream))
            {
                // Read little endian informations
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    // For each header
                    while (stream.Position < stream.Length)
                    {
                        ReadFeatureHeader(beReader);
                        shapeReader.ReadBoundingBox(reader);

                        int[] indexParts = null;
                        int   numParts   = shapeReader.ReadNumParts(reader);
                        int   numPoints  = shapeReader.ReadNumPoints(reader);

                        indexParts = shapeReader.ReadIndexParts(reader, numParts);
                        ICoordinate[] coordinates = shapeReader.ReadCoordinates(reader, numPoints);

                        if (numParts == 1)
                        {
                            list.Add(shapeReader.CreateSimpleSinglePolygon(coordinates));
                        }
                        else
                        {
                            list.Add(shapeReader.CreateSingleOrMultiPolygon(numPoints, indexParts, coordinates));
                        }
                    }
                }
            }
            return(list);
        }