/// <summary> /// 读取shx索引信息 /// </summary> /// <param name="stream"></param> /// <returns></returns> private static List <ShxRecord> GetAllIndexRecords(Stream stream) { List <ShxRecord> records = new List <ShxRecord>(); try { stream.Position = 100; byte[] streamBuffer; do { streamBuffer = ShpUtil.ReadBytesFromStream(stream, 8); if (streamBuffer.Length < 8) { break; } else { ShxRecord myRecord = new ShxRecord(streamBuffer); records.Add(myRecord); } } while (streamBuffer.Length > 0); } catch { records.Clear(); } return(records); }
/// <summary> /// 打开shp、shx文件流 /// 读取shp、shx信息时需要首先执行此操作 /// 同时操作头文件读取和ShxRecord、ShpRecord示例化 /// </summary> /// <param name="ofs"></param> public void Open(Stream shpStream, Stream shxStream) { if (mShpFile != null) { Close(); } mShpFile = shpStream; mShxFile = shxStream; mShpFileReader = null; mShpFileWriter = null; mShxFileReader = null; mShxFileWriter = null; if (mShpFile.CanRead) { mShpFileReader = new BinaryReader(mShpFile); } if (mShpFile.CanWrite) { mShpFileWriter = new BinaryWriter(mShpFile); } if (mShxFile.CanRead) { mShxFileReader = new BinaryReader(mShxFile); } if (mShxFile.CanWrite) { mShxFileWriter = new BinaryWriter(mShxFile); } //reset position mRecordsReadCount = 0; //assume header is not written mHeaderWritten = false; //read the header if (shpStream.CanRead) { //try to read the header... try { mHeader.Read(mShpFileReader); mHeaderWritten = true; } catch (EndOfStreamException) { //could not read header, file is empty mHeader = new ShpHeader(); mHeaderWritten = false; } } if (mShpFile != null) { mIsReadOnly = !mShpFile.CanWrite; mIsForwardOnly = !mShpFile.CanSeek; } mShxRecord = new ShxRecord(mHeader); mShpRecord = new ShpRecord(mHeader); }
/// <summary> /// 写入shp /// </summary> /// <param name="wktList"></param> public void WriteShp(List <string> wktList) { if (mFileCreat) { mShpRecord.GetWKTInfo(wktList); mShxRecord = new ShxRecord(mShpRecord.Header); mHeader.Write(mShpFileWriter); mShxRecord.RecordDic = mShpRecord.Write(mShpFileWriter); } }
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); } } }