ArcGIS Engine 开发 (四)打开,保存,另存为地图文档功能(IMapDocument接口)

时间:2024-03-20 15:23:59

ArcGIS Engine 基于C#的开发


界面

在之前的基础在ToolbarControl上添加了winForm自带菜单和工具栏控件MenuStrip然后添加一个文件的菜单项,包涵两个功能,如图:
ArcGIS Engine 开发 (四)打开,保存,另存为地图文档功能(IMapDocument接口)

主要用到的接口:

地图文档对象MxDocument,其主要接口为IMapDocument
命名空间为ESRI.ArcGIS.Carto
IMapDocument接口提供用于读取地图文档文件(* .mxd,* mxt,* .pmf)以及编写和保存对地图文档文件(* .mxd)的更改的属性和方法。

打开地图文档

我这里的打开和另存为的操作都是写在了一个file类里,然后在click事件中调用。

        /// <summary>
        /// 打开地图文档
        /// </summary>
        /// <param name="axMapControl"></param>
        public void loadMapDoc(AxMapControl axMapControl)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Title = "打开地图文档";
            openFileDialog1.Filter = "地图文档(*.mxd)|*.mxd";//设置过滤属性
            openFileDialog1.ShowDialog();
            string filePath = openFileDialog1.FileName;//获取到文件路径
            if (axMapControl.CheckMxFile(filePath))//检查路径是否合法
            {
                axMapControl.LoadMxFile(filePath, 0,Type.Missing);
            }
            else
            {
                MessageBox.Show(filePath+"不是有效的地图文档路径");
                return;
            }
            axMapControl.Refresh();
        }

重点:
载入地图文档的方法:
方法一:MapControl控件的LoadMxFile方法
axMapControl.LoadMxFile(filePath, 0,Type.Missing);
就是上面用到的方法
public virtual void LoadMxFile(string mxPath, object mapNameOrIndex, object password);
传入参数为文件路径和地图名或者索引,还有文件的密码,一般密码为空所有填入Type.Missing。

方法二:地图文档对象的的get_Map方法
axMapControl.Map=mapDocument.get_Map(0);
IMap get_Map(int mapIndex);
将文档对象获取到的地图直接赋值给地图控件的Map属性,就行了


另存为

        //设置文档对象的成员变量
        IMapDocument mapDocument = new MapDocumentClass();

        /// <summary>
        /// 另存为
        /// </summary>
        /// <param name="axMapControl"></param>
        public void saveAsDocument(AxMapControl axMapControl)
        {
            mapDocument.Open(axMapControl.DocumentFilename, "");//将AxMapControl的实例的DocumentFileName传递给MapDocument
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Title = "保存地图文档";
            saveFileDialog1.Filter = "地图文档(*.mxd)|*.mxd";//设置过滤属性
            saveFileDialog1.FileName = axMapControl.DocumentFilename;//给定一个初始保存路为原路径
            if (saveFileDialog1.ShowDialog() != DialogResult.OK)return;//未选择文件return
            string filePath = saveFileDialog1.FileName;//获取到文件路径
            if(filePath=="")return;
            if (filePath == mapDocument.DocumentFilename)//判断路径是否改变,如果没有改变保存当前修改,改变则另存为
            {
                saveDocument();
            }
            else
            {
                mapDocument.SaveAs(filePath,true,true);
            }
        }
        /// <summary>
        /// 保存当前修改
        /// </summary>
        public void saveDocument()
        {
            if (mapDocument.get_IsReadOnly(mapDocument.DocumentFilename) == true)//是否可写
            {
                MessageBox.Show("This map document is read only !");
                return;
            }
            mapDocument.Save(mapDocument.UsesRelativePaths,true);//以相对路径保存,
            MessageBox.Show("Changes saved successfully !");
        }

重点:

通过axMapControl.DocumentFilename将当前地图控件中的地图文档路径,传递给MapDocument对象,
然后再判断获取到的当前底图文档的MapDocument对象的保存路径是否发生改变,

如果未变,则对应操作为mapDocument.Save保存对地图文档的修改,并且save之前要判断地图文档是否可写mapDocument.get_IsReadOnly

void Save(bool bUseRelativePaths = true, bool bCreateThumnbail = true);

如果改变,则对应操作为mapDocument.SaveAs另存为。

void SaveAs(string sDocument, bool bUseRelativePaths = true, bool bCreateThumnbail = true);

其中UsesRelativePathsboll的枚举值表示以相对路径保存,bCreateThumnbailtrue表示生成缩略图。