.NET ile ArcObjects coğrafi işleminden kaçınıyor mu?


14

ArcToolbox'ta kullanabileceğimiz bazı güzel özellikler var, ancak bazı nedenlerden dolayı bu düzgün çalışmıyor. Bana bir hata bile atmıyor.

Benim yazılım ArcMap içinde çalışıyor, bu yüzden tekrar AoInitialize gerek, 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");
        }

Bu burada geçirdiğim bir kod örneğidir. DataManagement araçları derlemesini oluşturdum, ancak imzalayacak dosyayı bulamadım.

Bu kod bana bir hata veriyor. imzalama yüzünden mi?

Diğer yolu da denedim, IVariantArray kullanarak ve araç adından arama yapmadan, başarı olmadan. Sadece ben mi yoksa ...?

Biri bana "daha güzel" bir çözümü gösterebilir mi? Zaten gerçekten çoğaltmak istemiyorum ArcToolbox yerleşik birkaç işlem çalıştırmak gerekiyor.


Sorunuzda daha sonra bahsettiğiniz hata nedir?
Dandy

Merhaba Dandy. Hata atmaz, sadece başarısız olur.
George Silva

Yanıtlar:


14

Aşağıdaki kodda, multi2single işlevi 10.0'da benim için çalışıyor. ArcInfo lisansım olmadığından Feature2Point'i test edemedim, değil mi?

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 bu çıktı olsun:

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

Bu hata yönetimi harika Kirk. IGeoProcessorEvent arabirimlerini bilmek için coğrafi işlemciyi kullanarak yeterince zaman harcamadım. Gösterdiğiniz için teşekkürler!
BlinkyBill

Kodunuz çalışıyor! ArcObjects benden hoşlanmıyor.
George Silva

4

AoInitialize'a gerek olmadığından haklısınız. Bildiğiniz gibi, coğrafi işlemci nesnesiyle hata ayıklama boyunda bir ağrıdır.

Bunu yapmanız için, her aramadan sonra sorunları kontrol etmek için mesaj, uyarı ve hata kuyruklarını okuyun. Standart .NET hata teslimine güvenmek gibi bir şans yoktur.

Her yürütme çağrısından sonra bunu deneyin (GetMessage değil GetMessageS'a dikkat edin) ...

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

Merhaba eldac! Birkaç saatlik kafa vuruşundan sonra vazgeçtim, ama yakında tekrar deneyeceğim ve sorudaki takipleri bitireceğim. Bu, ilk oluşturduğunuzda derlemeyi imzalamakla ilgili bir sorun olabilir mi?
George Silva

Merhaba George, bu muhtemelen bir imzalama sorunu değil. FeatureToPoint (veya başka bir coğrafi işleme aracı) parametrelerinde basit bir sözdizimi / yol / tür hatası varsa, herhangi bir bildirim yapılmadan başarısız olur, bu nedenle hata kuyruğunun denetimi yapılır. Artık geoprocessing araçlarıyla pek ilgilenmiyorum. Çoğu durumda, hata ayıklama cehennem olduğu için çalışması çok uzun sürer.
BlinkyBill

Bu bir acıdır, çünkü bir sentroidi test etmem gerekiyor, ancak bir coğrafi işleme aracı kullanmadan yapmam gereken değişiklikleri nasıl bağlayabileceğimden emin değilim. Bir çokgen katmanı değiştirmem gerekiyor, ancak testin centroid altında yapılması gerekiyor. Sonuçlarımı filtrelemek için uzamsal bir sorgu kullanıyorum, bu yüzden bunu kaybederdim.
George Silva
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.