หลีกเลี่ยงการล้มเหลวจาก ArcObjects geoprocessing ด้วย. NET?


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 ฉันไม่สามารถทดสอบ Feature2Point ได้เนื่องจากฉันไม่มีใบอนุญาต ArcInfo ใช่ไหม

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 ที่ยอดเยี่ยม ฉันไม่เคยใช้เวลาพอที่จะใช้ geoprocessor เพื่อทราบเกี่ยวกับ IGeoProcessorEvent ขอบคุณที่ชี้นำ!
BlinkyBill

รหัสของคุณใช้งานได้! ArcObjects ไม่ชอบฉัน
George Silva

4

คุณถูกต้องตรงที่ไม่จำเป็นต้องใช้ AoInitialize ในขณะที่คุณค้นพบการแก้จุดบกพร่องด้วยวัตถุทางภูมิศาสตร์โปรเซสเซอร์เป็นความเจ็บปวดในลำคอ

สิ่งที่คุณต้องทำคืออ่านข้อความคำเตือนและคิวข้อผิดพลาดหลังจากการโทรแต่ละครั้งเพื่อตรวจสอบปัญหา ไม่มีโชคเช่นการพึ่งพาข้อผิดพลาด. NET มาตรฐานการส่ง

ลองใช้หลังจากเรียกใช้งานแต่ละครั้ง (หมายเหตุ GetMessageS ไม่ใช่ GetMessage) ...

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

สวัสดี eldac! ฉันยอมแพ้หลังจากการต่อสู้สองสามชั่วโมง แต่ฉันจะลองอีกครั้งในไม่ช้าและฉันจะติดตามคำถามต่อไป นี่อาจเป็นปัญหากับการเซ็นชื่อชุดประกอบเมื่อคุณสร้างครั้งแรกหรือไม่
George Silva

สวัสดีจอร์จมันอาจไม่ใช่ปัญหาการลงนาม หากคุณมีข้อผิดพลาดทางไวยากรณ์ / พา ธ / ชนิดง่าย ๆ ใน params สำหรับ FeatureToPoint (หรือเครื่องมือการประมวลผลทางภูมิศาสตร์อื่น ๆ ) มันจะล้มเหลวโดยไม่มีการแจ้งเตือนใด ๆ ดังนั้นการตรวจสอบคิวข้อผิดพลาด ฉันไม่ค่อยกังวลกับเครื่องมือการประมวลผลทางภูมิศาสตร์อีกต่อไป มันใช้เวลานานมากในการทำให้มันทำงานได้ในกรณีส่วนใหญ่
BlinkyBill

นี่เป็นความเจ็บปวดเพราะฉันต้องทดสอบเซนทรอยด์ แต่ฉันไม่แน่ใจว่าฉันจะเชื่อมโยงการเปลี่ยนแปลงที่ฉันต้องทำได้อย่างไรโดยไม่ต้องใช้เครื่องมือประมวลผลทางภูมิศาสตร์ ฉันต้องเปลี่ยนเลเยอร์รูปหลายเหลี่ยม แต่การทดสอบจะต้องดำเนินการภายใต้เซนทรอยด์ ฉันใช้การสืบค้นเชิงพื้นที่เพื่อกรองผลลัพธ์ของฉันดังนั้นฉันจะทำแบบนั้น
George Silva
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.