最近正好在做AE的项目的开发,做这些基本功能的时候发现网上的代码只有简单的实现过程,并没有一个完整的逻辑。所以自己的重新写了这个逻辑并将逻辑过程与实现代码贴出来,以供有需要的小伙伴参考。
以上是整个地图文档操作的代码的逻辑过程 (主要是个if判断的过程,如果是打开的已有的mxd,就保存到该工作空间;如果是加载的shp文件,就存为新的mxd。)
新建地图文档
public void NewMxd(ESRI.ArcGIS.Controls.AxMapControl basicControl)
{
try
{
if (basicControl.LayerCount != 0)
{
MessageBox.Show("是否保存当前操作?");
string sMxdFileName = basicControl.DocumentFilename;
IMapDocument pMapDocument = new MapDocumentClass();
if (sMxdFileName != null && basicControl.CheckMxFile(sMxdFileName))
{
if (pMapDocument.get_IsReadOnly(sMxdFileName))
{
MessageBox.Show("本地图文档是只读的,不能保存!");
pMapDocument.Close();
return;
}
}
else
{
SaveFileDialog pSavedlg = new SaveFileDialog();
pSavedlg.Title = "请选择保存路径";
pSavedlg.OverwritePrompt = true;
pSavedlg.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
pSavedlg.RestoreDirectory = true;
if (pSavedlg.ShowDialog() == DialogResult.OK)
{
sMxdFileName = pSavedlg.FileName;
}
else
{
return;
}
}
pMapDocument.New(sMxdFileName);
pMapDocument.ReplaceContents(basicControl.Map as IMxdContents);
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
pMapDocument.Close();
MessageBox.Show("保存地图文档成功!");
}
basicControl.ClearLayers();
basicControl.Update();
basicControl.ActiveView.Refresh();
MessageBox.Show("新建地图文档成功");
}
catch (Exception ex)
{
MessageBox.Show("新建地图文档失败" + ex.Message);
}
}
打开地图文档
public void OpenMxd(ESRI.ArcGIS.Controls.AxMapControl basicControl )
{
try
{
if (basicControl.LayerCount != 0)
{
MessageBox.Show("是否保存当前操作?");
string sMxdFileName = basicControl.DocumentFilename;
//IMapDocument pMapDocument = new MapDocumentClass();
if (sMxdFileName != null && basicControl.CheckMxFile(sMxdFileName))
{
if (pMapDocument.get_IsReadOnly(sMxdFileName))
{
MessageBox.Show("本地图文档是只读的,不能保存!");
pMapDocument.Close();
return;
}
}
else
{
SaveFileDialog pSavedlg = new SaveFileDialog();
pSavedlg.Title = "请选择保存路径";
pSavedlg.OverwritePrompt = true;
pSavedlg.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
pSavedlg.RestoreDirectory = true;
if (pSavedlg.ShowDialog() == DialogResult.OK)
{
sMxdFileName = pSavedlg.FileName;
}
else
{
return;
}
}
pMapDocument.New(sMxdFileName);
pMapDocument.ReplaceContents(basicControl.Map as IMxdContents);
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
pMapDocument.Close();
MessageBox.Show("保存地图文档成功!");
}
//打开地图文档对话框,读取数据源类型
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|All Files (*.*)|*.*||";
pOpenFileDialog.Title = "打开地图文档";
pOpenFileDialog.RestoreDirectory = true;
if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
{
if (System.IO.Path.GetExtension(pOpenFileDialog.FileName) == ".mxd")
{
if (basicControl.CheckMxFile(pOpenFileDialog.FileName)) //检查地图文档有效性
{
basicControl.LoadMxFile(pOpenFileDialog.FileName);
}
else
{
MessageBox.Show(pOpenFileDialog.FileName + "是无效的地图文档!", "信息提示");
return;
}
}
}
else
{
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex + "在XXX位置", "信息提示");
}
}
保存地图文档
public void SaveMxd(ESRI.ArcGIS.Controls.AxMapControl basicControl)
{
try
{
if (basicControl.LayerCount == 0)
{
MessageBox.Show("无可存地图文档!");
return;
}
string sMxdFileName = basicControl.DocumentFilename;
string fvg = sMxdFileName;
if(sMxdFileName == null)
{
//string sMxdFileName = basicControl.DocumentFilename;
IMapDocument pMapDocument = new MapDocumentClass();
if (sMxdFileName != null && basicControl.CheckMxFile(sMxdFileName))
{
if (pMapDocument.get_IsReadOnly(sMxdFileName))
MessageBox.Show("本地图文档是只读的,不能保存!");
pMapDocument.Close();
return;
}
else
{
SaveFileDialog pSavedlg = new SaveFileDialog();
pSavedlg.Title = "请选择保存路径";
pSavedlg.OverwritePrompt = true;
pSavedlg.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
pSavedlg.RestoreDirectory = true;
if (pSavedlg.ShowDialog() == DialogResult.OK)
{
sMxdFileName = pSavedlg.FileName;
}
else
{
return;
}
}
pMapDocument.New(sMxdFileName);
pMapDocument.ReplaceContents(basicControl.Map as IMxdContents);
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
pMapDocument.Close();
MessageBox.Show("另存为地图文档成功!");
}
else
{
IMxdContents pMxdC;
pMxdC = basicControl.Map as IMxdContents;
IMapDocument pMapDocument = new MapDocumentClass();
pMapDocument.Open(basicControl.DocumentFilename, "");
IActiveView pActiveView = basicControl.Map as IActiveView;
pMapDocument.ReplaceContents(pMxdC);
if (pMapDocument == null) return;
//检查地图文档是否是只读
if (pMapDocument.get_IsReadOnly(pMapDocument.DocumentFilename) == true)
{
MessageBox.Show("本地图文档是只读的,不能保存!");
return;
}
//根据相对的路径保存地图文档
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
MessageBox.Show("地图文档保存成功!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
另存为地图文档
public void OtherSave(ESRI.ArcGIS.Controls.AxMapControl basicControl)
{
try
{
string sMxdFileName = basicControl.DocumentFilename;
IMapDocument pMapDocument = new MapDocumentClass();
if (sMxdFileName != null && basicControl.CheckMxFile(sMxdFileName))
{
if (pMapDocument.get_IsReadOnly(sMxdFileName))
{
MessageBox.Show("本地图文档是只读的,不能保存!");
pMapDocument.Close();
return;
}
else
{
SaveFileDialog pSavedlg = new SaveFileDialog();
pSavedlg.Title = "请选择保存路径";
pSavedlg.OverwritePrompt = true;
pSavedlg.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
pSavedlg.RestoreDirectory = true;
if (pSavedlg.ShowDialog() == DialogResult.OK)
{
sMxdFileName = pSavedlg.FileName;
}
else
{
return;
}
}
}
pMapDocument.New(sMxdFileName);
pMapDocument.ReplaceContents(basicControl.Map as IMxdContents);
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
pMapDocument.Close();
MessageBox.Show("另存为地图文档成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}