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); }
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"); }
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); }
/// <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(); }
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); }
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; } } }
/// <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; }
public object Evaluate(object left, object right) { return(DynamicMath.Greater(left, right)); }
public object Evaluate(object left, object right) { return(DynamicMath.ConditionalOr(left, right)); }
public object Evaluate(object left, object right) { return(DynamicMath.LessOrEquals(left, right)); }
public object Evaluate(object left, object right) { return(DynamicMath.Subtract(left, right)); }
public object Evaluate(object left, object right) { return(DynamicMath.Multiply(left, right)); }
public object Evaluate(object left, object right) { return DynamicMath.GreaterOrEquals(left, right); }