5

Having the hardest time getting the correct syntax when adding layers as gp parameters to call the Merge_management GeoProcessing Task. Below is just one of MANY, MANY ways I have tried with no luck. Can anyone help?

I've successfully called many GeoProcessing tasks via code in ArcEngine, but this is the first one to take an array ( ie. [layer1,layer2,etc]) as one of the parameters.

Intial Attemp:

 public void RunMergeGeoProcess(ILayer SourceLayer1, ILayer SourceLayer2, string ResultFeatureClassName, string GeoDBAbsFileName)
 {
 IFeatureLayer featureLayerSource1 = (IFeatureLayer)SourceLayer1;
 IFeatureLayer featureLayerSource2 = (IFeatureLayer)SourceLayer2;
 _geoProcessor.SetEnvironmentValue("Workspace", GeoDBAbsFileName);
 //_gpParams.Add(featureLayerSource1);
 ////_gpParams.Add(featureLayerSource2);
 IWorkspace refWS = ((IDataset)featureLayerSource1.FeatureClass).Workspace;
 string dbPath = refWS.PathName;
 IDataset myDS1 = featureLayerSource1.FeatureClass as IDataset;
 string mysDS1 = dbPath + "\\" + myDS1.Name;
 IDataset myDS2 = featureLayerSource2.FeatureClass as IDataset;
 string mysDS2 = dbPath + "\\"+ myDS2.Name;
 string myResult = dbPath + "\\" + ResultFeatureClassName;
 string param1 = "[" + mysDS1 + ", " + mysDS2 + "]";
 _gpParams.Add(param1);
 _gpParams.Add(myResult);
 try
 {
 _geoProcessor.OverwriteOutput = true;
 _geoProcessor.Execute("Merge_management", _gpParams, null);
 //returnMessages(_geoProcessor);
 }
 catch (Exception ex)
 {
 MessageBox.Show("There was a GeoProcessing Error." + ex.ToString());
 returnMessages(_geoProcessor);
 }
 _gpParams.RemoveAll();
 }

Working Version:

 public void RunMergeGeoProcess(ILayer SourceLayer1, ILayer SourceLayer2, string ResultFeatureClassName, string GeoDBAbsFileName)
 {
 IFeatureLayer featureLayerSource1 = (IFeatureLayer)SourceLayer1;
 IFeatureLayer featureLayerSource2 = (IFeatureLayer)SourceLayer2;
 _geoProcessor.SetEnvironmentValue("Workspace", GeoDBAbsFileName);
 IWorkspace refWS = ((IDataset)featureLayerSource1.FeatureClass).Workspace;
 string dbPath = refWS.PathName;
 IDataset myDS1 = featureLayerSource1.FeatureClass as IDataset;
 string mysDS1 = dbPath + "\\" + myDS1.Name;
 IDataset myDS2 = featureLayerSource2.FeatureClass as IDataset;
 string mysDS2 = dbPath + "\\" + myDS2.Name;
 string myResult = dbPath + "\\" + ResultFeatureClassName;
 string param1 = mysDS2 + ";" + mysDS1 ;
 _gpParams.Add(param1);
 _gpParams.Add(myResult);
 try
 {
 _geoProcessor.OverwriteOutput = true;
 _geoProcessor.Execute("Merge_management", _gpParams, null);
 //returnMessages(_geoProcessor);
 }
 catch (Exception ex)
 {
 MessageBox.Show("There was a GeoProcessing Error during the Merge Operation." + ex.ToString());
 //returnMessages(_geoProcessor);
 }
 _gpParams.RemoveAll();
 }
PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Dec 14, 2011 at 12:41
0

1 Answer 1

3

You should be able to use a semicolon-delimited list for the input parameter. An example using the Intersect tool is below:

 private void Intersect(List<string> LayerNames, string OutputLayerLocation)
 {
 Intersect inter;
 StringBuilder sb;
 Geoprocessor gg;
 sb = new StringBuilder();
 foreach (string LayerName in LayerNames)
 {
 sb.Append(LayerName);
 sb.Append(";");
 }
 sb.Length--;
 inter = new Intersect();
 inter.in_features = sb.ToString();
 inter.out_feature_class = OutputLayerLocation;
 gg = new Geoprocessor();
 gg.OverwriteOutput = true;
 gg.ProgressChanged += new EventHandler<ESRI.ArcGIS.Geoprocessor.ProgressChangedEventArgs>(gg_ProgressChanged);
 gg.ToolExecuted += new EventHandler<ToolExecutedEventArgs>(gg_ToolExecuted);
 gg.MessagesCreated += new EventHandler<MessagesCreatedEventArgs>(gg_MessagesCreated);
 gg.ExecuteAsync(inter);
 }
answered Dec 14, 2011 at 15:32
6
  • To put it simply, the tool does not want an array, but a list of paths split on semi-colons: "C:\\PathToShape1;C:\\PathToShape2;C:\\PathToShape3" Commented Dec 14, 2011 at 16:07
  • @Nathanus That's the odd part; all the documentation I've seen mentions an "array", so I struggled with this myself. (And thanks for making my message a bit clearer.) Commented Dec 14, 2011 at 16:12
  • Thanks a TON!!!!! I could not find that syntax ANYWHERE. Now it is working, I just need to work on the field mappings (when they are unequal). Thanks SO much!!! I'll post my version of final code, when done Commented Dec 14, 2011 at 17:03
  • I came from Arcpy scripting, so I simply assumed it wanted the same kind of input it used in Python. Blind luck that I was right. How I came to the conclusion that I should have used a semicolon string instead of the list it shows in the documentation I do not remember... :) Commented Dec 14, 2011 at 17:04
  • @user3013 Don't forget to mark Michael's answer as correct (there should be a check mark under the vote count on the side). Glad to be of help. Commented Dec 14, 2011 at 17:05

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.