/// <summary>
        /// Create a new Shapefile object and open a Shapefile. Note that streams of three files are required -
        /// the main file (.shp), the index file (.shx) and the dBASE table (.dbf). The three files
        /// must all have the same filename (i.e. shapes.shp, shapes.shx and shapes.dbf).
        /// </summary>
        /// <param name="mainStream">Stream of .shp for this Shapefile</param>
        /// <param name="indexStream">Stream of .shx for this Shapefile</param>
        /// <param name="dbfStream">relative path of .dbf for this Shapefile</param>
        /// <exception cref="ObjectDisposedException">Thrown if the Shapefile has been disposed</exception>
        /// <exception cref="ArgumentNullException">Thrown if the path parameter is null</exception>
        /// <exception cref="ArgumentException">Thrown if the path parameter is empty</exception>
        /// <exception cref="InvalidOperationException">Thrown if an error occurs parsing file headers</exception>
        public void Open(Stream mainStream, Stream indexStream, Stream dbfStream)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException("Shapefile");
            }
            if (mainStream.Length < Header.HeaderLength)
            {
                throw new InvalidOperationException("Shapefile main file does not contain a valid header");
            }

            if (indexStream.Length < Header.HeaderLength)
            {
                throw new InvalidOperationException("Shapefile index file does not contain a valid header");
            }

            // read in and parse the headers
            byte[] headerBytes = new byte[Header.HeaderLength];

            _mainStream  = mainStream;
            _indexStream = indexStream;

            _mainStream.Read(headerBytes, 0, Header.HeaderLength);
            _mainHeader = new Header(headerBytes);
            _indexStream.Read(headerBytes, 0, Header.HeaderLength);
            _indexHeader = new Header(headerBytes);

            // set properties from the main header
            _type        = _mainHeader.ShapeType;
            _boundingBox = new RectangleD(_mainHeader.XMin, _mainHeader.YMin, _mainHeader.XMax, _mainHeader.YMax);

            // index header length is in 16-bit words, including the header - number of
            // shapes is the number of records (each 4 workds long) after subtracting the header bytes
            _count = (_indexHeader.FileLength - (Header.HeaderLength / 2)) / 4;

            dbfReader = new DBFReader(dbfStream, Encoding.ASCII);
            dbfReader.ResetReaderToEndOfHeader();
            // open the metadata database
            //OpenDb(dbfDirectory);

            _opened = true;
        }