public static IndexBoundingBox Union(IndexBoundingBox fst, IndexBoundingBox snd) { return(new IndexBoundingBox() { first = Math.Min(fst.first, snd.first), last = Math.Max(fst.last, snd.last) }); }
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)); }
private IEnumerable <BoundingBox3D> ConvertToBoundingBox3D(IEnumerable <IGeoCell> cells) { foreach (var geoCellTuple in cells) { IndexBoundingBox timeBB = timeAxisBBcalc.GetBoundingBox(geoCellTuple.Time); IndexBoundingBox latBB = latAxisBBcalc.GetBoundingBox(geoCellTuple.LatMin, geoCellTuple.LatMax); IndexBoundingBox lonBB = lonAxisBBcalc.GetBoundingBox(geoCellTuple.LonMin, geoCellTuple.LonMax); yield return(new BoundingBox3D(timeBB, latBB, lonBB)); } }
public IndexBoundingBox GetBoundingBox(double min, double max) { IndexBoundingBox sortedIBB = dataMaskProvider.GetBoundingBox(grid, min, max); if (areLatsInverted && !sortedIBB.IsSingular) { int len = grid.Length; return(new IndexBoundingBox() { first = backIndexOffset - sortedIBB.last, last = backIndexOffset - sortedIBB.first }); } else { return(sortedIBB); } }
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); }
private DataDomain ConstructDataDomain(string variable, IGridDataSetMetaData dataSetInfo, IndexBoundingBox lonBB, IndexBoundingBox latBB, IndexBoundingBox timeBB) { int[] origin = null, shape = null; int varaibleRank = dataSetInfo.GetVariableRank(variable); if (varaibleRank > 3) { throw new InvalidOperationException("Variables with rank >3 are not supported"); } origin = new int[varaibleRank]; shape = new int[varaibleRank]; int latDimNum = dataSetInfo.GetLatitudeDim(variable); int lonDimNum = dataSetInfo.GetLongitudeDim(variable); int timeDimNum = dataSetInfo.GetTimeDim(variable); origin[latDimNum] = latBB.first; shape[latDimNum] = latBB.last - latBB.first + 1; if (latDimNum != lonDimNum) { origin[lonDimNum] = lonBB.first; shape[lonDimNum] = lonBB.last - lonBB.first + 1; } if (timeDimNum != -1) { origin[timeDimNum] = timeBB.first; shape[timeDimNum] = timeBB.last - timeBB.first + 1; } return(new DataDomain() { Origin = origin, Shape = shape }); }