Exemple #1
0
        public FileHeader ReadHeader()
        {
            using (var stream = MMFCache.GetFileReadItems(_FilePath)
                                .MMF.CreateViewStream(0, 100))
            {
                using (var brShapeIndex = new BinaryReader(stream))
                {
                    brShapeIndex.BaseStream.Seek(0, 0);
                    //Check file header
                    if (brShapeIndex.ReadInt32() != 170328064) //File Code is actually 9994, but in Little Endian Byte Order this is '170328064'
                    {
                        throw (new ApplicationException("Invalid Shapefile Index (.shx)"));
                    }

                    brShapeIndex.BaseStream.Seek(24, 0);                              //seek to File Length
                    int IndexFileSize = Util.SwapByteOrder(brShapeIndex.ReadInt32()); //Read filelength as big-endian. The length is based on 16bit words
                    //int IndexFileSize = brShapeIndex.ReadInt32(); //Read filelength as big-endian. The length is based on 16bit words
                    //_RecordCount = (2 * IndexFileSize - 100) / 8; //Calculate FeatureCount. Each feature takes up 8 bytes. The header is 100 bytes

                    var version = brShapeIndex.ReadInt32();


                    // brShapeIndex.BaseStream.Seek(32, 0); //seek to ShapeType
                    var shapeType = brShapeIndex.ReadInt32();

                    //Read the spatial bounding box of the contents
                    brShapeIndex.BaseStream.Seek(36, 0); //seek to box


                    double x1, x2, y1, y2;
                    x1 = brShapeIndex.ReadDouble();
                    y1 = brShapeIndex.ReadDouble();
                    x2 = brShapeIndex.ReadDouble();
                    y2 = brShapeIndex.ReadDouble();

                    var mBR        = new Envelope(x1, x2, y1, y2);
                    var fileHeader = new FileHeader(IndexFileSize, version, shapeType, mBR);
                    return(fileHeader);
                }
            }
        }
        public ShxRecord[] ReadRecordes(int startRecIndex, int count)
        {
            using (var stream = MMFCache.GetFileReadItems(_FilePath)
                                .MMF.CreateViewStream(100 + startRecIndex * 8, count * 8))

            {
                using (var brShapeIndex = new BinaryReader(stream))
                {
                    var records = new ShxRecord[count];

                    for (int i = 0; i < count; i++)
                    {
                        int offset  = 2 * Util.SwapByteOrder(brShapeIndex.ReadInt32()); // word to byte
                        int cLength = 2 * Util.SwapByteOrder(brShapeIndex.ReadInt32());

                        records[i] = new ShxRecord(offset, cLength);
                    }
                    return(records);
                }
            }
        }
Exemple #3
0
        public FeatureLite ReaderShape(int recHeaderPos, int recCLength)
        {
            using (var stream = MMFCache.GetFileReadItems(_FilePath)
                                .MMF.CreateViewStream(recHeaderPos, recCLength + HEADER_LENGTH))
            {
                using (var brReader = new BinaryReader(stream))
                {
                    FeatureLite fl;

                    int fID     = Util.SwapByteOrder(brReader.ReadInt32());
                    int clength = Util.SwapByteOrder(brReader.ReadInt32());

                    ShapeType shapeType = (ShapeType)brReader.ReadInt32();  // 4

                    if (shapeType == ShapeType.Point)
                    {
                        fl = new FeatureLite(fID, shapeType
                                             , brReader.ReadDouble(), brReader.ReadDouble());
                    }
                    else
                    {
                        double xMin = brReader.ReadDouble();
                        double yMin = brReader.ReadDouble();
                        double xMax = brReader.ReadDouble();
                        double yMax = brReader.ReadDouble();// 8*4=32

                        Envelope mbr = new Envelope(xMin, xMax, yMin, yMax);

                        var shapeBytes = new byte[clength - 36];  // 4+32=36
                        brReader.BaseStream.Seek(36, 0);
                        brReader.Read(shapeBytes, 0, clength - 36);
                        fl = new FeatureLite(fID, shapeType, mbr, shapeBytes);
                    }
                    return(fl);
                }
            }
        }