ArcGIS Local Server GeoprocessingJob fails in wpf application

29 Views Asked by At

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)
    {
    }
}

0

There are 0 best solutions below