liutingxiang的个人博客分享 http://blog.sciencenet.cn/u/liutingxiang

博文

ArcGIS Engine二次开发学习(1)新建、打开和保存地图文档

已有 8897 次阅读 2018-3-28 14:25 |个人分类:地理信息系统二次开发|系统分类:教学心得

设计菜单,分别实现 新建、打开和保存地图文档(.Mxd)的功能。


步骤:(1)定义一个NewMapDoc()方法;

          (2)定义一个SaveMapDoc()方法;

          (3)定义一个SaveMapDocAs()方法;

          (4)定义一个OpenMapDoc()方法;

          (5)新建一个菜单“新建地图文档”,调用NewMapDoc()。新建一个菜单“保存地图文档”,如果         当前是已经打开的Mxd,则调用SaveMapDoc();如果当前打开的不是Mxd而只是一些图层,则调用SaveMapDocAs()。新建一个菜单“地图文档另存为”,调用SaveMapDocAs()。

         (6)新建一个菜单“打开地图文档”,根据不同的情况调用上述方法:

                 如果地图中没有文件,则直接调用OpenMapDoc()方法。

                 如果地图中有文件,可能是打开的Mxd,也可能不是Mxd而只是一些图层;询问是否保存,如果选择保存,则之前打开过Mxd的情况下调用SaveMapDoc()方法,之前打开的不是Mxd而只是图层的情况下调用SaveMapDocAs()方法,然后清除掉当前图层,调用OpenMapDoc()方法;

                如果选择不保存,则清除掉当前图层,调用OpenMapDoc()方法。


可能出现的问题:

(1)新建的地图文档首先需要保存到一个位置,如D://engine//test.mxd,但后续操作修改了这个mxd后,无法通过SaveMapDoc()方法保存上

原因是调用SaveMapDoc()方法时,axMapControl1.DocumentFilename中未存储之前NewMapDoc()或OpenMapDoc()时打开的mxd(D://engine//test.mxd)。


解决办法:NewMapDoc()或OpenMapDoc()方法需要返回axMapControl1.DocumentFilename值。见public string NewMapDoc().


(2)保存地图文档时,可能会出现 发生锁定冲突。(异常来自 HRESULT:0x80030021 (STG_E_LOCKVIOLATION)”。

原因是之前打开的mxd未关闭


解决办法:NewMapDoc()和OpenMapDoc()中需要添加一句“pMapDocument.Close();”



代码如下:

public string NewMapDoc()
   {
      SaveFileDialog SaveFileDlg = new SaveFileDialog();
      SaveFileDlg.Title = "输入需要新建地图文档的名称";
      SaveFileDlg.Filter = "地图文件(*.mxd)|*.mxd";
      SaveFileDlg.ShowDialog();
      string strDocFileN = string.Empty;
      strDocFileN = SaveFileDlg.FileName;
      if (strDocFileN == string.Empty)
        return null;
      pMapDocument = new MapDocumentClass();
      pMapDocument.New(strDocFileN);
      pMapDocument.Open(strDocFileN, "");
      axMapControl1.Map = pMapDocument.get_Map(0);
      axMapControl1.DocumentFilename =pMapDocument.DocumentFilename;
      pMapDocument.Close();
      return axMapControl1.DocumentFilename;
    }
public void SaveMapDoc()
   {
      if (axMapControl1.DocumentFilename != null)
      {
        if (axMapControl1.CheckMxFile(axMapControl1.DocumentFilename))
        {
           pMapDocument = new MapDocumentClass(); 
           pMapDocument.Open(axMapControl1.DocumentFilename, "");
           if (pMapDocument.get_IsReadOnly(pMapDocument.DocumentFilename))
           {
               MessageBox.Show("地图文档是只读的!");
               pMapDocument.Close();
               return;
           }
           pMapDocument.ReplaceContents((IMxdContents)axMapControl1.Map); 
           pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
           pMapDocument.Close();
           MessageBox.Show("地图保存成功!");
         }
       }
      else
      {
         SaveMapDocAs();;
      }
    }
public void SaveMapDocAs()
{
    SaveFileDialog SaveFileDlg = new SaveFileDialog();
    SaveFileDlg.Filter = "地图文档文件(*.mxd)|*.mxd";
    SaveFileDlg.Title = "选择保存路径";
    SaveFileDlg.OverwritePrompt = true;
    SaveFileDlg.RestoreDirectory = true;
    if (SaveFileDlg.ShowDialog() == DialogResult.OK)
    {
        string sMxdFileName = SaveFileDlg.FileName;
        pMapDocument = new MapDocumentClass();
        pMapDocument.New(sMxdFileName);
        pMapDocument.ReplaceContents((IMxdContents)axMapControl1.Map);
        pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
        pMapDocument.Close();
        MessageBox.Show("保存完毕!");
    }
    else
    {
        return;
    }
}
public string OpenMapDoc()
{
    //下面这几句是为了在“打开地图ToolStripMenuItem_Click”中少添加代码而放在这里的。
    axMapControl1.Map.ClearLayers();
    axMapControl1.Refresh();
    axTOCControl1.Refresh();

    OpenFileDialog OpenFileDlg = new OpenFileDialog();
    OpenFileDlg.Title = "选择需要加载的地图文档文件";
    OpenFileDlg.Filter = "地图文档文件(*.mxd)|*.mxd";
    OpenFileDlg.ShowDialog();
    string strDocFileN = OpenFileDlg.FileName;
    if (strDocFileN == string.Empty)
        return null;
    //将数据加载入pMapDocument并与map控件联系起来
    pMapDocument = new MapDocumentClass();
    pMapDocument.Open(strDocFileN);
    for (int i = 0; i < pMapDocument.MapCount; i++)
    {
        axMapControl1.Map = pMapDocument.get_Map(i);        
    }
    axMapControl1.DocumentFilename = pMapDocument.DocumentFilename;
    pMapDocument.Close();
    axMapControl1.Extent = axMapControl1.FullExtent;    
    axMapControl1.Refresh();    
    return axMapControl1.DocumentFilename;
}


在“打开地图文档”的菜单中添加如下代码:

private void 打开地图ToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (axMapControl1.LayerCount == 0)//如果当前地图中没有图层,就直接打开新mxd
    {
            //没有图层也可以先清除图层吧
        OpenMapDoc();
    }
    else //当前地图中有图层的情况。清除图层的代码放在OpenMapDoc()了,
            否则每次都得把清除的代码放上。
    {
        if (MessageBox.Show("是否保存当前地图?", "确认信息", 
             MessageBoxButtons.OKCancel) == DialogResult.OK)//要保存当前地图
        {
          if (axMapControl1.DocumentFilename == null)
          {
             SaveMapDocAs();
             OpenMapDoc();
          }
          else
          {
            if (axMapControl1.CheckMxFile(axMapControl1.DocumentFilename))//之前打开mxd
            {
               pMapDocument = new MapDocumentClass();
               if (pMapDocument.get_IsReadOnly(axMapControl1.DocumentFilename))
               {
                 MessageBox.Show("本地图文档是只读,不能保存");
                 return;
               }
               else//之前打开的mxd不是只读,可以保存,保存后清除图层,
               {
                 SaveMapDoc();
                                  //再调用打开地图文档方法
                 OpenMapDoc();
               }
             }
 
           }

        }
        else //当前有图层,但是不保存,就清除掉,然后打开新的mxd
        {
            OpenMapDoc();
        }
 
    }
    
}




https://blog.sciencenet.cn/blog-3373120-1106103.html


下一篇:ArcGIS Engine二次开发学习(2)鼠标与控件互操作
收藏 IP: 121.69.12.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-9-19 07:05

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部