Tránh thất bại từ ArcObjects geoprocessing với .NET?


14

Có một số tính năng hay trong ArcToolbox chúng ta có thể sử dụng, nhưng vì một số lý do, điều này KHÔNG hoạt động đúng. Nó thậm chí không ném cho tôi một lỗi.

Phần mềm của tôi đang chạy bên trong ArcMap, vì vậy không cần AoInitialize nữa, Corret?

    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");
        }

Đây là một ví dụ mã tôi đang có ở đây. Tôi đã tạo tập hợp công cụ Quản lý dữ liệu, nhưng tôi không thể tìm thấy tệp để ký.

Mã này chỉ cho tôi một lỗi. Có phải vì ký?

Tôi cũng đã thử cách khác, sử dụng IVariantArray và gọi từ tên công cụ mà không thành công. Chỉ có tôi hay ...?

Bất cứ ai có thể chỉ cho tôi một giải pháp "đẹp hơn"? Tôi cần chạy một số quy trình đã được xây dựng trong ArcToolbox mà tôi thực sự không muốn sao chép.


Lỗi bạn đề cập sau này trong câu hỏi của bạn là gì?
Dandy

Xin chào Dandy. Nó không ném lỗi, nó chỉ thất bại.
George Silva

Câu trả lời:


14

Trong đoạn mã dưới đây, hàm multi2single hoạt động với tôi trong 10.0. Tôi không thể kiểm tra Feature2Point vì tôi không có giấy phép ArcInfo, bạn có thể không?.

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
}

Tôi nhận được đầu ra này trong 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

Xử lý lỗi đó là tuyệt vời Kirk. Tôi chưa bao giờ dành đủ thời gian sử dụng bộ xử lý địa lý để biết về các giao diện IGeoProcessorEvent. Cảm ơn đã chỉ ra điều đó!
BlinkyBill

Mã của bạn hoạt động! ArcObjects không thích tôi.
George Silva

4

Bạn đúng ở chỗ không cần AoInitialize. Như bạn đã phát hiện ra, gỡ lỗi với đối tượng bộ xử lý địa lý là một vấn đề khó khăn.

Những gì bạn cần làm là đọc thông báo, cảnh báo và hàng đợi lỗi sau mỗi cuộc gọi, để kiểm tra sự cố. Không có may mắn như dựa vào bàn giao lỗi .NET tiêu chuẩn.

Hãy thử điều này sau mỗi cuộc gọi thực hiện (lưu ý GetMessageS, không phải GetMessage) ...

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

Xin chào eldac! Tôi đã bỏ cuộc sau vài giờ đập đầu, nhưng tôi sẽ thử lại điều này sớm và tôi sẽ hoàn thành phần tiếp theo của câu hỏi. Đây có thể là một vấn đề với việc ký kết hội đồng khi bạn tạo nó lần đầu tiên?
George Silva

Xin chào George, đây có lẽ không phải là vấn đề ký kết. Nếu bạn có một lỗi cú pháp / đường dẫn / loại đơn giản trong các thông số cho FeatureToPoint (hoặc bất kỳ công cụ xử lý địa lý nào khác), nó sẽ thất bại mà không có bất kỳ thông báo nào, do đó việc kiểm tra hàng đợi lỗi. Tôi hầu như không bận tâm với các công cụ xử lý địa lý nữa. Nó chỉ mất quá nhiều thời gian để làm cho nó hoạt động trong hầu hết các trường hợp, vì gỡ lỗi là địa ngục.
BlinkyBill

Đây là một nỗi đau, vì tôi cần kiểm tra một nhân mã, nhưng tôi không chắc làm thế nào tôi có thể liên kết các thay đổi tôi cần thực hiện mà không cần sử dụng công cụ xử lý địa lý. Tôi cần thay đổi một lớp đa giác, nhưng việc kiểm tra cần phải được thực hiện dưới lớp trung tâm của nó. Tôi đang sử dụng truy vấn không gian để lọc kết quả của mình, vì vậy tôi sẽ mất kết quả đó.
George Silva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.