/// <summary> /// /// </summary> /// <param name="input"></param> /// <param name="output"></param> /// <param name="cancelProgressHandler"></param> /// <returns></returns> public bool Execute(IFeatureSet input, IFeatureSet output, ICancelProgressHandler cancelProgressHandler) { // Validates the input and output data if (input == null || output == null) { return(false); } // We add all the fields foreach (DataColumn inputColumn in input.DataTable.Columns) { output.DataTable.Columns.Add(new DataColumn(inputColumn.ColumnName, inputColumn.DataType)); } // We add the area field bool addField = true; string fieldCount = string.Empty; int i = 0; while (addField) { if (output.DataTable.Columns.Contains(TextStrings.Area + fieldCount) == false) { output.DataTable.Columns.Add(new DataColumn(TextStrings.Area + fieldCount, typeof(double))); addField = false; } else { fieldCount = i.ToString(); i++; } } // we add all the old features to output for (int j = 0; j < input.Features.Count; j++) { Feature newFeature = new Feature(input.Features[j].BasicGeometry, output); foreach (DataColumn colSource in input.DataTable.Columns) { newFeature.DataRow[colSource.ColumnName] = input.Features[j].DataRow[colSource.ColumnName]; } newFeature.DataRow[TextStrings.Area + fieldCount] = MultiPolygon.FromBasicGeometry(output.Features[j].BasicGeometry).Area; // Status updates is done here cancelProgressHandler.Progress( string.Empty, Convert.ToInt32((Convert.ToDouble(j) / Convert.ToDouble(input.Features.Count)) * 100), input.Features[j].DataRow[0].ToString()); if (cancelProgressHandler.Cancel) { return(false); } } output.AttributesPopulated = true; output.Save(); return(true); }