• 反编译示例:mxd检查


    gisoralce在博客园发布了一个mxd检查工具,主要功能是将arcgis的mxd数据源有效性(含矢量和影像)检查、检查是否为相对路径,自动保存为相对路径。

    这是一个未加壳的.NET程序,正好拿来练习,但无意侵犯gisoralce,望见谅!

    首先使用dotPeek直接打开Mxdcheck.exe

    右键导出为VS项目文件:

    由于VS版本的问题(测试使用VS2010),需要进行自动转换

    问题一:警告:设计器无法处理AutoScaleMode.Font

    打开主界面,出现警告"设计器无法处理第 248 行的代码:this.AutoScaleMode = AutoScaleMode.Font;方法"InitializeComponent"内的代码由设计器生成,不应手动修改。请移除任何更改,然后尝试重新打开设计器。

    处理方法是,在前面添加完整引用,必须只能这样,不知道为什么。

    问题二:变量"groupBox1"未声明或从未赋值

    再打开界面,又警告:变量"groupBox1"未声明或从未赋值。

    而转到定义发现定义过,不知道为什么!没办法报着尝试心理,我把groupBox1全部替换成groupBox3(因为已存在groupBox2),居然还可以了,没有任何警告了!

    终于可以看到界面了……

    问题三:ArcGIS product not specified

    调用运行,出现了老问题,未进行Runtime绑定

    在代码主函数中加一句:

    ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

    问题四:80040154

    这是因为测试电脑是64位系统,需要将项目属性中,目标平台改为x86

    问题五:所有都找不到数据源

    终于可以正常运行和检查了。这个界面还是有点不美观,我自己写了一个界面,但运行检查所有的图层都找不到数据源!!明明是一样的代码,真是比较诡异!

    原来是忘记了最重要的一步,没有进行权限许可:

    IAoInitialize m_AoInitialize = new AoInitializeClass();

    esriLicenseStatus licenseStatus = esriLicenseStatus.esriLicenseUnavailable;

    licenseStatus = m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);

    终于搞定了。

    核心函数:

            private void Checkonemxd(string mxdFile)
            {
                //1.打开文档
                IMapDocument document = new MapDocumentClass();
                document.Open(mxdFile, "");
                
                //2.检查路径
                if (this.ckbSave.Checked && !document.UsesRelativePaths)
                {
                    this.rtbLog.Text = this.rtbLog.Text + "相对路径:" + mxdFile + "
    ";
                    document.Save(true, true);
                }
    
                //3.检查数据源
                int num = document.MapCount;
                for (int i = 0; i < num; i++)
                {
                    IEnumLayer layers = document.get_Map(i).get_Layers(null, true);
                    layers.Reset();
                    ILayer layer;
                    while ((layer = layers.Next()) != null)
                    {
                        //string text;
                        if (layer is IFeatureLayer)
                        {
                            IFeatureLayer pFeatureLayer = layer as IFeatureLayer;
                            if (pFeatureLayer.FeatureClass == null)
                            {
                                RichTextBoxEx expr_C8 = this.rtbLog;
                                string text = expr_C8.Text;
                                expr_C8.Text = string.Concat(new string[]
                                {
                                    text,"文件:",mxdFile,"的图层:", layer.Name,",找不到矢量数据源
    "
                                });
                            }
                        }
                        else if (layer is IRasterLayer)
                        {
                            IRasterLayer pFeatureLayer2 = layer as IRasterLayer;
                            if (pFeatureLayer2.Raster == null)
                            {
                                RichTextBoxEx expr_154 = this.rtbLog;
                                string text = expr_154.Text;
                                expr_154.Text = string.Concat(new string[]
                                {
                                    text,"文件:",mxdFile,"的图层:",layer.Name,",找不到影像数据源
    "
                                });
                                text = this.rtbLog.Text;
                                this.rtbLog.Text = text + "文件:" + mxdFile + "的图层:" + layer.Name + ",找不到影像数据源
    ";
                            }
                        }
                    }
                }
    
                //4.关闭文档
                document.Close();
                document = null;
            }
    

      

  • 相关阅读:
    ubuntu18.04安装g2o
    akka学习
    spark学习记录-2
    spark学习记录-1
    c++ string需要注意的地方
    clion server激活地址
    【转】c++面试基础
    c++反射概念-简单介绍
    死锁的理解
    c++ 反射类型
  • 原文地址:https://www.cnblogs.com/liweis/p/4485384.html
Copyright © 2020-2023  润新知