I have generated a .gpkx package using a custom tool that accepts a .lyr file as input and produces a layer as output. The tool runs successfully in ArcGIS Pro, and the .gpkx is created without any issues. However, when attempting to use the .gpkx in my WPF application through a local runtime server, the GeoprocessingJob encounters failures. Can anyone provide insights or suggestions on resolving this issue?
Actually I am trying to display layer from .lyr file using ArcGIS Maps SDK.Net, As there is no direct support in ArcGIS Maps SDK.Net so I have created .gpkx from my script tool and consuming .gpkx in my wpf application to get layer.
Following error occurs when GeoprocessingJob fails: Illegal state: Server job has failed. Traceback (most recent call last): File "C:\ESRISA~1\AppData\Documents\ArcGIS\Pkgs\mobilegpkxpackage_98EB\p30\proj204\MyProject.atbx#mmpkexperiment_MyProjectatbx.py", line 63, in File "C:\ESRISA~1\AppData\Documents\ArcGIS\Pkgs\mobilegpkxpackage_98EB\p30\proj204\MyProject.atbx#mmpkexperiment_MyProjectatbx.py", line 19, in script_tool File "C:\Program Files\ArcGIS SDKs\LocalServer200.1\64\Pro\Resources\ArcPy\arcpy_mp.py", line 1304, in init self._arc_object = arcgisscripting._mapping.LayerFile(*gp_fixargs((layer_file_path,), True)) RuntimeError . Failed to execute (mmpkexperiment).
Follwoing is arcpy code from which .gpkx was generated
========================
import arcpy
import os
def script_tool(inputlyrfile, inputprojectpath, outfolderpath, outputlyr):
arcpy.env.workspace = outfolderpath
projName = "mmpkproject"
projNamewithPath = os.path.join(outfolderpath, f"{projName}.aprx")
outmpkxfilepath = os.path.join(outfolderpath, "mpkxpackagefile.mpkx")
aprx = arcpy.mp.ArcGISProject(inputprojectpath)
newMap = aprx.createMap("mmpkmap", "Map")
insertLyr = arcpy.mp.LayerFile(inputlyrfile)
newMap.addLayer(insertLyr)
insertLyr.saveACopy(outputlyr)
del aprx
return
if __name__ == "__main__":
inputlyrfile = arcpy.GetParameterAsText(0)
outfolderpath = arcpy.GetParameterAsText(1)
inputprojectpath = arcpy.GetParameterAsText(2)
outputlyr = arcpy.GetParameterAsText(3)
script_tool(inputlyrfile, inputprojectpath, outfolderpath, outputlyr)
==================== while creating tool in ArcGis Pro i have set inputlyrfile, outfolderpath, inputprojectpath as input parameters and all are of string type
outputlyr is set as output parameter and is of Layer type.
Following is WPF C# code to consume the .gpkx file
private LocalGeoprocessingService _gpService;
private GeoprocessingTask _gpTask;
private GeoprocessingJob _gpJob;
private async void BtnGeoProcessing_Click(object sender, RoutedEventArgs e)
{
LocalServer.Instance.AppDataPath = "C:\\EsriSamples\\AppData";
await LocalServer.Instance.StartAsync();
_gpService = new LocalGeoprocessingService("path of .gpkx file", GeoprocessingServiceType.AsynchronousSubmitWithMapServiceResult);
_gpService.StatusChanged += GpServiceOnStatusChanged;
await _gpService.StartAsync();
}
private async void GpServiceOnStatusChanged(object sender, StatusChangedEventArgs statusChangedEventArgs)
{
if (statusChangedEventArgs.Status != LocalServerStatus.Started)
return;
try
{
string strUrl = _gpService.Url + "/myscripttool";
_gpTask = await GeoprocessingTask.CreateAsync(new Uri(strUrl));
RunJob();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void RunJob()
{
GeoprocessingParameters gpParams = new GeoprocessingParameters(GeoprocessingExecutionType.AsynchronousSubmit);
string strInputLayer = "D:\\data\\input\\somelayer_LYR.lyr";
string strInputProjectFilePath = "D:\\data\\input\\templateproject\\templateproject.aprx";
string strOutFolder = "D:\\data";
gpParams.Inputs["inputlyrfile"] = new GeoprocessingString(strInputLayer);
gpParams.Inputs["outfolderpath"] = new GeoprocessingString(strOutFolder);
gpParams.Inputs["inputprojectpath"] = new GeoprocessingString(strInputProjectFilePath);
_gpJob = _gpTask.CreateJob(gpParams);
_gpJob.StatusChanged += GpJobOnJobChanged;
try
{
_gpJob.Start();
}
catch (Exception ex)
{
}
}
private async void GpJobOnJobChanged(object o, JobStatus e)
{
if (_gpJob.Status == JobStatus.Failed) // HERE JOB FAILS
{
MessageBox.Show("Job Failed");
return;
}
if (_gpJob.Status != JobStatus.Succeeded)
{ return; }
string gpServiceResultUrl = _gpService.Url.ToString();
string jobSegment = "MapServer/jobs/" + _gpJob.ServerJobId;
gpServiceResultUrl = gpServiceResultUrl.Replace("GPServer", jobSegment);
VM.LblStatus += Environment.NewLine + "Creating layer from job result ";
ArcGISMapImageLayer myMapImageLayer = new ArcGISMapImageLayer(new Uri(gpServiceResultUrl));
try
{
await myMapImageLayer.LoadAsync();
Dispatcher.Invoke(() =>
{
MainMapView.Map.OperationalLayers.Add(myMapImageLayer);
});
}
catch (Exception ex)
{
}
}