Select to view content in your preferred language

Geoprocessing Async Error

942
4
04-12-2023 06:13 PM
tzz_12
by
Emerging Contributor

I am trying to run a few geoprocessing methods in the sequence they occur. It works fine if I just keep it simple, but I want to add some additional parameters, such as environment and GPExecuteToolFlags. There is an errors that states the "Object reference is not set to an instance of an object."  Please see my code below.

 

var in_features = new List<FeatureLayer>() { FC_Layer1, Layer2 };
var args = Geoprocessing.MakeValueArray(in_features, intersectFC);
GPExecuteToolFlags outputOnMapNone = GPExecuteToolFlags.None;
GPRun("analysis.Intersect", args,null,null,outputOnMapNone);

                        
var Agg_para = Geoprocessing.MakeValueArray(intersectFC, intersectSortFC, GPRun("management.Sort", Agg_para, null,null,outputOnMapNone);

                        
var in_features2 = new List<FeatureLayer>() { FCLayer, Layer2 };
var args2 = Geoprocessing.MakeValueArray(in_features2, layer);
GPExecuteToolFlags flag = GPExecuteToolFlags.GPThread;
GPRun("analysis.Intersect", args2,null,null,flag);

public async void GPRun(string GPTool, IReadOnlyList<string> parameters, IEnumerable<KeyValuePair<string, string>> env,CancelableProgressor prog,GPExecuteToolFlags flag)
{
   var gp_result = await Geoprocessing.ExecuteToolAsync(GPTool, parameters, env, prog, flag);
   Geoprocessing.ShowMessageBox(gp_result.Messages, "Geoprocessing Error 
      Messages",gp_result.IsFailed ? GPMessageBoxStyle.Error : 
      GPMessageBoxStyle.Default);
}

 

 

Thanks for your help!

0 Kudos
4 Replies
GKmieliauskas
Esri Regular Contributor

Hi,

I think problem with line:

var Agg_para = Geoprocessing.MakeValueArray(intersectFC, intersectSortFC, GPRun("management.Sort", Agg_para, null,null,outputOnMapNone);

You use Agg_para parameter without initialization in running management.Sort tool

Wolf
by Esri Regular Contributor
Esri Regular Contributor

Your code snippet has a problem, this line doesn't make much sense when GPRun returns void, plus a closing ')' is missing:

 

var Agg_para = Geoprocessing.MakeValueArray(intersectFC, intersectSortFC, GPRun("management.Sort", Agg_para, null,null,outputOnMapNone);

 

i would suggest setting a breakpoint before you call Geoprocessing.ExecuteToolAsync and inspect the content of the parameters array to make sure the content looks correct.  If you run the same GP tool manually you can look at the corresponding python command to get the proper parameter sequence for the input parameters array.

0 Kudos
tzz_12
by
Emerging Contributor

Hi Wolf, 

When I copy and paste the code into the post, I had to fix the formatting of the code, and  I accidently deleted some parts of the code by accident. Here is the code for the sort geoprocessing method below. The error, "NullReferenceException: Object reference is not set to an instance of an object.", occurred in the GPRun method, when it calls the Geoprocessing.ExecuteToolAsync. 

var Agg_para = Geoprocessing.MakeValueArray(intersectFC, intersectSortFC, AggregateField);
utility.GPRun("management.Sort", Agg_para);

 

0 Kudos
Wolf
by Esri Regular Contributor
Esri Regular Contributor

Sorry about the delay.  I noticed a problem with the variation of "Geoprocessing.ExecuteToolAsync" that you are using.  It turns out that the 'progressor' parameter cannot be null.

You can create a Progressor using this snippet:

CancelableProgressorSource cps = new CancelableProgressorSource("Run GP", "Canceled");
var progressor = cps.Progressor;

This variation of your code worked for me:

protected async override void OnClick()
{
  try
  {
    var intersectInputLyr1 = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(fl => fl.Name.Equals("TestPolygons")).FirstOrDefault();
    var intersectInputLyr2 = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(fl => fl.Name.Equals("TestLines")).FirstOrDefault();
    var intersectOutputFC = System.IO.Path.Combine(Project.Current.DefaultGeodatabasePath, "IntersectFc");
    var intersectOutputSortFC = System.IO.Path.Combine(Project.Current.DefaultGeodatabasePath, "IntersectSortFc");
    var AggregateField = "Description";
    CancelableProgressorSource cps = new CancelableProgressorSource("Run GP", "Canceled");
    var in_features = new List<FeatureLayer>() { intersectInputLyr1, intersectInputLyr2 };
    var argsSortedIntersect = Geoprocessing.MakeValueArray(in_features,
      intersectOutputFC,
      "ALL",//join_attributes = "ALL",
      null,//cluster_tolerance = None,
      "INPUT"//output_type = "INPUT"
    );
    GPExecuteToolFlags noMapOutput = GPExecuteToolFlags.None;
    // set overwrite flag           
    var env = Geoprocessing.MakeEnvironmentArray(overwriteoutput: true);

    await GPRun("analysis.Intersect", argsSortedIntersect, env, cps.Progressor, noMapOutput);

    var Agg_para = Geoprocessing.MakeValueArray(intersectOutputFC, intersectOutputSortFC, AggregateField);
    await GPRun("management.Sort", Agg_para, env, cps.Progressor);

    var intersectInputLyr3 = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().Where(fl => fl.Name.Equals("TestPoints")).FirstOrDefault();
    var intersectOutputFc2 = System.IO.Path.Combine(Project.Current.DefaultGeodatabasePath, "IntersectPointFc");

    var in_features2 = new List<FeatureLayer>() { intersectInputLyr3, intersectInputLyr2 };
    var argsIntersect2 = Geoprocessing.MakeValueArray(in_features2, intersectOutputFc2);
    GPExecuteToolFlags flag = GPExecuteToolFlags.GPThread;
    await GPRun("analysis.Intersect", argsIntersect2, env, cps.Progressor, flag);
  }
  catch (Exception ex)
  {
    MessageBox.Show($@"Exception: {ex.ToString()}");
  }
}

public async Task GPRun(string GPTool, 
  IReadOnlyList<string> parameters, 
  IEnumerable<KeyValuePair<string, string>> env = null,
  CancelableProgressor prog = null,
  GPExecuteToolFlags flag = GPExecuteToolFlags.Default)
{
  try
  {
    var gp_result = await Geoprocessing.ExecuteToolAsync(GPTool, parameters, env, prog, flag);
    if (gp_result != null) Geoprocessing.ShowMessageBox(gp_result.Messages, "Geoprocessing Result",
      gp_result.IsFailed ? GPMessageBoxStyle.Error :
        GPMessageBoxStyle.Default);
  }
  catch
  {
    var gp_result = await Geoprocessing.OpenToolDialogAsync(GPTool, parameters, env);
    if (gp_result != null) Geoprocessing.ShowMessageBox(gp_result.Messages, "Geoprocessing Result",
      gp_result.IsFailed ? GPMessageBoxStyle.Error :
        GPMessageBoxStyle.Default);
  }
}

 

0 Kudos