.NET으로 ArcObjects 지오 프로세싱에서 실패를 피 하시겠습니까?


14

ArcToolbox에는 유용한 기능이 몇 가지 있지만 어떤 이유로 든 제대로 작동하지 않습니다. 심지어 오류가 발생하지 않습니다.

내 소프트웨어가 ArcMap 내에서 실행 중이므로 다시 AoInitialize 할 필요가 없습니다.

    public void Execute()
    {
        InitializeProduct();
        try
        {
            Geoprocessor gp = new Geoprocessor();
            gp.OverwriteOutput = true;

            FeatureToPoint featureToPoint = new FeatureToPoint();

            string outputPathName = CurrentWorkspace.PathName + "\\teste_centroide";

            featureToPoint.in_features = InputFeatureClass;
            featureToPoint.out_feature_class = outputPathName;
            featureToPoint.point_location = "INSIDE";

            IGeoProcessorResult result = (IGeoProcessorResult)gp.Execute(featureToPoint, null);

            if (result == null)
            {
                for (int i = 0; i <= gp.MessageCount - 1; i++)
                {
                    Console.WriteLine(gp.GetMessage(i));
                }
            }

            IGPUtilities gpUtils = new GPUtilitiesClass();
            this.OutputFeatureClass = gpUtils.OpenFeatureClassFromString(outputPathName);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message + "\r\n");
        }

이것은 내가 여기있는 코드 예제입니다. DataManagement 도구 어셈블리를 생성했지만 서명 할 파일을 찾을 수 없습니다.

이 코드는 단지 오류를 제공합니다. 서명 때문인가요?

IVariantArray를 사용하고 도구 이름을 호출하지 않고 다른 방법으로 시도했습니다. 그냥 나 아니면 ...?

누구든지 "더 나은"솔루션을 가리킬 수 있습니까? 나는 실제로 복제하고 싶지 않은 ArcToolbox에 내장 된 여러 프로세스를 실행해야합니다.


나중에 질문에서 언급 한 오류는 무엇입니까?
Dandy

댄디 오류가 발생하지 않고 실패합니다.
George Silva

답변:


14

아래 코드에서 multi2single 함수는 10.0에서 작동합니다. ArcInfo 라이센스가 없어서 Feature2Point를 테스트 할 수 없습니다.

public class Test
{
    public static void TestGP(IApplication app)
    {
        IMxDocument mxDoc = (IMxDocument)app.Document;
        //Feat2Point((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:\Projects\AmberGIS\Forums\forumtest.gdb\f2p");
        Multi2Single((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:\Projects\AmberGIS\Forums\forumtest.gdb\m2s");
    }

    public static void Multi2Single(IFeatureLayer inLayer, string outPath)
    {
        MultipartToSinglepart m2s = new MultipartToSinglepart();
        m2s.in_features = inLayer.FeatureClass;
        m2s.out_feature_class = outPath;
        Execute(m2s);
    }

    public static void Feat2Point(IFeatureLayer inLayer, string outPath)
    {
        FeatureToPoint f2p = new FeatureToPoint();
        f2p.in_features = inLayer.FeatureClass;
        f2p.out_feature_class = outPath;
        Execute(f2p);
    }

    public static void Execute(IGPProcess proc)
    {
        Geoprocessor gp = new Geoprocessor();
        gp.AddOutputsToMap = true;
        gp.OverwriteOutput = true;
        gp.RegisterGeoProcessorEvents((IGeoProcessorEvents)new GPEvents());
        IGeoProcessorResult2 result = gp.Execute(proc, null) as IGeoProcessorResult2;
        IGPMessages msgs = result.GetResultMessages();
        for(int i=0;i<msgs.Count;i++)
            Debug.Print("{0} {1}", msgs.GetMessage(i).Description, msgs.GetMessage(i).Type);            
    }
}
public class GPEvents : IGeoProcessorEvents3, IGeoProcessorEvents 
{
    #region IGeoProcessorEvents3 Members
    public void OnProcessMessages(IGeoProcessorResult result, IGPMessages pMsgs)
    {
        Debug.Print("OnProcessMessages {0}", result.Status);
    }
    public void OnProgressMessage(IGeoProcessorResult result, string message)
    {
        Debug.Print("OnProgressMessages {0}", result.Status);
    }
    public void OnProgressPercentage(IGeoProcessorResult result, double percentage)
    {
        Debug.Print("OnProgressPercentage {0}", result.Status);
    }
    public void OnProgressShow(IGeoProcessorResult result, bool Show)
    {
        Debug.Print("OnProgressShow {0}", result.Status);
    }
    public void PostToolExecute(IGeoProcessorResult result)
    {
        Debug.Print("PostToolExecute {0}", result.Status);
    }
    public void PreToolExecute(IGeoProcessorResult result)
    {
        Debug.Print("PreToolExecute {0}",result.Status);
    }
    #endregion

    #region IGeoProcessorEvents Members

    void IGeoProcessorEvents.OnMessageAdded(IGPMessage message)
    {
        Debug.Print("OnMessageAdded {0} {1}", message.Description, message.Type);
        throw new NotImplementedException();
    }

    void IGeoProcessorEvents.PostToolExecute(IGPTool Tool, ESRI.ArcGIS.esriSystem.IArray Values, int result, IGPMessages Messages)
    {
        Debug.Print("PostToolExecute2 {0}", Tool.Name);
    }

    void IGeoProcessorEvents.PreToolExecute(IGPTool Tool, ESRI.ArcGIS.esriSystem.IArray Values, int processID)
    {
        if (Tool.IsLicensed())
            Debug.Print("PreToolExecute");
        else
            Debug.Print("tool is not licensed to run");
    }

    void IGeoProcessorEvents.ToolboxChange()
    {
        Debug.Print("ToolboxChange");
    }

    #endregion
}

VS 에서이 출력을 얻습니다.

PreToolExecute
PostToolExecute2 MultipartToSinglepart
Executing: MultipartToSinglepart GPL0 D:\Projects\AmberGIS\Forums\forumtest.gdb\m2s esriGPMessageTypeProcessDefinition
Start Time: Thu Sep 02 11:32:44 2010 esriGPMessageTypeProcessStart
Succeeded at Thu Sep 02 11:32:51 2010 (Elapsed Time: 7.00 seconds) esriGPMessageTypeProcessStop

그 오류 처리는 환상적인 Kirk입니다. 지오 프로세서를 사용하여 IGeoProcessorEvent 인터페이스에 대해 알기에 충분한 시간을 보냈습니다. 지적 해 주셔서 감사합니다!
BlinkyBill

코드가 작동합니다! ArcObjects는 나를 좋아하지 않습니다.
George Silva

4

AoInitialize가 필요하지 않다는 것이 맞습니다. 아시다시피, 지리 프로세서 객체를 사용한 디버깅은 목에 통증이 있습니다.

수행 할 작업 각 호출 후 메시지, 경고 및 오류 대기열을 읽고 문제를 확인하십시오. 표준 .NET 오류 처리에 의존하는 것과 같은 운이 없습니다.

각 실행 호출 후이를 시도하십시오 (GetMessage가 아닌 GetMessageS 참고) ...

Console.WriteLine("Messages: " + gp.GetMessages(1));
Console.WriteLine("Warnings: " + gp.GetMessages(2));
Console.WriteLine("Errors: " + gp.GetMessages(3));

안녕하세요 eldac! 나는 몇 시간 동안 머리를 두드리는 것을 포기했지만 곧 다시 시도 할 것이고 질문에 대한 후속 조치를 마무리 할 것입니다. 어셈블리를 처음 생성 할 때 서명 할 때 이것이 문제가 될 수 있습니까?
George Silva

안녕 조지, 아마 서명 문제가 아니에요. FeatureToPoint (또는 다른 지리 처리 도구)의 매개 변수에 간단한 구문 / 경로 / 유형 오류가있는 경우 알림없이 실패하므로 오류 대기열 검사가 수행됩니다. 더 이상 지오 프로세싱 도구를 사용하지 않습니다. 디버깅이 지옥이기 때문에 대부분의 경우 작동하는 데 시간이 오래 걸립니다.
BlinkyBill

나는 중심을 테스트해야하기 때문에 고통 스럽지만 지오 프로세싱 도구를 사용하지 않고 변경 사항을 어떻게 연결할 수 있는지 잘 모르겠습니다. 다각형 레이어를 변경해야하지만 테스트는 중심에서 수행해야합니다. 공간 쿼리를 사용하여 결과를 필터링하므로 그 결과를 잃어 버릴 것입니다.
George Silva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.