Ejemplo n.º 1
0
 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)
     });
 }
Ejemplo n.º 2
0
            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));
            }
Ejemplo n.º 3
0
 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));
     }
 }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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
            });
        }