Exemple #1
0
        public void LineWrite(VectorFeature feat, double[] fractionalpt, double distance)
        {
            // Get the row and col of the cell we're looking for
            int[] rowcol = OpExtent.Pt2RowCol(fractionalpt);

            int fid = (int)feat.Feat.GetFID();

            List <string> csvRows = new List <string>();

            double finalDist = Math.Round(distance, _spacingDecimals);

            // Now we write a line to the file
            List <string> csvcols = new List <string>();

            foreach (ECols item in header)
            {
                switch (item)
                {
                case (ECols.FID): csvcols.Add(fid.ToString(CultureInfo.InvariantCulture)); break;

                case (ECols.X): csvcols.Add((fractionalpt[0]).ToString(CultureInfo.InvariantCulture)); break;

                case (ECols.Y): csvcols.Add((fractionalpt[1]).ToString(CultureInfo.InvariantCulture)); break;

                case (ECols.DISTANCE): if (!String.IsNullOrEmpty(sFieldName))
                    {
                        csvcols.Add(feat.GetFieldAsDouble(sFieldName).ToString(CultureInfo.InvariantCulture));
                    }
                    break;

                case (ECols.STATION): csvcols.Add((finalDist).ToString(CultureInfo.InvariantCulture)); break;
                }
            }
            for (int did = 0; did < _inputRasters.Count; did++)
            {
                if (rowcol[1] > 0 && rowcol[1] < _inputRasters[did].Extent.Cols &&
                    rowcol[0] > 0 && rowcol[0] < _inputRasters[did].Extent.Rows)
                {
                    T[] _buffer = new T[1];
                    _inputRasters[did].Read(rowcol[1], rowcol[0], 1, 1, _buffer);
                    if (_buffer[0].Equals(inNodataVals[did]))
                    {
                        csvcols.Add("");
                    }
                    else
                    {
                        csvcols.Add(DynamicMath.invariantString(_buffer[0]));
                    }
                }
                else
                {
                    csvcols.Add("");
                }
            }
            csvRows.Add(String.Join(",", csvcols));
            WriteLinesToCSV(csvRows);
        }
Exemple #2
0
 public void NumDecimalsTest()
 {
     Assert.AreEqual(DynamicMath.NumDecimals(2.1231m), 4);
     Assert.AreEqual(DynamicMath.NumDecimals(52352342.1231m), 4);
     Assert.AreEqual(DynamicMath.NumDecimals(52352342.12310m), 4);
     Assert.AreEqual(DynamicMath.NumDecimals(10000), 0);
     Assert.AreEqual(DynamicMath.NumDecimals(3), 0);
     Assert.AreEqual(DynamicMath.NumDecimals(3.0m), 0);
     Assert.AreEqual(DynamicMath.NumDecimals(0.00000106103m), 11);
     Debug.WriteLine("done");
 }
Exemple #3
0
        public void SafeDivisionTest()
        {
            decimal dec1 = 0.7m;
            decimal dec2 = 0.025m;

            Length l1 = Length.FromMeters((double)dec1);
            Length l2 = Length.FromMeters((double)dec2);

            Area a1 = Area.FromSquareMeters((double)dec1);
            Area a2 = Area.FromSquareMeters((double)dec2);

            Volume v1 = Volume.FromCubicMeters((double)dec1);
            Volume v2 = Volume.FromCubicMeters((double)dec2);

            Assert.AreEqual(DynamicMath.SafeDivision(dec1, dec2), 28.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(l1, l2), 28.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(a1, a2), 28.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(v1, v2), 28.0m);

            Assert.AreEqual(DynamicMath.SafeDivision(v1, a2).Meters, 28.0);
            Assert.AreEqual(DynamicMath.SafeDivision(a1, l2).Meters, 28.0);
            Assert.AreEqual(DynamicMath.SafeDivision(v1, l2).SquareMeters, 28.0);

            // Edge Cases (Very big numbers)
            Assert.AreEqual(DynamicMath.SafeDivision(decimal.MaxValue, decimal.MinValue), -1.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(decimal.MaxValue, decimal.MaxValue), 1.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(decimal.MinValue, decimal.MinValue), 1.0m);

            Area za0 = Area.FromSquareMeters(1.0);
            Area za1 = Area.FromSquareMeters((double)decimal.MaxValue);
            Area za2 = Area.FromSquareMeters((double)decimal.MinValue);

            Assert.AreEqual(DynamicMath.SafeDivision(za0, za1), 0.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(za1, za1), 1.0m);
            Assert.AreEqual(DynamicMath.SafeDivision(za1, za2), -1.0m);

            // Now do very small numbers
            Area zsm1 = Area.FromSquareMeters((double)(1 / decimal.MaxValue));
            Area zsm2 = Area.FromSquareMeters((double)(1 / decimal.MinValue));

            Assert.AreEqual(DynamicMath.SafeDivision(za0, zsm1), decimal.MaxValue); // 1/0 case
            Assert.AreEqual(DynamicMath.SafeDivision(za0, zsm2), decimal.MaxValue); // 1/0 case
            Assert.AreEqual(DynamicMath.SafeDivision(zsm1, zsm1), 0);               // triggers the 0/0 case
            Assert.AreEqual(DynamicMath.SafeDivision(zsm1, zsm2), 0);               // triggers the 0/0 case

            // Now do zeros
            Area zero = Area.FromSquareMeters(0);

            Assert.AreEqual(DynamicMath.SafeDivision(zero, zero), 0);
            Assert.AreEqual(DynamicMath.SafeDivision(za0, zero), decimal.MaxValue);
            Assert.AreEqual(DynamicMath.SafeDivision(zero, za0), 0);
        }
Exemple #4
0
        /// <summary>
        /// Secondary constructor for when we want points at regular intervals.
        /// </summary>
        /// <param name="vLineShp"></param>
        /// <param name="rRasters"></param>
        /// <param name="outCSV"></param>
        /// <param name="ptsspacing"></param>
        public LinearExtractor(Vector vLineShp, List <Raster> rRasters, FileInfo outCSV, decimal ptsspacing, string FieldName)
            : base(rRasters, new List <Raster>())
        {
            _vinput  = vLineShp;
            _csvfile = outCSV;
            _spacing = (double)ptsspacing;
            // Write the last point. we need to round it a bit
            _spacingDecimals = DynamicMath.NumDecimals(ptsspacing);

            header = new List <ECols>()
            {
                ECols.FID, ECols.DISTANCE, ECols.STATION, ECols.X, ECols.Y
            };

            sFieldName = FieldName;

            // Calling this again after setting the rows will give us a nicer chunk size
            SetOpExtent(OpExtent);
            _stream = new StreamWriter(_csvfile.FullName, true);
            WriteCSVHeaders();
            GetFID0XY();
        }
Exemple #5
0
        public void DynamicMathTest()
        {
            Assert.AreEqual(DynamicMath.Add(0.5, 4), 4.5);
            Assert.AreEqual(DynamicMath.Add(0.5m, 4), 4.5m);
            Assert.AreEqual(DynamicMath.Add(0.5f, 4), 4.5f);
            Assert.AreEqual(DynamicMath.Add(2, 3), (int)5);

            Assert.AreEqual(DynamicMath.Subtract(0.5, 4), -3.5);
            Assert.AreEqual(DynamicMath.Subtract(0.5m, 4), -3.5m);
            Assert.AreEqual(DynamicMath.Subtract(0.5f, 4), -3.5f);
            Assert.AreEqual(DynamicMath.Subtract(2, 3), (int)-1);

            Assert.AreEqual(DynamicMath.Multiply(0.5, 4), 2.0);
            Assert.AreEqual(DynamicMath.Multiply(0.5m, 4), 2.0m);
            Assert.AreEqual(DynamicMath.Multiply(0.5f, 4), 2.0f);
            Assert.AreEqual(DynamicMath.Multiply(2, 3), (int)6);

            Assert.AreEqual(DynamicMath.Divide(6.0, 4), 1.5);
            Assert.AreEqual(DynamicMath.Divide(6.0m, 4), 1.5m);
            Assert.AreEqual(DynamicMath.Divide(6.0f, 4), 1.5f);
            Assert.AreEqual(DynamicMath.Divide(6, 3), (int)2);
        }
Exemple #6
0
 protected override void ChunkOp(List <T[]> data, List <T[]> outputs)
 {
     for (int idx = 0; idx < data[0].GetLength(0); idx++)
     {
         T val = (T)Convert.ChangeType(0, typeof(T));
         if (_outputRasters.Count > 0)
         {
             for (int idd = 0; idd < data.Count; idd++)
             {
                 if (val.Equals(outNodataVals[0]) || data[idd][idx].Equals(outNodataVals[0]))
                 {
                     val = outNodataVals[0];
                 }
                 else
                 {
                     val = DynamicMath.Add(val, data[idd][idx]);
                 }
             }
             Thread.Sleep(300);
             outputs[0][idx] = val;
         }
     }
 }
Exemple #7
0
        /// <summary>
        /// The actual cell-by-cell operations
        /// </summary>
        /// <param name="data"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        protected override void CellOp(List <T[]> data, List <T[]> outputs, int id)
        {
            T val = outNodataVals[0];

            // This is the raster and scalar case
            if (_scalar)
            {
                if (!data[0][id].Equals(inNodataVals[0]))
                {
                    switch (_type)
                    {
                    // Choose your math operation
                    case RasterOperators.MathOpType.Addition:
                        val = DynamicMath.Add(data[0][id], _operand);
                        break;

                    case RasterOperators.MathOpType.Subtraction:
                        val = DynamicMath.Subtract(data[0][id], _operand);
                        break;

                    case RasterOperators.MathOpType.Multipication:
                        val = DynamicMath.Multiply(data[0][id], _operand);
                        break;

                    case RasterOperators.MathOpType.Division:
                        val = DynamicMath.Divide(data[0][id], _operand);
                        break;
                    }
                }
            }
            // This is the two raster case
            else
            {
                bool masked = false;

                // Pure vector method. (This is the slow way)
                if (_hasVectorPolymask)
                {
                    decimal[]   ptcoords = ChunkExtent.Id2XY(id);
                    List <long> shapes   = _polymask.ShapesContainPoint((double)ptcoords[0], (double)ptcoords[1], _shapemask);
                    if (shapes.Count == 0)
                    {
                        masked = true;
                    }
                }

                // Rasterized vector method
                else if (_hasRasterizedPolymask && data.Count == 3 && data[2][id].Equals(inNodataVals[2]))
                {
                    masked = true;
                }


                if (!data[0][id].Equals(inNodataVals[0]) && !data[1][id].Equals(inNodataVals[1]) && !masked)
                {
                    switch (_type)
                    {
                    // Choose your math operation
                    case RasterOperators.MathOpType.Addition:
                        val = DynamicMath.Add(data[0][id], data[1][id]);
                        break;

                    case RasterOperators.MathOpType.Subtraction:
                        val = DynamicMath.Subtract(data[0][id], data[1][id]);
                        break;

                    case RasterOperators.MathOpType.Multipication:
                        val = DynamicMath.Multiply(data[0][id], data[1][id]);
                        break;

                    case RasterOperators.MathOpType.Division:
                        val = DynamicMath.Divide(data[0][id], data[1][id]);
                        break;
                    }
                }
            }
            outputs[0][id] = val;
        }
Exemple #8
0
 public object Evaluate(object left, object right)
 {
     return(DynamicMath.Greater(left, right));
 }
Exemple #9
0
 public object Evaluate(object left, object right)
 {
     return(DynamicMath.ConditionalOr(left, right));
 }
Exemple #10
0
 public object Evaluate(object left, object right)
 {
     return(DynamicMath.LessOrEquals(left, right));
 }
Exemple #11
0
 public object Evaluate(object left, object right)
 {
     return(DynamicMath.Subtract(left, right));
 }
Exemple #12
0
 public object Evaluate(object left, object right)
 {
     return(DynamicMath.Multiply(left, right));
 }
Exemple #13
0
 public object Evaluate(object left, object right)
 {     
   
   return DynamicMath.GreaterOrEquals(left, right);
 }