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);
        }
示例#2
0
        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);
        }