避免使用.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 2010年

你好,丹迪。它不会抛出错误,只会失败。
乔治席尔瓦

Answers:


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

该错误处理真是太棒了。我从来没有花费足够的时间使用地理处理器来了解IGeoProcessorEvent接口。感谢您指出!
BlinkyBill 2010年

您的代码有效!ArcObjects不喜欢我。
乔治·席尔瓦

4

您是对的,因为不需要AoInitialize。正如您所发现的那样,使用地理处理器对象进行调试是一件令人头疼的事情。

您需要执行的操作是在每次调用后阅读消息,警告和错误队列,以检查是否有问题。没有依赖标准的.NET错误处理的运气。

在每个执行调用之后尝试执行此操作(注意GetMessageS,而不是GetMessage)...

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

你好eldac!经过几个小时的脑力激荡后,我放弃了,但是我很快会再尝试一次,我将继续对这个问题进行跟进。首次生成程序集时,对签名进行签名是否会出现问题?
乔治·席尔瓦

乔治,您好,这可能不是签名问题。如果在FeatureToPoint(或任何其他地理处理工具)的参数中有一个简单的语法/路径/类型错误,它将在没有任何通知的情况下失败,因此将检查错误队列。我几乎不再理会地理处理工具了。在大多数情况下,调试起来需要很长时间,因为调试很麻烦。
BlinkyBill 2010年

这很痛苦,因为我需要测试一个质心,但是我不确定如何在不使用地理处理工具的情况下链接需要进行的更改。我需要更改多边形层,但是测试需要在其质心下进行。我正在使用空间查询来过滤我的结果,所以我会放弃它。
乔治·席尔瓦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.