Уникати невдач від геообробки ArcObjects за допомогою .NET?


14

У ArcToolbox ми можемо використати кілька приємних функцій, але з певних причин це НЕ працює належним чином. Це навіть не кидає мені помилки.

Моє програмне забезпечення працює в ArcMap, тому не потрібно знову AoInitialize, 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");
        }

Це приклад коду, який я маю тут. Я створив збірку інструментів DataManagement, але не зміг знайти файл для підписання.

Цей код просто дає мені помилку. це через підписання?

Я також спробував інший шлях, використовуючи IVariantArray та дзвонивши з імені інструменту, без успіху. Це тільки я чи ...?

Хтось може вказати мені на "приємніше" рішення? Мені потрібно запустити кілька процесів, які вже вбудовані в ArcToolbox, які я дійсно не хочу дублювати.


Про яку помилку ви згадуєте пізніше у своєму запитанні?
Денді

Привіт Денді. Він не кидає помилок, він просто провалюється.
Джордж Сільва

Відповіді:


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

Ця помилка - це фантастичний Кірк. Я ніколи не витрачав достатньо часу, використовуючи геопроцесор, щоб знати про інтерфейси IGeoProcessorEvent. Дякуємо, що вказали на це!
BlinkyBill

ВАШ код працює! ArcObjects мені не подобається.
Джордж Сільва

4

Ви маєте рацію в тому, що немає необхідності в AoInitialize. Як ви виявили, налагодження гео-процесорним об'єктом - це біль у шиї.

Що потрібно зробити для цього, прочитайте повідомлення, попередження та черги помилок після кожного дзвінка, щоб перевірити проблеми. Немає такої удачі, як покладатися на стандартну передачу помилок .NET.

Спробуйте це після кожного виконання дзвінка (зверніть увагу на GetMessageS, а не GetMessage) ...

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

Привіт, Ельдаку! Я відмовився через кілька годин удару в голову, але незабаром спробую це знову, і закінчу подальші дії з цього питання. Чи може це бути проблемою з підписанням збірки під час першого створення?
Джордж Сільва

Привіт Джордж, це, мабуть, не проблема підписання. Якщо у парамах для FeatureToPoint (або будь-який інший інструмент для геообробки) у вас є простий синтаксис / помилка / тип помилки, він вийде з ладу без будь-якого повідомлення, отже, перевірка черги помилок. Я ледве більше не морочуся інструментами для геообробки. Це займає так багато часу, щоб змусити його працювати в більшості випадків, оскільки налагодження - це пекло.
BlinkyBill

Це біль, тому що мені потрібно перевірити центроїд, але я не впевнений, як я міг би пов’язати зміни, які мені потрібно внести, не використовуючи інструмент геообробки. Мені потрібно змінити багатокутний шар, але тестування потрібно провести під його центроїдом. Я використовую просторовий запит для фільтрації своїх результатів, тому я б це втратив.
Джордж Сільва
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.