【问题标题】:Accessing ArcGIS Pro geoprocessing history programmatically以编程方式访问 ArcGIS Pro 地理处理历史
【发布时间】:2021-03-23 00:53:07
【问题描述】:

我正在编写一个 ArcGIS Pro 加载项,并希望以编程方式查看地理处理历史中的项目。这样做的目的是获取使用的参数和工具的列表,以便以后能够更好地理解和重新创建工作流,也许在另一个项目中我们无法直接访问 ArcGIS Pro 中的历史记录。

在对我的代码中的文档、在线帖子和调试断点进行大量搜索之后,我发现其中一些数据确实存在于 HistoryProjectItem 类中,但由于这是一个私有类成员,在一个密封的类似乎我无法访问这些数据。我看到此数据的另一个地方不太理想,用户可以选择将地理处理历史写入位于/AppData/Roaming/ESRI/ArcGISPro/ArcToolbox/History 中的 XML 日志文件。我们的团队被告知这个文件可能是一个问题,因为某些递归操作可能会导致文件膨胀失控,并且在网上阅读后,似乎大多数人都希望禁用此设置以避免大型日志文件占用他们的空间机器。总的来说,日志文件似乎不是一个很好的选择,因为我们担心它会在用户工作时让程序写入大型日志文件,从而降低用户的速度。

我想知道这些数据是否存储在我错过的某个可以从加载项以编程方式访问的地方。在我看来,无论用户设置如何,Project.Items 中的数据总是被存储,但由于类成员可见性,这种方式似乎无法访问。我不熟悉地理数据库和 ArcGIS 文件格式,不知道项目是否总是有一个 .gdb,也许我们可以从那里读取历史记录。

任何关于如何以对用户的干扰最小的方式更好地阅读地理处理历史的见解都是理想的。这些数据在其他地方可用吗?

【问题讨论】:

    标签: gis arcgis


    【解决方案1】:

    这是迄今为止我发现的最接近/最好的解决方案,没有写入大多数人由于文件大小膨胀而避免的历史日志,并且警告说一个操作可能会递归地运行其他操作,从而导致文件大量膨胀。

    https://community.esri.com/t5/arcgis-pro-sdk-questions/can-you-access-geoprocessing-history-programmatically-using-the/m-p/1007833#M5842

    它涉及通过解压缩读取 .arpx 文件(保存时写入)、解析 XML 并将内容过滤为仅 GPHistoryOperations。从那里我能够读取我希望获得的所有参数、环境选项、状态和操作持续时间。

    public static void ListHistory()
    {
        // this can be run in a console app (or within a Pro add-in)
        CIMGISProject project = GetProject(@"D:\tests\topologies\topotest1.aprx");
        foreach(CIMProjectItem hist in project.ProjectItems
                    .Where(itm => itm.ItemType == "GPHistory"))
        {
            Debug.Print($"+++++++++++++++++++++++++++");
            Debug.Print($"{hist.Name}");
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(hist.PropertiesXML);
            //it sure would be nice if Pro SDK had things like MdProcess class in ArcObjects
            //https://desktop.arcgis.com/en/arcobjects/latest/net/webframe.htm#MdProcess.htm
            var json = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.Indented);
            Debug.Print(json);
        }
    }
    static CIMGISProject GetProject(string aprxPath)
    {
        //aprx files are actually zip files
        //https://www.nuget.org/packages/SharpZipLib
        using (var zipFile = new ZipFile(aprxPath))
        {
            var entry = zipFile.GetEntry("GISProject.xml");
            using (var stream = zipFile.GetInputStream(entry))
            {
                using (StreamReader reader = new StreamReader(stream))
                {
                    var xml = reader.ReadToEnd();
                    //deserialize the xml from the aprx file to hydrate a CIMGISProject
                    return ArcGIS.Core.CIM.CIMGISProject.FromXml(xml);
                }
            };
        };
    }
    

    代码由Kirk Kuykendall提供

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2010-09-08
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多