private SbnFeature[] ReadBins(int nid, SbnBinIndex binIndex) { var numFeatures = binIndex.GetNumFeatures(nid); var res = new SbnFeature[numFeatures]; if (numFeatures == 0) { return(res); } var firstBinIndex = binIndex.GetFirstBinIndex(nid); var numBins = (int)Math.Ceiling(numFeatures / 100d); for (var i = 0; i < numBins; i++) { using (var ms = new BinaryReader(new MemoryStream(_tree.GetBinData(firstBinIndex + i)))) { var bin = new SbnBin(); var binId = bin.Read(ms); if (binId != firstBinIndex + i) { throw new SbnException("Corrupt sbn file"); } bin.CopyTo(res, i * 100); } } return(res); }
/// <summary> /// Creates an istance of this class /// </summary> /// <param name="sbnFilename"></param> /// <param name="sbxFilename"></param> private SbnQueryOnlyTree(string sbnFilename, string sbxFilename) { _sbnStream = new FileStream(sbnFilename, FileMode.Open, FileAccess.Read, FileShare.Read, 8192); _sbnHeader = new SbnHeader(); var sbnReader = new BinaryReader(_sbnStream); _sbnHeader.Read(sbnReader); _sbnBinIndex = SbnBinIndex.Read(sbnReader); _sbxStream = new FileStream(sbxFilename, FileMode.Open, FileAccess.Read, FileShare.Read, 8192); FirstLeafNodeId = (int)Math.Pow(2, GetNumberOfLevels(_sbnHeader.NumRecords) - 1); MaxCacheLevel = DefaultMaxCacheLevel; SbnQueryOnlyNode.CreateRoot(this); _sbxStream.Position = 0; }