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); } } }
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); } } }