예제 #1
0
        public Record <T> GetShape <T>(string sourceName, BaseShapeParser <T> parser, ShapeIndex index)
        {
            using (BinaryReader reader = new BinaryReader(File.OpenRead(sourceName + ".shp")))
            {
                byte[] bytesHeader = new byte[8];
                byte[] bytesRecord = new byte[2 * index.ContentLength];
                reader.BaseStream.Seek(2 * index.Offset, SeekOrigin.Begin);
                reader.Read(bytesHeader, 0, 8);
                var recordNumber  = ReadInt(bytesHeader, 0, false);
                var contentLength = ReadInt(bytesHeader, 4, false);

                reader.Read(bytesRecord, 0, 2 * index.ContentLength);
                T          shape  = parser.Parse(bytesRecord, ReadInt, ReadDouble);
                Record <T> record = new Record <T>(recordNumber, shape, index.Metadatas);
                return(record);
            }
        }
예제 #2
0
        public List <T> ParseShp <T>(string shp, BaseShapeParser <T> parser)
        {
            List <T> shapes = new List <T>();

            using (BinaryReader reader = new BinaryReader(File.OpenRead(shp)))
            {
                byte[] headerArray     = new byte[100];
                int    read            = reader.Read(headerArray, 0, 100);
                var    fileCode        = ReadInt(headerArray, 0, false);
                var    fileLength      = ReadInt(headerArray, 24, false);
                var    version         = ReadInt(headerArray, 28, true);
                var    globalShapeType = ReadInt(headerArray, 32, true);
                var    xMin            = ReadDouble(headerArray, 36, true);
                var    yMin            = ReadDouble(headerArray, 44, true);
                var    xMax            = ReadDouble(headerArray, 52, true);
                var    yMax            = ReadDouble(headerArray, 60, true);
                var    zMin            = ReadDouble(headerArray, 68, true);
                var    zMax            = ReadDouble(headerArray, 76, true);
                var    mMin            = ReadDouble(headerArray, 84, true);
                var    mMax            = ReadDouble(headerArray, 92, true);

                if (globalShapeType != (int)parser.GeometryType)
                {
                    throw new InvalidOperationException($"Invalid record shape type : expected {parser.GeometryType} but found {globalShapeType}");
                }
                byte[] recordHeader = new byte[8];
                while (reader.Read(recordHeader, 0, 8) != 0)
                {
                    var recordNumber  = ReadInt(recordHeader, 0, false);
                    var contentLength = ReadInt(recordHeader, 4, false);

                    byte[] recordContent = new byte[2 * contentLength];
                    reader.Read(recordContent, 0, 2 * contentLength);
                    var recordShapeType = ReadInt(recordContent, 0, true);

                    shapes.Add(parser.Parse(recordContent, new ReadIntDelegate(ReadInt), new ReadDoubleDelegate(ReadDouble)));
                }
            }

            return(shapes);
        }