private long GetHeaderSizeAndFileLength(FileStream fsMainFile, BinaryReader brMainFile, out int fileLength) { //FileCode int fileCode = ToLocalEndian.ToInt32FromBig(brMainFile.ReadBytes(4)); if (fileCode != 9994) { throw new Exception("文件不是ESRI Shape Files文件头!"); } //Skip 20 bytes unused (5 integer) brMainFile.ReadBytes(20); //File length fileLength = ToLocalEndian.ToInt32FromBig(brMainFile.ReadBytes(4)) * 2; if (fileLength != fsMainFile.Length) { throw new Exception("ESRI Shape Files文件未正确结束!"); } //Version int Version = ToLocalEndian.ToInt32FromLittle(brMainFile.ReadBytes(4)); //Shape Type int ShapeType = ToLocalEndian.ToInt32FromLittle(brMainFile.ReadBytes(4)); // Envelope evp = new Envelope(); evp.MinX = ToLocalEndian.ToDouble64FromLittle(brMainFile.ReadBytes(8)); evp.MinY = ToLocalEndian.ToDouble64FromLittle(brMainFile.ReadBytes(8)); evp.MaxX = ToLocalEndian.ToDouble64FromLittle(brMainFile.ReadBytes(8)); evp.MaxY = ToLocalEndian.ToDouble64FromLittle(brMainFile.ReadBytes(8)); //Skip minZ,maxZ,minM,maxM brMainFile.ReadBytes(8 * 4); return(fsMainFile.Position); }
private void ReadHeader() { //FileCode int fileCode = ToLocalEndian.ToInt32FromBig(_brMainFile.ReadBytes(4)); if (fileCode != 9994) { throw new Exception("文件不是ESRI Shape Files文件头!"); } //Skip 20 bytes unused (5 integer) _brMainFile.ReadBytes(20); //File length _fileLength = ToLocalEndian.ToInt32FromBig(_brMainFile.ReadBytes(4)) * 2; if (_fileLength != _fsMainFile.Length) { throw new Exception("ESRI Shape Files文件未正确结束!"); } //Version int Version = ToLocalEndian.ToInt32FromLittle(_brMainFile.ReadBytes(4)); //Shape Type int ShapeType = ToLocalEndian.ToInt32FromLittle(_brMainFile.ReadBytes(4)); _shapeType = (enumShapeType)ShapeType; _envelope.MinX = ToLocalEndian.ToDouble64FromLittle(_brMainFile.ReadBytes(8)); _envelope.MinY = ToLocalEndian.ToDouble64FromLittle(_brMainFile.ReadBytes(8)); _envelope.MaxX = ToLocalEndian.ToDouble64FromLittle(_brMainFile.ReadBytes(8)); _envelope.MaxY = ToLocalEndian.ToDouble64FromLittle(_brMainFile.ReadBytes(8)); AdjustZeroWidthEnvelope(_envelope); //Skip minZ,maxZ,minM,maxM _brMainFile.ReadBytes(8 * 4); _fileHeaderSize = _fsMainFile.Position; }
private object ConstructPoint(BinaryReader br, int oid) { ShapePoint pt = new ShapePoint(ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)) ); Feature f = new Feature(oid, pt, GetFieldNames(), GetFieldValues(oid), GetAnnotation(oid)); return(f); }
private int GetPointCountByPolygon(FileStream fs, BinaryReader br, int oid) { Envelope evp = new Envelope(ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8))); int nParts = ToLocalEndian.ToInt32FromLittle(br.ReadBytes(4)); int nPoints = ToLocalEndian.ToInt32FromLittle(br.ReadBytes(4)); //fs.Seek(nParts * 4, SeekOrigin.Current); //fs.Seek(nPoints * 2 * 8, SeekOrigin.Current); return(nPoints); }
private object ConstructMultiPoint(BinaryReader br, int oid) { int pointCount = ToLocalEndian.ToInt32FromLittle(br.ReadBytes(4)); ShapePoint[] pts = new ShapePoint[pointCount]; for (int i = 0; i < pts.Length; i++) { pts[i] = new ShapePoint(ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8))); } ShapeMultiPoint multiPoint = new ShapeMultiPoint(pts); Feature f = new Feature(oid, multiPoint, GetFieldNames(), GetFieldValues(oid), GetAnnotation(oid)); return(f); }
private object ConstructPolylineM(BinaryReader br, int oid) { Envelope evp = new Envelope(ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8))); int nParts = ToLocalEndian.ToInt32FromLittle(br.ReadBytes(4)); int nPoints = ToLocalEndian.ToInt32FromLittle(br.ReadBytes(4)); int[] firstPoints = new int[nParts]; for (int i = 0; i < nParts; i++) { firstPoints[i] = ToLocalEndian.ToInt32FromLittle(br.ReadBytes(4)); } ShapePoint[] pts = new ShapePoint[nPoints]; for (int i = 0; i < nPoints; i++) { pts[i] = new ShapePoint(ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8)), ToLocalEndian.ToDouble64FromLittle(br.ReadBytes(8))); } //ShapeLineString ShapeLineString[] Lines = new ShapeLineString[nParts]; for (int i = 0; i < nParts; i++) { int bIdx = firstPoints[i]; int eIdx = 0; if (nParts == 1 || i == nParts - 1) { eIdx = nPoints; } else { eIdx = firstPoints[i + 1]; } ShapePoint[] rpts = new ShapePoint[eIdx - bIdx]; for (int j = bIdx; j < eIdx; j++) { rpts[j - bIdx] = pts[j]; } Lines[i] = new ShapeLineString(rpts); } // br.ReadBytes(2 * 8); //M Range br.ReadBytes(nPoints * 8); //M Array // ShapePolyline ply = new ShapePolyline(Lines, evp); Feature f = new Feature(oid, ply, GetFieldNames(), GetFieldValues(oid), GetAnnotation(oid)); return(f); }