public BoundingBox3D GetUnion(BoundingBox3D first, BoundingBox3D second) { var bb1 = IndexBoundingBox.Union(first.Item1, second.Item1); var bb2 = IndexBoundingBox.Union(first.Item2, second.Item2); var bb3 = IndexBoundingBox.Union(first.Item3, second.Item3); return(new BoundingBox3D(bb1, bb2, bb3)); }
protected DataDomain CalcDataDomain(ICellRequest[] cells, ITimeAxisBoundingBoxCalculator timeBBcalc, ISpatGridBoundingBoxCalculator latBBcalc, ISpatGridBoundingBoxCalculator lonBBcalc) { if (cells.Length == 0) { throw new ArgumentException("cells array must contain elements"); } string variable = cells[0].VariableName; //calculating bounding box IndexBoundingBox timeBB = new IndexBoundingBox(); IndexBoundingBox latBB = new IndexBoundingBox(); IndexBoundingBox lonBB = new IndexBoundingBox(); Stopwatch bbCalc = Stopwatch.StartNew(); ts.TraceEvent(TraceEventType.Start, 1, "Calculating bounding box"); var cellArray = cells.ToArray(); foreach (var geoCellTuple in cellArray) { IndexBoundingBox timeBB2 = timeBBcalc.GetBoundingBox(geoCellTuple.Time); IndexBoundingBox latBB2 = latBBcalc.GetBoundingBox(geoCellTuple.LatMin, geoCellTuple.LatMax); IndexBoundingBox lonBB2 = lonBBcalc.GetBoundingBox(geoCellTuple.LonMin, geoCellTuple.LonMax); timeBB = IndexBoundingBox.Union(timeBB, timeBB2); latBB = IndexBoundingBox.Union(latBB, latBB2); lonBB = IndexBoundingBox.Union(lonBB, lonBB2); } bbCalc.Stop(); ts.TraceEvent(TraceEventType.Stop, 1, string.Format("Bounding box calculated in {0}", bbCalc.Elapsed)); if (timeBB.IsSingular || latBB.IsSingular || lonBB.IsSingular) { ts.TraceEvent(TraceEventType.Information, 4, "Bounding box is singular. (all cells are out of the data) Returning NoData"); return(null); } else { ts.TraceEvent(TraceEventType.Information, 5, string.Format("{0} elements in bounding box", (timeBB.last - timeBB.first + 1) * (latBB.last - latBB.first + 1) * (lonBB.last - lonBB.first + 1))); } var dataDomain = ConstructDataDomain(variable, metadata, lonBB, latBB, timeBB); return(dataDomain); }