打开地图:
主要用到IMapDocument的Open()方法,此方法用于将数据导入IMapDocument的实例并与AxMapControl(主地图)控件实例相连;然后用IMapDocument的get_Map()方法将图层添加到地图控件中。
保存地图:
主要用到IMapDocument的Open()方法,必须的一步,用于将AxMapControl的实例的DocumentFileName传递给IMapDocument的实例,此处是我出问题严重的地方,幸好在志鸿师兄的指导下完成;此句的缺失会导致调用IMapDocument的get_IsReadOnly()方法时出现“完成该操作所需的数据不可用”的错误,其实是因为IMapDocument的实例没有赋值造成的,用断点调试可以查看。接下来调用IMapDocument的ReplaceContents()方法[AE帮助里是如此解释的:Replace the contents of the map document];下来就是调用IMapDocument的Save()或者SaveAs()方法,用于保存或者另存地图。
地图另存为时还会出现一个问题,就是保存地图时出现同名的话,首次不出错,但第二次时会出现“发生锁定冲突”的错误。这个问题也请教了下师兄,改了多次boolean的值但问题还是会出现,不解。
学习是一个过程,以后有更好的方法再说啦。
代码如下:
//打开地图
IMapDocument pMapDoc;
public void OpenMapDoc()
{
if (axMapControl1.LayerCount != 0) //判断是否保存当前地图
{
if(MessageBox.Show("是否保存当前地图?")==DialogResult .Yes )
SaveMapDoc ();
}
try
{
pMapDoc =new MapDocumentClass();
//打开对话框,选择地图文件
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Title = "打开地图";
openFileDialog1.Filter = "地图文件(*.mxd)|*.mxd";
openFileDialog1.InitialDirectory = Application.StartupPath;
//openFileDialog1.ShowDialog();
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string pFileName = openFileDialog1.FileName;
//将数据导入pMapDoc并与Map(主地图)控件相连
pMapDoc.Open(pFileName, "");
int i;
for (i = 0; i <= pMapDoc.MapCount - 1; i++)
{
axMapControl1.Map = pMapDoc.get_Map(i);//遍历每一个Map
}
axMapControl1.Refresh(); //刷新一下地图
//鹰眼地图更新
AddMapToMap2 addMap = new AddMapToMap2(axMapControl1, axMapControl2);
addMap.AddMxdToAxMapControl2();
axMapControl2.Extent = axMapControl2.FullExtent;
axMapControl2.Refresh();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
//保存地图
public void SaveMapDoc()
{
if (axMapControl1.DocumentFilename != null)
{
if (axMapControl1.CheckMxFile(axMapControl1.DocumentFilename))
{
pMapDoc = new MapDocumentClass(); //实例化
pMapDoc.Open(axMapControl1.DocumentFilename, "");//必须的一步,用于将AxMapControl的实例的DocumentFileName传递给pMapDoc的
if (pMapDoc.get_IsReadOnly(pMapDoc.DocumentFilename)) //判断是否只读
{
MessageBox.Show("地图文档是只读的!");
pMapDoc.Close();
return;
}
pMapDoc.ReplaceContents((IMxdContents)axMapControl1.Map); //重置
pMapDoc.Save(pMapDoc.UsesRelativePaths, true);
pMapDoc.Close();
MessageBox.Show("地图图保存成功!");
}
}
}
//地图另存为
public void SaveMapDocAs()
{
pMapDoc = new MapDocumentClass();
try
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "地图文档(*.mxd)|*.mxd";
saveFileDialog1.Title = "地图另存为";
saveFileDialog1.ShowDialog(); //打开保存对话框
//if (saveFileDialog1.ShowDialog() == DialogResult.OK) //用此句会出现“对COM组件的调用返回错误”
{
string sFileName = saveFileDialog1.FileName;
if (sFileName == "") //|| pMapDoc.get_IsReadOnly(pMapDoc.DocumentFilename)==true )
{
return;
}
if (sFileName == axMapControl1.DocumentFilename)//此处开始用的是pMapDoc.DocumentFilename产生数据不可用的错误
{
SaveMapDoc(); //保存地图
}
else
{
pMapDoc.Open(axMapControl1.DocumentFilename, ""); //此句会出现“对COM组件的调用返回错误”
pMapDoc.ReplaceContents((IMxdContents)axMapControl1.Map); //重置
pMapDoc.SaveAs(sFileName, true , false );//地图另存为 连续二次同名保存时,第二次会出“发生锁定的异常”true和false多种组合都是
pMapDoc.Open(sFileName, ""); //打开地图
MessageBox.Show("地图保存成功!");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}