internal static SbnBinIndex Read(BinaryReader reader) { if (BinaryIOExtensions.ReadInt32BE(reader) != 1) { throw new SbnException("Sbn file corrupt"); } var length = BinaryIOExtensions.ReadInt32BE(reader); var maxNodeId = length / 4; var nodeToBin = new SbnNodeToBinIndexEntry[maxNodeId + 1]; for (var i = 1; i <= maxNodeId; i++) { var binIndex = BinaryIOExtensions.ReadInt32BE(reader); var numFeatures = BinaryIOExtensions.ReadInt32BE(reader); if (binIndex > 0) { nodeToBin[i] = new SbnNodeToBinIndexEntry { FirstBinIndex = binIndex, NumFeatures = numFeatures } } ; } return(new SbnBinIndex(nodeToBin)); }
/// <summary> /// Method to read the index header using the provided reader /// </summary> /// <param name="reader">The reader to use</param> public void Read(BinaryReader reader) { var fileCode = BinaryIOExtensions.ReadInt32BE(reader); var fileCodeIndex = BinaryIOExtensions.ReadInt32BE(reader); if (fileCode != FileCode || fileCodeIndex != FileCodeIndex) { throw new SbnException("Not a Shapefile index file"); } reader.BaseStream.Seek(16, SeekOrigin.Current); FileLength = BinaryIOExtensions.ReadInt32BE(reader) * 2; NumRecords = BinaryIOExtensions.ReadInt32BE(reader); var minX = BinaryIOExtensions.ReadDoubleBE(reader); var minY = BinaryIOExtensions.ReadDoubleBE(reader); XRange = Interval.Create(minX, BinaryIOExtensions.ReadDoubleBE(reader)); YRange = Interval.Create(minY, BinaryIOExtensions.ReadDoubleBE(reader)); ZRange = Interval.Create(BinaryIOExtensions.ReadDoubleBE(reader), BinaryIOExtensions.ReadDoubleBE(reader)); MRange = Interval.Create(BinaryIOExtensions.ReadDoubleBE(reader), BinaryIOExtensions.ReadDoubleBE(reader)); reader.BaseStream.Seek(4, SeekOrigin.Current); }
/// <summary> /// Method to read a bin /// </summary> /// <param name="reader">The reader to use</param> internal int Read(BinaryReader reader) { var bid = BinaryIOExtensions.ReadInt32BE(reader); NumFeatures = BinaryIOExtensions.ReadInt32BE(reader) / 4; ReadBuffer(reader); return(bid); }
/// <summary> /// Creates the tree reading data from the <paramref name="reader"/> /// </summary> /// <param name="reader">The reader to use</param> private SbnTree(BinaryReader reader) { Monitor.Enter(_syncRoot); _header = new SbnHeader(); _header.Read(reader); BuildTree(_header.NumRecords); if (BinaryIOExtensions.ReadUInt32BE(reader) != 1) { throw new SbnException("Invalid format, expecting 1"); } var maxNodeId = BinaryIOExtensions.ReadInt32BE(reader) / 4; var ms = new MemoryStream(reader.ReadBytes(maxNodeId * 8)); using (var msReader = new BinaryReader(ms)) { var indexNodeId = 1; while (msReader.BaseStream.Position < msReader.BaseStream.Length) { var nid = BinaryIOExtensions.ReadInt32BE(msReader); var featureCount = BinaryIOExtensions.ReadInt32BE(msReader); if (nid > 1) { var node = Nodes[indexNodeId]; while (node.FeatureCount < featureCount) { var bin = new SbnBin(); bin.Read(reader); node.AddBin(bin, true); } Debug.Assert(node.VerifyBins()); } indexNodeId++; } } //Gather all feature ids GatherFids(); //Assertions Debug.Assert(reader.BaseStream.Position == reader.BaseStream.Length); Debug.Assert(_featureIds.Count == _header.NumRecords); Monitor.Exit(_syncRoot); }
private byte[] GetBinData(int binIndex) { binIndex--; Monitor.Enter(_indexLock); _sbxStream.Seek(100 + binIndex * 8, SeekOrigin.Begin); var sbxReader = new BinaryReader(_sbxStream); var sbnPosition = BinaryIOExtensions.ReadUInt32BE(sbxReader) * 2; var sbnSize = 8 + BinaryIOExtensions.ReadInt32BE(sbxReader) * 2; _sbnStream.Seek(sbnPosition, SeekOrigin.Begin); var res = new byte[sbnSize]; _sbnStream.Read(res, 0, sbnSize); Monitor.Exit(_indexLock); return(res); }
/// <summary> /// Method to describe the tree's content /// </summary> /// <param name="sbnTree"></param> /// <param name="writer"></param> public static void SbnToText(string sbnTree, TextWriter writer) { using (var br = new BinaryReader(File.OpenRead(sbnTree))) { // header var header = new SbnHeader(); header.Read(br); writer.WriteLine(header.ToString()); // Bin header writer.WriteLine("[BinHeader]"); if (BinaryIOExtensions.ReadUInt32BE(br) != 1) { throw new SbnException("Invalid format, expecting 1"); } var maxNodeId = BinaryIOExtensions.ReadInt32BE(br) / 4; writer.WriteLine("#1, {0} => MaxNodeId = {1}", maxNodeId * 4, maxNodeId); var ms = new MemoryStream(br.ReadBytes(maxNodeId * 8)); using (var msReader = new BinaryReader(ms)) { var index = 2; while (msReader.BaseStream.Position < msReader.BaseStream.Length) { writer.WriteLine("#{2}, Index {0}, NumFeatures={1}", BinaryIOExtensions.ReadInt32BE(msReader), BinaryIOExtensions.ReadInt32BE(msReader), index++); } } writer.WriteLine("[Bins]"); while (br.BaseStream.Position < br.BaseStream.Length) { var bin = new SbnBin(); var binId = bin.Read(br); writer.Write("[SbnBin {0}: {1}]\n", binId, bin.NumFeatures); for (var i = 0; i < bin.NumFeatures; i++) { writer.WriteLine(" " + bin[i]); } } } writer.Flush(); }